sidekiq-monitoring 0.5.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -0
- data/VERSION +1 -1
- data/lib/sidekiq-monitoring.rb +96 -23
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff9875b4a8c594e350b7fa0011370e3e6f2b85f5
|
4
|
+
data.tar.gz: 26b491d59ff14b95e8cc7d990bc3708cfc96c445
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d8dd80f523151bc5dad5c48a2316e4cb70e8523dcc91ffbc9e55607af70792af081bc36afdf136c327ca49ab176a9b4e46e8103fd9757e326e025bc95801943
|
7
|
+
data.tar.gz: 63003606a81842ec0d2e8d6780f387dd3cfc0cc6a75901888721d8a2d8eb859fd4b709bf7db4f9afaa7fe3bb180cd3a7ee411a391643ddf315b283469e60c2c4
|
data/README.md
CHANGED
@@ -28,6 +28,12 @@ SidekiqMonitoring.thresholds = {
|
|
28
28
|
'queue_name_2' => [warning, critical],
|
29
29
|
'queue_name_3' => [warning, critical]
|
30
30
|
}
|
31
|
+
|
32
|
+
SidekiqMonitoring.latency_thresholds = {
|
33
|
+
'queue_name_1' => [warning, critical],
|
34
|
+
'queue_name_2' => [warning, critical],
|
35
|
+
'queue_name_3' => [warning, critical]
|
36
|
+
}
|
31
37
|
```
|
32
38
|
|
33
39
|
Or if you want to override the default threshold in case of the queue name
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0
|
data/lib/sidekiq-monitoring.rb
CHANGED
@@ -3,20 +3,24 @@ require 'multi_json'
|
|
3
3
|
|
4
4
|
class SidekiqMonitoring < Sinatra::Base
|
5
5
|
|
6
|
-
# Set
|
6
|
+
# Set your down thresholds configuration
|
7
7
|
# {'default' => [ 1_000, 2_000 ], 'low' => [ 10_000, 20_000 ] }
|
8
8
|
def self.thresholds=(thresholds)
|
9
9
|
@@thresholds = thresholds
|
10
10
|
end
|
11
11
|
@@thresholds = {}
|
12
12
|
|
13
|
+
def self.latency_thresholds=(latency_thresholds)
|
14
|
+
@@latency_thresholds = latency_thresholds
|
15
|
+
end
|
16
|
+
@@latency_thresholds = {}
|
17
|
+
|
13
18
|
get '/sidekiq_queues' do
|
14
19
|
content_type :json
|
15
20
|
MultiJson.dump SidekiqMonitoring::Global.new(@@thresholds)
|
16
21
|
end
|
17
22
|
|
18
|
-
|
19
|
-
|
23
|
+
module Monitorable
|
20
24
|
ALERT_STATUS = {
|
21
25
|
'OK' => 0,
|
22
26
|
'WARNING' => 1,
|
@@ -24,34 +28,83 @@ class SidekiqMonitoring < Sinatra::Base
|
|
24
28
|
'UNKNOWN' => 3
|
25
29
|
}
|
26
30
|
|
27
|
-
|
31
|
+
attr_accessor :warning_threshold, :critical_threshold, :status
|
32
|
+
|
33
|
+
def <=>(other)
|
34
|
+
ALERT_STATUS[status] <=> ALERT_STATUS[other.status]
|
35
|
+
end
|
28
36
|
|
29
|
-
|
37
|
+
end
|
30
38
|
|
31
|
-
|
39
|
+
class Worker
|
40
|
+
include Monitorable
|
41
|
+
|
42
|
+
DEFAULT_THRESHOLD = [ 60, 120 ]
|
43
|
+
|
44
|
+
attr_accessor :process_id, :jid, :run_at, :queue, :worker_class
|
45
|
+
|
46
|
+
def initialize(process_id, jid, run_at, queue, worker_class, thresholds = nil)
|
47
|
+
@process_id = process_id
|
48
|
+
@jid = jid
|
49
|
+
@run_at = run_at
|
50
|
+
@queue = queue
|
51
|
+
@worker_class = worker_class
|
52
|
+
@warning_threshold, @critical_threshold = thresholds ? thresholds : DEFAULT_THRESHOLD
|
53
|
+
end
|
54
|
+
|
55
|
+
def as_json
|
32
56
|
{
|
33
|
-
'
|
34
|
-
'
|
35
|
-
'
|
36
|
-
'
|
37
|
-
'status' => status
|
57
|
+
'queue' => queue,
|
58
|
+
'jid' => jid,
|
59
|
+
'worker_class' => worker_class,
|
60
|
+
'elapsed_time' => elapsed_time,
|
61
|
+
'status' => status,
|
62
|
+
'process_id' => process_id
|
38
63
|
}
|
39
64
|
end
|
40
65
|
|
41
|
-
def
|
66
|
+
def elapsed_time
|
67
|
+
@elapsed_time ||= Time.now.to_i - run_at
|
68
|
+
end
|
69
|
+
|
70
|
+
def status
|
71
|
+
return 'CRITICAL' if elapsed_time >= critical_threshold
|
72
|
+
return 'WARNING' if elapsed_time >= warning_threshold
|
73
|
+
'OK'
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
class Queue
|
79
|
+
include Monitorable
|
80
|
+
|
81
|
+
DEFAULT_THRESHOLD = [ 1_000, 2_000 ]
|
82
|
+
DEFAULT_LATENCY_THRESHOLD = [ 300, 900 ]
|
83
|
+
|
84
|
+
attr_accessor :name, :size, :latency, :warning_latency_threshold, :critical_latency_threshold
|
85
|
+
|
86
|
+
def initialize(name, size, latency, thresholds = nil, latency_thresholds = nil)
|
42
87
|
@name = name
|
43
88
|
@size = size
|
89
|
+
@latency = latency
|
44
90
|
@warning_threshold, @critical_threshold = (thresholds ? thresholds : DEFAULT_THRESHOLD)
|
91
|
+
@warning_latency_threshold, @critical_latency_threshold = (latency_thresholds ? latency_thresholds : DEFAULT_LATENCY_THRESHOLD)
|
45
92
|
@status = monitoring_status
|
46
93
|
end
|
47
94
|
|
48
|
-
def
|
49
|
-
|
95
|
+
def as_json
|
96
|
+
{
|
97
|
+
'name' => name,
|
98
|
+
'size' => size,
|
99
|
+
'warning_threshold' => warning_threshold,
|
100
|
+
'critical_threshold' => critical_threshold,
|
101
|
+
'status' => status
|
102
|
+
}
|
50
103
|
end
|
51
104
|
|
52
105
|
def monitoring_status
|
53
|
-
return 'CRITICAL' if size >= critical_threshold
|
54
|
-
return 'WARNING' if size >= warning_threshold
|
106
|
+
return 'CRITICAL' if size >= critical_threshold || latency >= critical_latency_threshold
|
107
|
+
return 'WARNING' if size >= warning_threshold || latency >= warning_latency_threshold
|
55
108
|
'OK'
|
56
109
|
end
|
57
110
|
|
@@ -59,33 +112,53 @@ class SidekiqMonitoring < Sinatra::Base
|
|
59
112
|
|
60
113
|
class Global
|
61
114
|
|
62
|
-
attr_accessor :thresholds
|
115
|
+
attr_accessor :thresholds, :latency_thresholds
|
63
116
|
|
64
117
|
def as_json(options = {})
|
65
118
|
{
|
66
119
|
'global_status' => global_status,
|
67
|
-
'queues' => queues.map(&:as_json)
|
120
|
+
'queues' => queues.map(&:as_json),
|
121
|
+
'workers' => workers.map(&:as_json)
|
68
122
|
}
|
69
123
|
end
|
70
124
|
|
71
125
|
def global_status
|
72
|
-
|
126
|
+
queue_status = (queues.sort.last && queues.sort.last.status) || 'UNKNOWN'
|
127
|
+
worker_status = (workers.sort.last && workers.sort.last.status) || 'UNKNOWN'
|
128
|
+
status = if worker_status != 'UNKNOWN' && Monitorable::ALERT_STATUS[worker_status] > Monitorable::ALERT_STATUS[queue_status]
|
129
|
+
worker_status
|
130
|
+
else
|
131
|
+
queue_status
|
132
|
+
end
|
133
|
+
@global_status ||= status
|
73
134
|
end
|
74
135
|
|
75
|
-
def initialize(thresholds = {})
|
136
|
+
def initialize(thresholds = {}, latency_thresholds = {})
|
76
137
|
@thresholds = thresholds
|
138
|
+
@latency_thresholds = latency_thresholds
|
77
139
|
end
|
78
140
|
|
79
141
|
def queues
|
80
|
-
@queues ||= Sidekiq::Queue.all.
|
81
|
-
Queue.new(queue.name, queue.size, thresholds_from_queue(queue.name))
|
82
|
-
|
142
|
+
@queues ||= Sidekiq::Queue.all.map do |queue|
|
143
|
+
Queue.new(queue.name, queue.size, queue.latency, thresholds_from_queue(queue.name), latency_thresholds_from_queue(queue.name))
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def workers
|
148
|
+
@workers ||= Sidekiq::Workers.new.map do |process_id, thread_id, work|
|
149
|
+
payload = work['payload']
|
150
|
+
Worker.new(process_id, payload['jid'], work['run_at'], work['queue'], payload['class'], latency_thresholds_from_queue(work['queue']))
|
151
|
+
end
|
83
152
|
end
|
84
153
|
|
85
154
|
def thresholds_from_queue(queue_name)
|
86
155
|
(thresholds || {})[queue_name]
|
87
156
|
end
|
88
157
|
|
158
|
+
def latency_thresholds_from_queue(queue_name)
|
159
|
+
(latency_thresholds || {})[queue_name]
|
160
|
+
end
|
161
|
+
|
89
162
|
end
|
90
163
|
|
91
164
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-monitoring
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Jeremy Carlier
|
8
8
|
autorequire:
|
9
9
|
bindir: ''
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -90,7 +90,8 @@ files:
|
|
90
90
|
- VERSION
|
91
91
|
- lib/sidekiq-monitoring.rb
|
92
92
|
homepage: http://github.com/dimelo/sidekiq-monitoring
|
93
|
-
licenses:
|
93
|
+
licenses:
|
94
|
+
- MIT
|
94
95
|
metadata: {}
|
95
96
|
post_install_message:
|
96
97
|
rdoc_options: []
|
@@ -108,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
109
|
version: '0'
|
109
110
|
requirements: []
|
110
111
|
rubyforge_project:
|
111
|
-
rubygems_version: 2.
|
112
|
+
rubygems_version: 2.5.1
|
112
113
|
signing_key:
|
113
114
|
specification_version: 4
|
114
115
|
summary: Addons to provide a monitoring API for Sidekiq
|