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 +5 -5
- data/Gemfile +2 -0
- data/Gemfile.lock +8 -2
- data/README.md +25 -17
- data/lib/sidekiq_alive.rb +68 -4
- data/lib/sidekiq_alive/config.rb +12 -2
- data/lib/sidekiq_alive/server.rb +1 -3
- data/lib/sidekiq_alive/version.rb +1 -1
- data/lib/sidekiq_alive/worker.rb +22 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3d830981c90cc8b2fe8ac0bf9effc622122a4eede48a0f0b3bfcfa56c46141e6
|
4
|
+
data.tar.gz: ead02f79ea837523c3cb2ed27e75fb4acaa679bfea96b16612c245c0564ce6a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4888b18026c9252aaff4088f4f7bd0d023c6494cb2151a351068a14fe09608bbcf3af9482eb291e9c931e9afc8a3b20bff4b74fe4e8db916771ca51df6a642a2
|
7
|
+
data.tar.gz: 350800b476d209af711a4682f3f5acefc7cac0fec82d66ba0ade63e2f30056cfa1964dbcb4df778c22aedeea86ae6d54000df2b8ba824221bce5d7799855865f
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,17 +1,22 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sidekiq_alive (0.
|
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.
|
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
|
-
|
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
|
-
|
46
|
-
|
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
|
-
|
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
|
-
#
|
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
|
11
|
-
|
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(
|
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(
|
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']
|
data/lib/sidekiq_alive/config.rb
CHANGED
@@ -2,13 +2,23 @@ module SidekiqAlive
|
|
2
2
|
class Config
|
3
3
|
include Singleton
|
4
4
|
|
5
|
-
attr_accessor :port,
|
5
|
+
attr_accessor :port,
|
6
|
+
:liveness_key,
|
7
|
+
:time_to_live,
|
8
|
+
:callback,
|
9
|
+
:registered_instance_key
|
6
10
|
|
7
11
|
def initialize
|
8
|
-
|
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
|
data/lib/sidekiq_alive/server.rb
CHANGED
@@ -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
|
-
|
25
|
+
SidekiqAlive.logger.error(response)
|
28
26
|
status 404
|
29
27
|
body response
|
30
28
|
end
|
data/lib/sidekiq_alive/worker.rb
CHANGED
@@ -3,18 +3,37 @@ module SidekiqAlive
|
|
3
3
|
include Sidekiq::Worker
|
4
4
|
sidekiq_options retry: false
|
5
5
|
|
6
|
-
def perform
|
7
|
-
|
8
|
-
|
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.
|
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
|
+
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.
|
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.
|