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 +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.
|