sidekiq-health 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b81bb187af9420b1b278749905046150a361654f
4
- data.tar.gz: 443e051e0878485318ff55fbe74407bfad37140f
3
+ metadata.gz: cb882e9c7e4ebb21e3c1e083a49827617d23bc5c
4
+ data.tar.gz: a8ed3ec3aa408d19591842719f2c9f2fe73c7af0
5
5
  SHA512:
6
- metadata.gz: b960ef54e38a0e2ca11672028d1cf6f1419c20caeac60b461890ad3e1d2155b62df48af8a68b25793dc2ff2dddad9ba61df603fbd0b20c6922fd435b2af99ad4
7
- data.tar.gz: 112593760a8daeb7e2cd5bff5481acea4ff6692ce6050dd52df364237538716489b559a844a97ae803f8c71233949befd7cbb4cd20fec2a2b956fd56228aadb7
6
+ metadata.gz: 3a681a233949f4e990ba81a6c7fd234f29b12ea77e2c4edb76c89c07f3970b4bd89a9b91b3f9dd3d36a7147aaba3f267c42c55eb44496d14746e3036aad01bab
7
+ data.tar.gz: 4c89c308208b32eaa9469390e6f2688637ad3747fb9488d62368b054dd2473a571ed9f0d326e39ae98231888e983c93f5f21214de93c6238044b425f3c0ec407
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /sidekiq*.gem
@@ -0,0 +1,3 @@
1
+ ### 0.1.0 - 2015-09-25
2
+
3
+ * rake task for getting queue health report
data/README.md CHANGED
@@ -53,3 +53,6 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/tomdev
53
53
 
54
54
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
55
55
 
56
+ ## Credits
57
+
58
+ I was inspired by Alex Stoll from HE:labs http://helabs.com/blog/2015/02/19/a-simple-way-to-monitor-sidekiq-queue-on-rails-and-sinatra/
@@ -2,7 +2,72 @@ require 'sidekiq/api'
2
2
 
3
3
  module Sidekiq
4
4
  module Health
5
+ MAXIMUM_HEALTHY_QUEUE_SIZE = 50
6
+ MAXIMUM_HEALTHY_DEAD_SET_LAST_HOUR_SIZE = 5
7
+
5
8
  class QueueStatus
9
+ class Status
10
+ def initialize(queue_name, dead_set)
11
+ @queue_name = queue_name
12
+ @dead_set = dead_set
13
+ end
14
+
15
+ attr_reader :queue_name
16
+
17
+ def total_number_of_jobs
18
+ sidekiq_queue.size
19
+ end
20
+
21
+ def total_number_of_failed_jobs
22
+ dead_set.size
23
+ end
24
+
25
+ def total_number_of_failed_jobs_since(timestamp)
26
+ dead_set.select { |item| item['failed_at'] > timestamp.to_r }.size
27
+ end
28
+
29
+ def number_of_scheduled_jobs_per_class_name
30
+ @number_of_scheduled_jobs_per_class_name ||= sidekiq_queue.inject({}) do |job_pool, scheduled_job|
31
+ wrapped_class = scheduled_job['wrapped']
32
+ job_pool[wrapped_class] = job_pool.fetch(wrapped_class, 0) + 1
33
+ job_pool
34
+ end
35
+ .sort_by { |job_name, count| count }
36
+ .to_h
37
+ end
38
+
39
+ def health_as_human_readable_string
40
+ health = []
41
+
42
+ if total_number_of_jobs > Sidekiq::Health::MAXIMUM_HEALTHY_QUEUE_SIZE
43
+ more_than_allowed = total_number_of_jobs - Sidekiq::Health::MAXIMUM_HEALTHY_QUEUE_SIZE
44
+ health << "There are a total of #{total_number_of_jobs} scheduled jobs, "\
45
+ "which is #{more_than_allowed} more than healthy."
46
+ end
47
+
48
+ dead_in_last_hour = total_number_of_failed_jobs_since(1.hour.ago)
49
+ if dead_in_last_hour > Sidekiq::Health::MAXIMUM_HEALTHY_DEAD_SET_LAST_HOUR_SIZE
50
+ more_than_allowed = dead_in_last_hour - Sidekiq::Health::MAXIMUM_HEALTHY_DEAD_SET_LAST_HOUR_SIZE
51
+ health << "There are a total of #{dead_in_last_hour} failed jobs, "\
52
+ "which is #{more_than_allowed} more than healthy."
53
+ end
54
+
55
+ if health.empty?
56
+ health << "Everything looks good."
57
+ end
58
+
59
+ health.join(" ")
60
+ end
61
+
62
+ private
63
+
64
+ attr_reader :dead_set
65
+
66
+ def sidekiq_queue
67
+ @sidekiq_queue ||= Sidekiq::Queue.new queue_name
68
+ end
69
+ end
70
+
6
71
  def print
7
72
  output = ""
8
73
 
@@ -14,6 +79,14 @@ module Sidekiq
14
79
  output
15
80
  end
16
81
 
82
+ def statuses
83
+ queue_names.map do |name|
84
+ Status.new \
85
+ name,
86
+ dead_set_for(queue_name: name)
87
+ end
88
+ end
89
+
17
90
  private
18
91
 
19
92
  def queue_size(name)
@@ -23,11 +96,20 @@ module Sidekiq
23
96
  def queue_names
24
97
  Sidekiq::Health::QueueNames.new.get
25
98
  end
99
+
100
+ def dead_set_for(queue_name:)
101
+ all_dead_jobs.fetch(queue_name, [])
102
+ end
103
+
104
+ def all_dead_jobs
105
+ @all_dead_jobs ||= Sidekiq::DeadSet.new.inject({}) do |all_jobs, item|
106
+ all_jobs[item.queue] = all_jobs.fetch(item.queue, []) + [item]
107
+ all_jobs
108
+ end
109
+ end
26
110
  end
27
111
 
28
112
  class QueueHealthFormatter
29
- QUEUE_SIZE_WARNING_THRESHOLD = 50
30
-
31
113
  attr_reader :name, :size
32
114
 
33
115
  def initialize(name, size)
@@ -36,13 +118,17 @@ module Sidekiq
36
118
  end
37
119
 
38
120
  def to_s
39
- if size < QUEUE_SIZE_WARNING_THRESHOLD
121
+ if healthy?
40
122
  "OK. #{queue_information}"
41
123
  else
42
124
  "WARNING: TOO MANY JOBS ENQUEUED. #{queue_information}"
43
125
  end
44
126
  end
45
127
 
128
+ def healthy?
129
+ size < Sidekiq::Health::MAXIMUM_HEALTHY_QUEUE_SIZE
130
+ end
131
+
46
132
  private
47
133
 
48
134
  def queue_information
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module Health
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-health
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom de Vries
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-09-25 00:00:00.000000000 Z
11
+ date: 2016-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -92,6 +92,7 @@ files:
92
92
  - ".gitignore"
93
93
  - ".rspec"
94
94
  - ".travis.yml"
95
+ - CHANGELOG.md
95
96
  - Gemfile
96
97
  - LICENSE.txt
97
98
  - README.md
@@ -126,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
127
  version: '0'
127
128
  requirements: []
128
129
  rubyforge_project:
129
- rubygems_version: 2.2.5
130
+ rubygems_version: 2.6.6
130
131
  signing_key:
131
132
  specification_version: 4
132
133
  summary: Monitor the size of your Sidekiq queues.