sidekiq-health 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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.