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 +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +3 -0
- data/README.md +3 -0
- data/lib/sidekiq/health/queue_status.rb +89 -3
- data/lib/sidekiq/health/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb882e9c7e4ebb21e3c1e083a49827617d23bc5c
|
4
|
+
data.tar.gz: a8ed3ec3aa408d19591842719f2c9f2fe73c7af0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a681a233949f4e990ba81a6c7fd234f29b12ea77e2c4edb76c89c07f3970b4bd89a9b91b3f9dd3d36a7147aaba3f267c42c55eb44496d14746e3036aad01bab
|
7
|
+
data.tar.gz: 4c89c308208b32eaa9469390e6f2688637ad3747fb9488d62368b054dd2473a571ed9f0d326e39ae98231888e983c93f5f21214de93c6238044b425f3c0ec407
|
data/.gitignore
CHANGED
data/CHANGELOG.md
ADDED
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
|
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
|
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.
|
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:
|
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.
|
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.
|