sidekiq-heartbeat_monitor 1.0.1.3 → 1.0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +13 -0
- data/lib/sidekiq/heartbeat_monitor.rb +22 -9
- data/lib/sidekiq/heartbeat_monitor/config.rb +100 -46
- data/lib/sidekiq/heartbeat_monitor/railtie.rb +15 -0
- data/lib/sidekiq/heartbeat_monitor/scheduler.rb +36 -18
- data/lib/sidekiq/heartbeat_monitor/tasks/install.rake +9 -0
- data/lib/sidekiq/heartbeat_monitor/test_worker.rb +21 -0
- data/lib/sidekiq/heartbeat_monitor/util.rb +33 -0
- data/lib/sidekiq/heartbeat_monitor/version.rb +1 -1
- data/lib/sidekiq/heartbeat_monitor/worker.rb +16 -26
- data/sidekiq-heartbeat_monitor.gemspec +2 -1
- metadata +28 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 950196b2ee9086c4602b7f096e4232ce711c4c6497e3c03c32e826b1e45a3ff0
|
4
|
+
data.tar.gz: 87a287d6d732765595cc8d7bee466938c3ad0f781d2446c757d909f06c01147e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20f6ca5e135ec7217e54739f75c6409bb01711158a2afda20c2cf428aae1842057c8741d273ef186fc96bd1a720edbcd27ec9eb7e796dd878439d256e380918f
|
7
|
+
data.tar.gz: 104b87bce693e0908e2c4caf9285eadd6bc8e2600b220559465010df1b7db1f8d06960db3b3643b159f95b34da0a2f4766a06174b966f9cd3b4ca9339c24bc1d
|
data/README.md
CHANGED
@@ -21,6 +21,14 @@ Or install it yourself as:
|
|
21
21
|
|
22
22
|
**Configuration is required - see the Configuration section below**
|
23
23
|
|
24
|
+
### (Optional) Install Cron Task
|
25
|
+
The gem will automatically try to install your cron task when you run your sidekiq server, however if for some reason it does not install the cron task
|
26
|
+
then you can install it manually using the available rake task command:
|
27
|
+
```
|
28
|
+
rake sidekiq::heartbeat_monitor:install
|
29
|
+
```
|
30
|
+
|
31
|
+
|
24
32
|
### Requirements
|
25
33
|
1. [Dont Repeat For Gem](https://www.github.com/jayelkaake/dont_repeat_for) - To allow you to only send notifications every so often.
|
26
34
|
2. Redis
|
@@ -73,5 +81,10 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/jayelk
|
|
73
81
|
This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to
|
74
82
|
adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
|
75
83
|
|
84
|
+
### Supported versions
|
85
|
+
Battle-tested @ [Fera.ai](https://www.fera.ai) with:
|
86
|
+
* Ruby 2.4 - 2.6.7 (but up to 3.0 should be fine)
|
87
|
+
* Sidekiq 3-5
|
88
|
+
|
76
89
|
### License
|
77
90
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
@@ -1,29 +1,42 @@
|
|
1
1
|
require "sidekiq"
|
2
2
|
require 'sidekiq/heartbeat_monitor/version'
|
3
3
|
require 'sidekiq/heartbeat_monitor/config'
|
4
|
+
require 'sidekiq/heartbeat_monitor/util'
|
4
5
|
require 'sidekiq/heartbeat_monitor/scheduler'
|
5
6
|
require 'sidekiq/heartbeat_monitor/worker'
|
7
|
+
require 'sidekiq/heartbeat_monitor/test_worker'
|
8
|
+
|
9
|
+
require 'sidekiq/heartbeat_monitor/railtie' if defined?(Rails)
|
10
|
+
|
6
11
|
|
7
12
|
module Sidekiq
|
8
13
|
module HeartbeatMonitor
|
9
|
-
def self.configure(
|
10
|
-
|
11
|
-
|
14
|
+
def self.configure(options = {})
|
15
|
+
options = options.symbolize_keys
|
16
|
+
global_options = options.except(:queues)
|
12
17
|
|
13
|
-
|
14
|
-
|
18
|
+
@global_config = Config.new(**global_options)
|
19
|
+
|
20
|
+
@queue_config = {}
|
21
|
+
options[:queues].to_a.each do |queue_name, queue_options|
|
22
|
+
@queue_config[queue_name.to_s] = Config.new(**global_options.deep_merge(queue_options))
|
23
|
+
end
|
15
24
|
end
|
16
25
|
|
17
|
-
def self.
|
18
|
-
|
26
|
+
def self.config(queue = nil)
|
27
|
+
return @global_config if queue.blank?
|
28
|
+
|
29
|
+
queue_name = queue.is_a?(String) || queue.is_a?(Symbol) ? queue.to_s : queue.name.to_s
|
30
|
+
@queue_config.to_h[queue_name] || @global_config
|
19
31
|
end
|
20
32
|
|
21
|
-
def self.send_test!
|
22
|
-
test_queue = Sidekiq::Queue.new('test')
|
33
|
+
def self.send_test!(queue_name = nil)
|
34
|
+
test_queue = Sidekiq::Queue.new(queue_name || 'test')
|
23
35
|
|
24
36
|
send_backed_up_alert("Test backed up alert!", test_queue)
|
25
37
|
send_slowed_down_alert("Test slowed down alert!", test_queue)
|
26
38
|
end
|
39
|
+
|
27
40
|
end
|
28
41
|
end
|
29
42
|
|
@@ -2,73 +2,127 @@ require 'sidekiq/cron/job'
|
|
2
2
|
module Sidekiq
|
3
3
|
module HeartbeatMonitor
|
4
4
|
class Config
|
5
|
-
|
6
|
-
def configure(max_queue_size: nil, on_backed_up: nil, on_slowed_down: nil, dont_repeat_for: nil, slack_notifier_url: nil)
|
7
|
-
@max_queue_size = max_queue_size unless max_queue_size.nil?
|
5
|
+
attr_accessor :max_queue_size, :max_heartbeat_delay
|
8
6
|
|
9
|
-
|
7
|
+
##
|
8
|
+
# @param max_queue_size [Integer] The maximum queue size (default: 5000 or SIDEKIQ_MONITOR_MAX_QUEUE_SIZE environment value)
|
9
|
+
# @param on_backed_up [Proc|Array<Proc>] On backed up run this or these procs
|
10
|
+
# @param on_slowed_down [Proc|Array<Proc>] On slowed down run this or these procs
|
11
|
+
# @param dont_repeat_for [Integer] The don't repeat for (optional, default: 5.minutes)
|
12
|
+
# @param slack_notifier_url [String] The slack notifier url (optional)
|
13
|
+
# @param max_heartbeat_delay [Integer] The maximum heartbeat delay (default: 5 minute, max: 5 days)
|
14
|
+
def initialize(max_queue_size: nil, on_backed_up: nil, on_slowed_down: nil, dont_repeat_for: nil, slack_notifier_url: nil, max_heartbeat_delay: nil)
|
15
|
+
@max_queue_size = max_queue_size || ENV.fetch('SIDEKIQ_MONITOR_MAX_QUEUE_SIZE', 5000).to_i
|
10
16
|
|
11
|
-
|
12
|
-
@on_slowed_down = (on_slowed_down.is_a?(Enumerable) ? on_slowed_down : [on_slowed_down]) unless on_slowed_down.nil?
|
17
|
+
@dont_repeat_for = dont_repeat_for unless dont_repeat_for.nil?
|
13
18
|
|
14
|
-
|
15
|
-
@notifier = Slack::Notifier.new(slack_notifier_url)
|
19
|
+
@max_heartbeat_delay = max_heartbeat_delay || 5.minutes
|
16
20
|
|
17
|
-
|
21
|
+
@on_backed_up = (on_backed_up.is_a?(Enumerable) ? on_backed_up : [on_backed_up]) unless on_backed_up.nil?
|
22
|
+
@on_slowed_down = (on_slowed_down.is_a?(Enumerable) ? on_slowed_down : [on_slowed_down]) unless on_slowed_down.nil?
|
18
23
|
|
19
|
-
|
20
|
-
|
21
|
-
|
24
|
+
setup_slack_notifier!(slack_notifier_url) if slack_notifier_url.present?
|
25
|
+
|
26
|
+
install_cron_job!
|
27
|
+
end
|
28
|
+
|
29
|
+
def send_test!
|
30
|
+
test_queue = Sidekiq::Queue.new('test')
|
31
|
+
send_backed_up_alert("Test backed up alert!", test_queue)
|
32
|
+
send_slowed_down_alert("Test slowed down alert!", test_queue)
|
33
|
+
end
|
22
34
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
35
|
+
def send_backed_up_alert!(message, q)
|
36
|
+
if @on_backed_up.blank?
|
37
|
+
puts ("WARNING: No 'on_backed_up' callback defined for sidekiq-heartbeat_monitor but one of the queues are backed up: #{message}")
|
38
|
+
return
|
39
|
+
end
|
40
|
+
|
41
|
+
if @dont_repeat_for.nil?
|
42
|
+
@on_backed_up.to_a.each { |alert| alert.call(message, q) }
|
43
|
+
else
|
44
|
+
DontRepeatFor.new(@dont_repeat_for, "Sidekiq/HeartbeatMonitor/#{q.name}/send_backed_up_alert") do
|
45
|
+
@on_backed_up.to_a.each { |alert| alert.call(message, q) }
|
29
46
|
end
|
30
47
|
end
|
48
|
+
end
|
31
49
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
50
|
+
def send_slowed_down_alert!(message, q)
|
51
|
+
if @on_slowed_down.blank?
|
52
|
+
puts ("WARNING: No 'on_slowed_down' callback defined for sidekiq-heartbeat_monitor but one of the queues are backed up: #{message}")
|
53
|
+
return
|
36
54
|
end
|
37
55
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
56
|
+
if @dont_repeat_for.nil?
|
57
|
+
@on_slowed_down.to_a.each { |alert| alert.call(message, q) }
|
58
|
+
else
|
59
|
+
DontRepeatFor.new(@dont_repeat_for, "Sidekiq/HeartbeatMonitor/#{q.name}/send_slowed_down_alert") do
|
60
|
+
@on_slowed_down.to_a.each { |alert| alert.call(message, q) }
|
42
61
|
end
|
62
|
+
end
|
63
|
+
end
|
43
64
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
65
|
+
def self.install_cron_job!(output: false)
|
66
|
+
job = Sidekiq::Cron::Job.find("sidekiq_monitor")
|
67
|
+
|
68
|
+
target_job = Sidekiq::Cron::Job.new(
|
69
|
+
name: 'sidekiq_monitor',
|
70
|
+
cron: '* * * * *',
|
71
|
+
klass: Sidekiq::HeartbeatMonitor::Scheduler
|
72
|
+
)
|
73
|
+
|
74
|
+
if job.present?
|
75
|
+
if job.cron != target_job.cron && job.klass.to_s != target_job.klass
|
76
|
+
unless job.destroy
|
77
|
+
puts "ERROR: An existing cron job was found with the same name but incorrect configuration. An attempt to delete it (to create a new, correctly configured one) failed." if output
|
78
|
+
return false
|
49
79
|
end
|
50
|
-
end
|
51
|
-
end
|
52
80
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
81
|
+
if target_job.save
|
82
|
+
puts "SUCCESS: An existing crob job was found that had the same name but had outdated configuration, so it was deleted and a new one was installed successfully." if output
|
83
|
+
true
|
84
|
+
else
|
85
|
+
puts "ERROR: Sidekiq heartbeat monitor found an existing cron job with the same name but it is configured incorrectly. It was deleted, but a new one could not be created. Run this command again to try adding it manually again and please ensure you can programmatically add sidekiq cron jobs as well." if output
|
86
|
+
false
|
87
|
+
end
|
88
|
+
else
|
89
|
+
puts "SUCCESS: Sidekiq heartbeat monitor cron job already exists and appears to be configured properly so nothing was changed." if output
|
90
|
+
true
|
57
91
|
end
|
58
|
-
|
59
|
-
if
|
60
|
-
|
92
|
+
else
|
93
|
+
if target_job.save
|
94
|
+
puts "SUCCESS: New cron task was installed successfully." if output
|
95
|
+
true
|
61
96
|
else
|
62
|
-
|
63
|
-
|
64
|
-
end
|
97
|
+
puts "ERROR: New cron task could not be saved for some reason. Please ensure you can programmatically add sidekiq cron jobs and try again." if output
|
98
|
+
false
|
65
99
|
end
|
66
100
|
end
|
101
|
+
end
|
67
102
|
|
68
|
-
|
69
|
-
|
70
|
-
|
103
|
+
private
|
104
|
+
|
105
|
+
def setup_slack_notifier!(slack_notifier_url)
|
106
|
+
@notifier = Slack::Notifier.new(slack_notifier_url)
|
107
|
+
|
108
|
+
slack_notifier_callback = [-> (msg, queue) { @notifier.ping(msg) }]
|
109
|
+
|
110
|
+
@on_backed_up = @on_backed_up.to_a + slack_notifier_callback
|
111
|
+
@on_slowed_down = @on_slowed_down.to_a + slack_notifier_callback
|
112
|
+
end
|
113
|
+
|
114
|
+
def install_cron_job!
|
115
|
+
# Only install the cron job if we're running as a sidekiq server
|
116
|
+
return unless Sidekiq.server?
|
117
|
+
|
118
|
+
self.class.install_cron_job!
|
119
|
+
|
120
|
+
rescue Redis::CannotConnectError
|
121
|
+
# If we failed to connect at this point then likely Redis is not yet configured at this point in initialization,
|
122
|
+
# so we should just abort
|
123
|
+
false
|
71
124
|
end
|
125
|
+
|
72
126
|
end
|
73
127
|
end
|
74
128
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'sidekiq/heartbeat_monitor'
|
2
|
+
require 'rails'
|
3
|
+
|
4
|
+
module Sidekiq
|
5
|
+
module HeartbeatMonitor
|
6
|
+
class Railtie < ::Rails::Railtie
|
7
|
+
railtie_name :sidekiq_heartbeat_monitor
|
8
|
+
|
9
|
+
rake_tasks do
|
10
|
+
path = File.expand_path(__dir__)
|
11
|
+
Dir.glob("#{path}/tasks/**/*.rake").each { |f| load f }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,37 +1,55 @@
|
|
1
1
|
module Sidekiq
|
2
2
|
module HeartbeatMonitor
|
3
3
|
class Scheduler
|
4
|
+
TIME_BETWEEN_HEARTBEATS = 60
|
5
|
+
|
4
6
|
include Sidekiq::Worker
|
7
|
+
include Sidekiq::HeartbeatMonitor::Util
|
5
8
|
sidekiq_options retry: 0
|
6
9
|
|
7
10
|
##
|
8
11
|
# Checks to see if queues are backed up by 1000 or more jobs and also schedules the heartbeat job.
|
9
12
|
def perform
|
10
|
-
Sidekiq
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
Sidekiq.redis do |redis|
|
14
|
+
Sidekiq::Queue.all.each do |q|
|
15
|
+
queue_config = Sidekiq::HeartbeatMonitor.config(q)
|
16
|
+
next if queue_config.nil?
|
17
|
+
|
18
|
+
check_queue_size!(q, queue_config)
|
19
|
+
|
20
|
+
key = "Sidekiq:HeartbeatMonitor:Worker-#{q.name}.enqueued_at"
|
21
|
+
|
22
|
+
last_enqueued_at = redis.get(key).to_i
|
23
|
+
|
24
|
+
if last_enqueued_at > 577997505 # Enqueued after Jan 2, 2020 when this code was written
|
25
|
+
time_since_enqueued = Time.now.to_i - last_enqueued_at
|
26
|
+
if (time_since_enqueued - TIME_BETWEEN_HEARTBEATS) > queue_config.max_heartbeat_delay
|
27
|
+
queue_config.send_slowed_down_alert!("⚠️ _#{q.name}_ queue is taking longer than #{format_time_str(time_since_enqueued)} to reach jobs.", q)
|
28
|
+
else
|
29
|
+
next
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
redis.set(key, Time.now.to_i, ex: 1.week)
|
34
|
+
|
35
|
+
Sidekiq::HeartbeatMonitor::Worker.client_push(
|
36
|
+
'class' => Sidekiq::HeartbeatMonitor::Worker,
|
37
|
+
'args' => [q.name],
|
38
|
+
'queue' => q.name
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
18
42
|
end
|
19
43
|
end
|
20
44
|
|
21
|
-
def check_queue_size(q,
|
45
|
+
def check_queue_size!(q, queue_config)
|
46
|
+
max_queue_size = queue_config.max_queue_size
|
47
|
+
|
22
48
|
if q.size > max_queue_size
|
23
|
-
|
49
|
+
queue_config.send_backed_up_alert!("⚠️ _#{q.name}_ queue has more than #{max_queue_size} jobs waiting to be processed. Current size is #{q.size}", q)
|
24
50
|
end
|
25
51
|
end
|
26
52
|
|
27
|
-
##
|
28
|
-
# @param msg [String] Message to post
|
29
|
-
# @param queue_name [Sidekiq::Queue] Queue we're concerned with
|
30
|
-
def send_server_alert(msg, q)
|
31
|
-
Sidekiq::HeartbeatMonitor::Config.send_backed_up_alert(msg, q)
|
32
|
-
|
33
|
-
true
|
34
|
-
end
|
35
53
|
end
|
36
54
|
end
|
37
55
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Sidekiq
|
2
|
+
module HeartbeatMonitor
|
3
|
+
##
|
4
|
+
# Used for testing purposes to ensure that the system is working properly.
|
5
|
+
class TestWorker
|
6
|
+
|
7
|
+
include Sidekiq::Worker
|
8
|
+
|
9
|
+
sidekiq_options retry: 0
|
10
|
+
|
11
|
+
def perform(wait_time = 1.second)
|
12
|
+
puts "Internal test worker started and will continue for the next #{wait_time} seconds." if wait_time > 3.seconds
|
13
|
+
|
14
|
+
sleep(wait_time)
|
15
|
+
|
16
|
+
puts "Internal test worker finished after #{wait_time} seconds." if wait_time > 3.seconds
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
module Sidekiq
|
3
|
+
module HeartbeatMonitor
|
4
|
+
module Util
|
5
|
+
|
6
|
+
##
|
7
|
+
# Nicely formats a seconds string.
|
8
|
+
# Example 1: 100.seconds => "1 min 40 sec"
|
9
|
+
# Example 2: 13.hours => "13 hr"
|
10
|
+
#
|
11
|
+
# @param total_seconds [String] Total number of seconds to format nicely.
|
12
|
+
# @return [String] A string representation of the time.
|
13
|
+
def format_time_str(total_seconds)
|
14
|
+
remaining_sec = total_seconds
|
15
|
+
|
16
|
+
hours = (remaining_sec - (remaining_sec % 3600)) / 3600
|
17
|
+
remaining_sec -= hours * 3600
|
18
|
+
|
19
|
+
minutes = (remaining_sec - (remaining_sec % 60)) / 60
|
20
|
+
remaining_sec -= minutes * 60
|
21
|
+
|
22
|
+
seconds = remaining_sec
|
23
|
+
|
24
|
+
nice_backed_up_str = "#{seconds} sec" if seconds > 0 || (minutes < 1 && hours < 1)
|
25
|
+
nice_backed_up_str = "#{minutes} min #{nice_backed_up_str}" if minutes > 0 || (seconds > 0 && hours > 0)
|
26
|
+
nice_backed_up_str = "#{hours} hr #{nice_backed_up_str}" if hours > 0
|
27
|
+
|
28
|
+
nice_backed_up_str.strip
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,45 +1,35 @@
|
|
1
1
|
module Sidekiq
|
2
2
|
module HeartbeatMonitor
|
3
3
|
class Worker
|
4
|
-
|
5
4
|
include Sidekiq::Worker
|
5
|
+
include Sidekiq::HeartbeatMonitor::Util
|
6
|
+
|
6
7
|
sidekiq_options retry: 0
|
7
8
|
|
8
9
|
##
|
9
10
|
# Runs every x seconds and ensures that the time between jobs is consistent and
|
10
11
|
# @param queue_name [String] Name of the queue that this heartbeat is running on.
|
11
|
-
def perform(queue_name
|
12
|
-
|
13
|
-
|
12
|
+
def perform(queue_name)
|
13
|
+
Sidekiq.redis do |redis|
|
14
|
+
q = Sidekiq::Queue.all.find{ |q| q.name.to_s == queue_name.to_s }
|
15
|
+
queue_config = Sidekiq::HeartbeatMonitor.config(q)
|
16
|
+
return if queue_config.nil?
|
14
17
|
|
15
|
-
|
16
|
-
|
17
|
-
if time_since_last_run > (5.minutes + secs_between_beats)
|
18
|
-
sec_backed_up = time_since_last_run - secs_between_beats
|
18
|
+
key = "Sidekiq:HeartbeatMonitor:Worker-#{queue_name}.enqueued_at"
|
19
|
+
enqueued_at = redis.get(key).to_i
|
19
20
|
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
redis.set("Sidekiq/HeartbeatMonitor/Worker/#{queue_name}.last_run_at", current_run_at, ex: 1.hour)
|
25
|
-
end
|
21
|
+
return if enqueued_at < 1577997505 # Enqueued before Jan 2, 2020 when this code was written
|
26
22
|
|
27
|
-
|
28
|
-
# @param msg [String] Message to post
|
29
|
-
# @param queue_name [String] Queue we're concerned with
|
30
|
-
def send_server_alert(msg, queue_name)
|
31
|
-
queue = Sidekiq::Queue.all.find{ |q| q.name.to_s == queue_name.to_s }
|
23
|
+
time_since_enqueued = Time.now.to_i - enqueued_at
|
32
24
|
|
33
|
-
|
25
|
+
if time_since_enqueued > queue_config.max_heartbeat_delay
|
26
|
+
queue_config.send_slowed_down_alert!("⚠️ _#{queue_name}_ queue took #{format_time_str(time_since_enqueued)} to reach job.", q)
|
27
|
+
end
|
34
28
|
|
35
|
-
|
29
|
+
redis.del(key)
|
30
|
+
end
|
36
31
|
end
|
37
32
|
|
38
|
-
private
|
39
|
-
|
40
|
-
def redis
|
41
|
-
@@redis = defined?($redis) ? $redis : Redis.new
|
42
|
-
end
|
43
33
|
|
44
34
|
end
|
45
35
|
end
|
@@ -31,12 +31,13 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_dependency "sidekiq-cron", ">= 0.6"
|
32
32
|
spec.add_dependency "dont_repeat_for", ">= 1"
|
33
33
|
spec.add_dependency "slack-notifier", ">= 0.5"
|
34
|
+
spec.add_dependency "dotenv", ">= 1.0"
|
34
35
|
|
35
36
|
spec.add_development_dependency "rails", ">= 4"
|
36
37
|
|
37
38
|
spec.add_development_dependency "bundler"
|
38
39
|
spec.add_development_dependency "temping", "~> 3.3"
|
39
|
-
spec.add_development_dependency "rake", "
|
40
|
+
spec.add_development_dependency "rake", ">= 12.3.3"
|
40
41
|
spec.add_development_dependency "rspec", '~> 3.4'
|
41
42
|
spec.add_development_dependency "sqlite3", '~> 1.3'
|
42
43
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-heartbeat_monitor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jay El-Kaake
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0.5'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: dotenv
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rails
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,16 +126,16 @@ dependencies:
|
|
112
126
|
name: rake
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
|
-
- - "
|
129
|
+
- - ">="
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
131
|
+
version: 12.3.3
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
|
-
- - "
|
136
|
+
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
138
|
+
version: 12.3.3
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: rspec
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -169,7 +183,11 @@ files:
|
|
169
183
|
- bin/setup
|
170
184
|
- lib/sidekiq/heartbeat_monitor.rb
|
171
185
|
- lib/sidekiq/heartbeat_monitor/config.rb
|
186
|
+
- lib/sidekiq/heartbeat_monitor/railtie.rb
|
172
187
|
- lib/sidekiq/heartbeat_monitor/scheduler.rb
|
188
|
+
- lib/sidekiq/heartbeat_monitor/tasks/install.rake
|
189
|
+
- lib/sidekiq/heartbeat_monitor/test_worker.rb
|
190
|
+
- lib/sidekiq/heartbeat_monitor/util.rb
|
173
191
|
- lib/sidekiq/heartbeat_monitor/version.rb
|
174
192
|
- lib/sidekiq/heartbeat_monitor/worker.rb
|
175
193
|
- sidekiq-heartbeat_monitor.gemspec
|
@@ -177,7 +195,7 @@ homepage: https://www.github.com/jayelkaake/sidekiq-heartbeat_monitor
|
|
177
195
|
licenses:
|
178
196
|
- MIT
|
179
197
|
metadata: {}
|
180
|
-
post_install_message:
|
198
|
+
post_install_message:
|
181
199
|
rdoc_options: []
|
182
200
|
require_paths:
|
183
201
|
- lib
|
@@ -192,9 +210,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
210
|
- !ruby/object:Gem::Version
|
193
211
|
version: '0'
|
194
212
|
requirements: []
|
195
|
-
|
196
|
-
|
197
|
-
signing_key:
|
213
|
+
rubygems_version: 3.0.9
|
214
|
+
signing_key:
|
198
215
|
specification_version: 4
|
199
216
|
summary: Makes it easy to monitor your sidekiq queues, especially with Slack.
|
200
217
|
test_files: []
|