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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 32691642cb604f14ad8fcc6cadc317a8a356d201
4
- data.tar.gz: af0b75205599503299429ac630db2b38b0f27191
2
+ SHA256:
3
+ metadata.gz: 950196b2ee9086c4602b7f096e4232ce711c4c6497e3c03c32e826b1e45a3ff0
4
+ data.tar.gz: 87a287d6d732765595cc8d7bee466938c3ad0f781d2446c757d909f06c01147e
5
5
  SHA512:
6
- metadata.gz: 0fe5aa64d312740c5ab8b2b39f7c89c08b83a73a23bd541df09687cae39f435e48e3580aa4ed19e8f18106697d50f49b6bf353c945d52ae56e37f114889c8239
7
- data.tar.gz: 0dcdbceba1da143d423b1b9c4d191b61d54460bf469055939d9135e26c1f08ea6f9a5723e18e30054e01f1a6bc2938f8aae2ab47e3627320ee716ffd00797f82
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(*args, &block)
10
- Config.configure(*args, &block)
11
- end
14
+ def self.configure(options = {})
15
+ options = options.symbolize_keys
16
+ global_options = options.except(:queues)
12
17
 
13
- def self.send_backed_up_alert(*args, &block)
14
- Config.send_backed_up_alert(*args, &block)
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.send_slowed_down_alert(*args, &block)
18
- Config.send_slowed_down_alert(*args, &block)
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
- class << self
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
- @dont_repeat_for = dont_repeat_for unless dont_repeat_for.nil?
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
- @on_backed_up = (on_backed_up.is_a?(Enumerable) ? on_backed_up : [on_backed_up]) unless on_backed_up.nil?
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
- if slack_notifier_url.present?
15
- @notifier = Slack::Notifier.new(slack_notifier_url)
19
+ @max_heartbeat_delay = max_heartbeat_delay || 5.minutes
16
20
 
17
- slack_notifier_callback = [-> (msg, queue) { @notifier.ping(msg) }]
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
- @on_backed_up = @on_backed_up.to_a + slack_notifier_callback
20
- @on_slowed_down = @on_slowed_down.to_a + slack_notifier_callback
21
- end
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
- unless Sidekiq::Cron::Job.find("sidekiq_monitor").present?
24
- Sidekiq::Cron::Job.create(
25
- name: 'sidekiq_monitor',
26
- cron: '*/15 * * * * *',
27
- klass: Sidekiq::HeartbeatMonitor::Scheduler
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
- def send_test!
33
- test_queue = Sidekiq::Queue.new('test')
34
- send_backed_up_alert("Test backed up alert!", test_queue)
35
- send_slowed_down_alert("Test slowed down alert!", test_queue)
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
- def send_backed_up_alert(message, q)
39
- if @on_backed_up.blank?
40
- puts ("WARNING: No 'on_backed_up' callback defined for sidekiq-heartbeat_monitor but one of the queues are backed up: #{message}")
41
- return
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
- if @dont_repeat_for.nil?
45
- @on_backed_up.to_a.each { |alert| alert.call(message, q) }
46
- else
47
- DontRepeatFor.new(@dont_repeat_for, "Sidekiq/HeartbeatMonitor/#{q.name}/send_backed_up_alert") do
48
- @on_backed_up.to_a.each { |alert| alert.call(message, q) }
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
- def send_slowed_down_alert(message, q)
54
- if @on_slowed_down.blank?
55
- puts ("WARNING: No 'on_slowed_down' callback defined for sidekiq-heartbeat_monitor but one of the queues are backed up: #{message}")
56
- return
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 @dont_repeat_for.nil?
60
- @on_slowed_down.to_a.each { |alert| alert.call(message, q) }
92
+ else
93
+ if target_job.save
94
+ puts "SUCCESS: New cron task was installed successfully." if output
95
+ true
61
96
  else
62
- DontRepeatFor.new(@dont_repeat_for, "Sidekiq/HeartbeatMonitor/#{q.name}/send_slowed_down_alert") do
63
- @on_slowed_down.to_a.each { |alert| alert.call(message, q) }
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
- def max_queue_size
69
- @max_queue_size || ENV.fetch('SIDEKIQ_MONITOR_MAX_QUEUE_SIZE', 5000).to_i
70
- end
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::Queue.all.each do |q|
11
- check_queue_size(q, Sidekiq::HeartbeatMonitor::Config.max_queue_size)
12
-
13
- Sidekiq::HeartbeatMonitor::Worker.client_push(
14
- 'class' => Sidekiq::HeartbeatMonitor::Worker,
15
- 'args' => [q.name, 15],
16
- 'queue' => q.name
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, max_queue_size)
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
- send_server_alert("⚠️ Queue #{q.name} has more than #{max_queue_size} jobs waiting to be processed. Current size is #{q.size}", q)
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,9 @@
1
+ namespace :sidekiq do
2
+ namespace :heartbeat_monitor do
3
+
4
+ desc "Install sidekiq heartbeat monitor gem heartbeat cron task."
5
+ task :install => :environment do
6
+ Sidekiq::HeartbeatMonitor::Config.install_cron_job!(output: true)
7
+ end
8
+ end
9
+ 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,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module HeartbeatMonitor
3
- VERSION = '1.0.1.3'
3
+ VERSION = '1.0.3.2'
4
4
  end
5
5
  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, secs_between_beats = 15)
12
- current_run_at = Time.now.utc.to_i
13
- last_run_at = redis.get("Sidekiq/HeartbeatMonitor/Worker/#{queue_name}.last_run_at").to_i
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
- if last_run_at > 0
16
- time_since_last_run = current_run_at - last_run_at
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
- send_server_alert("⚠️ queue #{queue_name} took > #{sec_backed_up}s to reach job.", queue_name)
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
- Sidekiq::HeartbeatMonitor::Config.send_slowed_down_alert(msg, queue)
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
- true
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", "~> 10"
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.1.3
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: 2019-12-31 00:00:00.000000000 Z
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: '10'
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: '10'
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
- rubyforge_project:
196
- rubygems_version: 2.6.10
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: []