sidekiq_alive 0.1.1 → 1.0.0

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