sidekiq_alive 0.1.1 → 1.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0e7e972b09b3d5ee8de3fe0e32bd23adae47a46d
4
- data.tar.gz: 3c7e7ebcfcba7f850e0563f2fc8d2651cf585321
2
+ SHA256:
3
+ metadata.gz: 3d830981c90cc8b2fe8ac0bf9effc622122a4eede48a0f0b3bfcfa56c46141e6
4
+ data.tar.gz: ead02f79ea837523c3cb2ed27e75fb4acaa679bfea96b16612c245c0564ce6a0
5
5
  SHA512:
6
- metadata.gz: 1470c68f1fecbafa1d5a6e0e53c0767b89c65cd3e8cfec47662df6ed738179f467c0e603efbf56b24a91c0a54764f9aafa775b955b08c51172e48d1affc1ba26
7
- data.tar.gz: 4e67168aa2f3de897070748382482df8d1b69f11aa24d482affae8bdb3d02e0a06475f5102e8a683ed79e0b5ad8e6127daed7f0249c71f15edb2d855fd3fab42
6
+ metadata.gz: 4888b18026c9252aaff4088f4f7bd0d023c6494cb2151a351068a14fe09608bbcf3af9482eb291e9c931e9afc8a3b20bff4b74fe4e8db916771ca51df6a642a2
7
+ data.tar.gz: 350800b476d209af711a4682f3f5acefc7cac0fec82d66ba0ade63e2f30056cfa1964dbcb4df778c22aedeea86ae6d54000df2b8ba824221bce5d7799855865f
data/Gemfile CHANGED
@@ -4,3 +4,5 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in sidekiq_alive.gemspec
6
6
  gemspec
7
+
8
+ gem 'pry'
data/Gemfile.lock CHANGED
@@ -1,17 +1,22 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sidekiq_alive (0.1.1)
4
+ sidekiq_alive (1.0.0)
5
5
  sidekiq
6
6
  sinatra
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
+ coderay (1.1.2)
11
12
  concurrent-ruby (1.0.5)
12
13
  connection_pool (2.2.1)
13
14
  diff-lcs (1.3)
15
+ method_source (0.9.0)
14
16
  mock_redis (0.18.0)
17
+ pry (0.11.3)
18
+ coderay (~> 1.1.0)
19
+ method_source (~> 0.9.0)
15
20
  rack (1.6.8)
16
21
  rack-protection (1.5.3)
17
22
  rack
@@ -52,6 +57,7 @@ PLATFORMS
52
57
  DEPENDENCIES
53
58
  bundler (~> 1.16)
54
59
  mock_redis
60
+ pry
55
61
  rack-test
56
62
  rake (~> 10.0)
57
63
  rspec (~> 3.0)
@@ -59,4 +65,4 @@ DEPENDENCIES
59
65
  sidekiq_alive!
60
66
 
61
67
  BUNDLED WITH
62
- 1.16.2
68
+ 1.16.4
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # SidekiqAlive
2
2
 
3
3
  SidekiqAlive offers a solution to add liveness probe for a Sidekiq instance deployed in Kubernetes.
4
+ This library can be used to check sidekiq health outside kubernetes.
4
5
 
5
6
  __How?__
6
7
 
@@ -11,6 +12,8 @@ this key gets expired by Redis an consequently the http server will return a 500
11
12
 
12
13
  This Job is responsible to requeue itself for the next liveness probe.
13
14
 
15
+ Each instance in kubernetes will be checked based on `ENV` variable `HOSTNAME` (kubernetes sets this for each replica/pod).
16
+
14
17
 
15
18
  ## Installation
16
19
 
@@ -30,26 +33,15 @@ Or install it yourself as:
30
33
 
31
34
  ## Usage
32
35
 
33
- ### start the server
34
-
35
- rails example:
36
-
37
- `config/initializers/sidekiq.rb`
38
-
39
- ```ruby
40
- SidekiqAlive.start
41
- ```
36
+ SidekiqAlive will start when running `sidekiq` command.
42
37
 
43
- ### Run the job for first time
44
38
 
45
- It should only be run on the first time you deploy the app.
46
- It would reschedule itself.
39
+ __how to disable?__
40
+ You can disabled by setting `ENV` variable `DISABLE_SIDEKIQ_ALIVE`
41
+ example:
47
42
 
48
- rails example:
49
43
  ```
50
- $ bundle exec rails console
51
-
52
- #=> SidekiqAlive::Worker.perform_async
44
+ DISABLE_SIDEKIQ_ALIVE=true bundle exec sidekiq
53
45
  ```
54
46
 
55
47
  ### Kubernetes setup
@@ -92,12 +84,28 @@ spec:
92
84
  terminationGracePeriodSeconds: 60 # put your longest Job time here plus security time.
93
85
  ```
94
86
 
87
+ ### Outside kubernetes
88
+
89
+ It's just up to you how you want to use it.
90
+
91
+ An example in local would be:
92
+
93
+ ```
94
+ bundle exec sidekiq
95
+ # let it initialize ...
96
+ ```
97
+
98
+ ```
99
+ curl localhost:7433
100
+ #=> Alive!
101
+ ```
102
+
95
103
  ## Options
96
104
 
97
105
  ```ruby
98
106
  SidekiqAlive.setup do |config|
99
107
  # ==> Server port
100
- # port to bind the server
108
+ # Port to bind the server
101
109
  # default: 7433
102
110
  #
103
111
  # config.port = 7433
data/lib/sidekiq_alive.rb CHANGED
@@ -7,14 +7,32 @@ module SidekiqAlive
7
7
  def self.start
8
8
  Sidekiq.configure_server do |config|
9
9
  config.on(:startup) do
10
- SidekiqAlive::Worker.perform_async
11
- SidekiqAlive::Server.start
10
+ SidekiqAlive.tap do |sa|
11
+ sa.logger.info(banner)
12
+ sa.register_current_instance
13
+ sa.store_alive_key
14
+ sa::Worker.perform_async(hostname)
15
+ sa::Server.start
16
+ sa.logger.info(successful_startup_text)
17
+ end
12
18
  end
13
19
  end
14
20
  end
15
21
 
22
+ def self.register_current_instance
23
+ register_instance(current_instance_register_key)
24
+ end
25
+
26
+ def self.registered_instances
27
+ redis.keys("#{config.registered_instance_key}::*")
28
+ end
29
+
30
+ def self.current_instance_register_key
31
+ "#{config.registered_instance_key}::#{hostname}"
32
+ end
33
+
16
34
  def self.store_alive_key
17
- redis.set(config.liveness_key,
35
+ redis.set(current_lifeness_key,
18
36
  Time.now.to_i,
19
37
  { ex: config.time_to_live.to_i })
20
38
  end
@@ -24,7 +42,7 @@ module SidekiqAlive
24
42
  end
25
43
 
26
44
  def self.alive?
27
- redis.ttl(config.liveness_key) == -2 ? false : true
45
+ redis.ttl(current_lifeness_key) == -2 ? false : true
28
46
  end
29
47
 
30
48
  # CONFIG ---------------------------------------
@@ -33,10 +51,56 @@ module SidekiqAlive
33
51
  yield(config)
34
52
  end
35
53
 
54
+ def self.logger
55
+ Sidekiq::Logging.logger
56
+ end
57
+
36
58
  def self.config
37
59
  @config ||= SidekiqAlive::Config.instance
38
60
  end
61
+
62
+ def self.current_lifeness_key
63
+ "#{config.liveness_key}::#{hostname}"
64
+ end
65
+
66
+ def self.hostname
67
+ ENV['HOSTNAME'] || 'HOSTNAME_NOT_SET'
68
+ end
69
+
70
+ def self.banner
71
+ <<-BANNER.strip_heredoc
72
+
73
+ =================== SidekiqAlive =================
74
+
75
+ Hostname: #{hostname}
76
+ Liveness key: #{current_lifeness_key}
77
+ Port: #{config.port}
78
+ Time to live: #{config.time_to_live}s
79
+ Current instance register key: #{current_instance_register_key}
80
+
81
+ starting ...
82
+ BANNER
83
+ end
84
+
85
+ def self.successful_startup_text
86
+ <<-BANNER.strip_heredoc
87
+
88
+ =================== SidekiqAlive Ready! =================
89
+
90
+ Registered instances:
91
+
92
+ - #{registered_instances.join("\n\s\s- ")}
93
+ BANNER
94
+ end
95
+
96
+ def self.register_instance(instance_name)
97
+ redis.set(instance_name,
98
+ Time.now.to_i,
99
+ { ex: config.time_to_live.to_i + 60 })
100
+ end
39
101
  end
40
102
 
41
103
  require "sidekiq_alive/worker"
42
104
  require "sidekiq_alive/server"
105
+
106
+ SidekiqAlive.start unless ENV['DISABLE_SIDEKIQ_ALIVE']
@@ -2,13 +2,23 @@ module SidekiqAlive
2
2
  class Config
3
3
  include Singleton
4
4
 
5
- attr_accessor :port, :liveness_key, :time_to_live, :callback
5
+ attr_accessor :port,
6
+ :liveness_key,
7
+ :time_to_live,
8
+ :callback,
9
+ :registered_instance_key
6
10
 
7
11
  def initialize
8
- @port = 7433
12
+ set_defaults
13
+ end
14
+
15
+ def set_defaults
16
+ @port = ENV['SIDEKIQ_ALIVE_PORT'] || 7433
9
17
  @liveness_key = 'SIDEKIQ::LIVENESS_PROBE_TIMESTAMP'
10
18
  @time_to_live = 10 * 60
11
19
  @callback = proc {}
20
+ @registered_instance_key = "SIDEKIQ_REGISTERED_INSTANCE"
12
21
  end
22
+
13
23
  end
14
24
  end
@@ -6,8 +6,6 @@ module SidekiqAlive
6
6
 
7
7
  class << self
8
8
  def start
9
- Sidekiq::Logging.logger.info "Writing SidekiqAlive alive key in redis: #{SidekiqAlive.config.liveness_key}"
10
- SidekiqAlive.store_alive_key
11
9
  set :port, SidekiqAlive.config.port
12
10
  Thread.start { run! }
13
11
  end
@@ -24,7 +22,7 @@ module SidekiqAlive
24
22
  body "Alive!"
25
23
  else
26
24
  response = "Can't find the alive key"
27
- Sidekiq::Logging.logger.error(response)
25
+ SidekiqAlive.logger.error(response)
28
26
  status 404
29
27
  body response
30
28
  end
@@ -1,3 +1,3 @@
1
1
  module SidekiqAlive
2
- VERSION = "0.1.1"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -3,18 +3,37 @@ module SidekiqAlive
3
3
  include Sidekiq::Worker
4
4
  sidekiq_options retry: false
5
5
 
6
- def perform
7
- write_living_probe
8
- self.class.perform_in(config.time_to_live / 2)
6
+ def perform(hostname = SidekiqAlive.hostname)
7
+ return unless hostname_registered?(hostname)
8
+ if current_hostname == hostname
9
+ write_living_probe
10
+ # schedule next living probe
11
+ self.class.perform_in(config.time_to_live / 2, current_hostname)
12
+ else
13
+ # requeue for hostname to validate it's own liveness probe
14
+ self.class.perform_async(hostname)
15
+ end
16
+ end
17
+
18
+ def hostname_registered?(hostname)
19
+ SidekiqAlive.registered_instances.any? do |ri|
20
+ /#{hostname}/ =~ ri
21
+ end
9
22
  end
10
23
 
11
24
  def write_living_probe
12
25
  # Write liveness probe
13
26
  SidekiqAlive.store_alive_key
27
+ # Increment ttl for current registered instance
28
+ SidekiqAlive.register_current_instance
14
29
  # after callbacks
15
30
  config.callback.call()
16
31
  end
17
32
 
33
+ def current_hostname
34
+ SidekiqAlive.hostname
35
+ end
36
+
18
37
  def config
19
38
  SidekiqAlive.config
20
39
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq_alive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artur Pañach
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-08-11 00:00:00.000000000 Z
11
+ date: 2018-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -176,7 +176,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
176
  version: '0'
177
177
  requirements: []
178
178
  rubyforge_project:
179
- rubygems_version: 2.5.2.3
179
+ rubygems_version: 2.7.6
180
180
  signing_key:
181
181
  specification_version: 4
182
182
  summary: Liveness probe for sidekiq on Kubernetes deployments.