sidekiq_alive 2.3.0 → 2.4.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 +4 -4
- data/README.md +24 -6
- data/lib/sidekiq_alive/config.rb +7 -3
- data/lib/sidekiq_alive/helpers.rb +26 -0
- data/lib/sidekiq_alive/redis/redis_client_gem.rb +3 -3
- data/lib/sidekiq_alive/redis.rb +2 -2
- data/lib/sidekiq_alive/server/base.rb +52 -0
- data/lib/sidekiq_alive/server/default.rb +79 -0
- data/lib/sidekiq_alive/server/http_server.rb +140 -0
- data/lib/sidekiq_alive/server/rack.rb +67 -0
- data/lib/sidekiq_alive/server.rb +13 -28
- data/lib/sidekiq_alive/version.rb +1 -1
- data/lib/sidekiq_alive.rb +19 -21
- metadata +14 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 203a0459203c7e31aa2a223c7a6a2eea009f109697843b83eacd73577606487b
|
4
|
+
data.tar.gz: b85f281d7fc890744c303a51c46bdd846c3101e0acd44f3557a3549a00f25807
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2ab4467ab2b6041c4858fd96b91e5172751b4f86af6d6f4846d8e1f86f158a0a3279153e5972e24636d46983f5811191ea83ed4993e18886fda99ff206bec26
|
7
|
+
data.tar.gz: 2fe20f2e4895506137ba6e4ec6afe3c544eab32eef4a9a31690db808f459e452012ed3646d69c24dec869a2519facc6d9909326af915fe723126b8e212960f5a
|
data/README.md
CHANGED
@@ -247,12 +247,10 @@ SidekiqAlive.setup do |config|
|
|
247
247
|
# config.callback = proc { Net::HTTP.get("https://status.com/ping") }
|
248
248
|
|
249
249
|
# ==> Shutdown callback
|
250
|
-
# When sidekiq process is shutting down, you can perform some action
|
250
|
+
# When sidekiq process is shutting down, you can perform some arbitrary action.
|
251
251
|
# default: proc {}
|
252
252
|
#
|
253
|
-
# config.shutdown_callback = proc
|
254
|
-
# Sidekiq::Queue.all.find { |q| q.name == "#{config.queue_prefix}-#{SidekiqAlive.hostname}" }&.clear
|
255
|
-
# end
|
253
|
+
# config.shutdown_callback = proc { puts "Sidekiq is shutting down" }
|
256
254
|
|
257
255
|
# ==> Queue Prefix
|
258
256
|
# SidekiqAlive will run in a independent queue for each instance/replica
|
@@ -262,12 +260,32 @@ SidekiqAlive.setup do |config|
|
|
262
260
|
#
|
263
261
|
# config.queue_prefix = :other
|
264
262
|
|
263
|
+
# ==> Concurrency
|
264
|
+
# The maximum number of Redis connections requested for the SidekiqAlive pool.
|
265
|
+
# Can also be set with the environment variable SIDEKIQ_ALIVE_CONCURRENCY.
|
266
|
+
# NOTE: only effects Sidekiq 7 or greater.
|
267
|
+
# default: 2
|
268
|
+
#
|
269
|
+
# config.concurrency = 3
|
270
|
+
|
265
271
|
# ==> Rack server
|
266
|
-
# Web server used to serve an HTTP response.
|
272
|
+
# Web server used to serve an HTTP response. By default simple GServer based http server is used.
|
273
|
+
# To use specific server, rack gem version > 2 is required. For rack version >= 3, rackup gem is required.
|
267
274
|
# Can also be set with the environment variable SIDEKIQ_ALIVE_SERVER.
|
268
|
-
# default:
|
275
|
+
# default: nil
|
269
276
|
#
|
270
277
|
# config.server = 'puma'
|
278
|
+
|
279
|
+
# ==> Quiet mode timeout in seconds
|
280
|
+
# When sidekiq is shutting down, the Sidekiq process stops pulling jobs from the queue. This includes alive key update job. In case of
|
281
|
+
# long running jobs, alive key can expire before the job is finished. To avoid this, web server is set in to quiet mode
|
282
|
+
# and is returning 200 OK for healthcheck requests. To avoid infinite quiet mode in case sidekiq process is stuck in shutdown,
|
283
|
+
# timeout can be set. After timeout is reached, web server resumes normal operations and will return unhealthy status in case
|
284
|
+
# alive key is expired or purged from redis.
|
285
|
+
# default: 180
|
286
|
+
#
|
287
|
+
# config.quiet_timeout = 300
|
288
|
+
|
271
289
|
end
|
272
290
|
```
|
273
291
|
|
data/lib/sidekiq_alive/config.rb
CHANGED
@@ -12,10 +12,12 @@ module SidekiqAlive
|
|
12
12
|
:callback,
|
13
13
|
:registered_instance_key,
|
14
14
|
:queue_prefix,
|
15
|
-
:server,
|
16
15
|
:custom_liveness_probe,
|
17
16
|
:logger,
|
18
|
-
:shutdown_callback
|
17
|
+
:shutdown_callback,
|
18
|
+
:concurrency,
|
19
|
+
:server,
|
20
|
+
:quiet_timeout
|
19
21
|
|
20
22
|
def initialize
|
21
23
|
set_defaults
|
@@ -30,9 +32,11 @@ module SidekiqAlive
|
|
30
32
|
@callback = proc {}
|
31
33
|
@registered_instance_key = "SIDEKIQ_REGISTERED_INSTANCE"
|
32
34
|
@queue_prefix = :"sidekiq-alive"
|
33
|
-
@server = ENV.fetch("SIDEKIQ_ALIVE_SERVER", "webrick")
|
34
35
|
@custom_liveness_probe = proc { true }
|
35
36
|
@shutdown_callback = proc {}
|
37
|
+
@concurrency = Integer(ENV.fetch("SIDEKIQ_ALIVE_CONCURRENCY", 2), exception: false) || 2
|
38
|
+
@server = ENV.fetch("SIDEKIQ_ALIVE_SERVER", nil)
|
39
|
+
@quiet_timeout = Integer(ENV.fetch("SIDEKIQ_ALIVE_QUIET_TIMEOUT", 180), exception: false) || 180
|
36
40
|
end
|
37
41
|
|
38
42
|
def registration_ttl
|
@@ -17,11 +17,37 @@ module SidekiqAlive
|
|
17
17
|
current_sidekiq_version < Gem::Version.new("6")
|
18
18
|
end
|
19
19
|
|
20
|
+
def use_rack?
|
21
|
+
return @use_rack if defined?(@use_rack)
|
22
|
+
|
23
|
+
require "rack"
|
24
|
+
@use_rack = current_rack_version < Gem::Version.new("3")
|
25
|
+
rescue LoadError
|
26
|
+
# currently this won't happen because rack is a dependency of sidekiq
|
27
|
+
@use_rack = false
|
28
|
+
end
|
29
|
+
|
30
|
+
def use_rackup?
|
31
|
+
return @use_rackup if defined?(@use_rackup)
|
32
|
+
|
33
|
+
require "rackup"
|
34
|
+
@use_rackup = current_rack_version >= Gem::Version.new("3")
|
35
|
+
rescue LoadError
|
36
|
+
if current_rack_version >= Gem::Version.new("3")
|
37
|
+
SidekiqAlive.logger.warn("rackup gem required with rack >= 3, defaulting to default server")
|
38
|
+
end
|
39
|
+
@use_rackup = false
|
40
|
+
end
|
41
|
+
|
20
42
|
private
|
21
43
|
|
22
44
|
def current_sidekiq_version
|
23
45
|
Gem.loaded_specs["sidekiq"].version
|
24
46
|
end
|
47
|
+
|
48
|
+
def current_rack_version
|
49
|
+
Gem.loaded_specs["rack"].version
|
50
|
+
end
|
25
51
|
end
|
26
52
|
end
|
27
53
|
end
|
@@ -7,10 +7,10 @@ module SidekiqAlive
|
|
7
7
|
# Wrapper for `redis-client` gem used by `sidekiq` > 7
|
8
8
|
# https://github.com/redis-rb/redis-client
|
9
9
|
class RedisClientGem < Base
|
10
|
-
def initialize
|
11
|
-
super
|
10
|
+
def initialize(capsule = nil)
|
11
|
+
super()
|
12
12
|
|
13
|
-
@capsule = Sidekiq.default_configuration.capsules[CAPSULE_NAME]
|
13
|
+
@capsule = Sidekiq.default_configuration.capsules[capsule || CAPSULE_NAME]
|
14
14
|
end
|
15
15
|
|
16
16
|
def set(key, time:, ex:)
|
data/lib/sidekiq_alive/redis.rb
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
module SidekiqAlive
|
4
4
|
module Redis
|
5
5
|
class << self
|
6
|
-
def adapter
|
7
|
-
Helpers.sidekiq_7 ? Redis::RedisClientGem.new : Redis::RedisGem.new
|
6
|
+
def adapter(capsule = nil)
|
7
|
+
Helpers.sidekiq_7 ? Redis::RedisClientGem.new(capsule) : Redis::RedisGem.new
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SidekiqAlive
|
4
|
+
module Server
|
5
|
+
module Base
|
6
|
+
SHUTDOWN_SIGNAL = "TERM"
|
7
|
+
QUIET_SIGNAL = "USR1"
|
8
|
+
|
9
|
+
# set web server to quiet mode
|
10
|
+
def quiet!
|
11
|
+
logger.info("[SidekiqAlive] Setting web server to quiet mode")
|
12
|
+
Process.kill(QUIET_SIGNAL, @server_pid) unless @server_pid.nil?
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def configure_shutdown
|
18
|
+
Kernel.at_exit do
|
19
|
+
next if @server_pid.nil?
|
20
|
+
|
21
|
+
logger.info("Shutting down SidekiqAlive web server")
|
22
|
+
Process.kill(SHUTDOWN_SIGNAL, @server_pid)
|
23
|
+
Process.wait(@server_pid)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def configure_shutdown_signal(&block)
|
28
|
+
Signal.trap(SHUTDOWN_SIGNAL, &block)
|
29
|
+
end
|
30
|
+
|
31
|
+
def configure_quiet_signal(&block)
|
32
|
+
Signal.trap(QUIET_SIGNAL, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
def host
|
36
|
+
SidekiqAlive.config.host
|
37
|
+
end
|
38
|
+
|
39
|
+
def port
|
40
|
+
SidekiqAlive.config.port.to_i
|
41
|
+
end
|
42
|
+
|
43
|
+
def path
|
44
|
+
SidekiqAlive.config.path
|
45
|
+
end
|
46
|
+
|
47
|
+
def logger
|
48
|
+
SidekiqAlive.logger
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "http_server"
|
4
|
+
require_relative "base"
|
5
|
+
|
6
|
+
module SidekiqAlive
|
7
|
+
module Server
|
8
|
+
class Default < HttpServer
|
9
|
+
extend Base
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def run!
|
13
|
+
logger.info("[SidekiqAlive] Starting default healthcheck server on #{host}:#{port}")
|
14
|
+
@server_pid = ::Process.fork do
|
15
|
+
@server = new(port, host, path)
|
16
|
+
# stop is wrapped in a thread because gserver calls synchrnonize which raises an error when in trap context
|
17
|
+
configure_shutdown_signal { Thread.new { @server.stop } }
|
18
|
+
configure_quiet_signal { @server.quiet! }
|
19
|
+
|
20
|
+
@server.start
|
21
|
+
@server.join
|
22
|
+
end
|
23
|
+
configure_shutdown
|
24
|
+
logger.info("[SidekiqAlive] Web server started in subprocess with pid #{@server_pid}")
|
25
|
+
|
26
|
+
self
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(port, host, path, logger = SidekiqAlive.logger)
|
31
|
+
super(self, port, host, logger)
|
32
|
+
|
33
|
+
@path = path
|
34
|
+
end
|
35
|
+
|
36
|
+
def request_handler(req, res)
|
37
|
+
if req.path != path
|
38
|
+
res.status = 404
|
39
|
+
res.body = "Not found"
|
40
|
+
return logger.warn("[SidekiqAlive] Path '#{req.path}' not found")
|
41
|
+
end
|
42
|
+
|
43
|
+
if quiet?
|
44
|
+
res.status = 200
|
45
|
+
res.body = "Server is shutting down"
|
46
|
+
return logger.debug("[SidekiqAlive] Server in quiet mode, skipping alive key lookup!")
|
47
|
+
end
|
48
|
+
|
49
|
+
if SidekiqAlive.alive?
|
50
|
+
res.status = 200
|
51
|
+
res.body = "Alive!"
|
52
|
+
return logger.debug("[SidekiqAlive] Found alive key!")
|
53
|
+
end
|
54
|
+
|
55
|
+
response = "Can't find the alive key"
|
56
|
+
res.status = 404
|
57
|
+
res.body = response
|
58
|
+
logger.error("[SidekiqAlive] #{response}")
|
59
|
+
rescue StandardError => e
|
60
|
+
response = "Internal Server Error"
|
61
|
+
res.status = 500
|
62
|
+
res.body = response
|
63
|
+
logger.error("[SidekiqAlive] #{response} looking for alive key. Error: #{e.message}")
|
64
|
+
end
|
65
|
+
|
66
|
+
def quiet!
|
67
|
+
@quiet = Time.now
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
attr_reader :path
|
73
|
+
|
74
|
+
def quiet?
|
75
|
+
@quiet && (@quiet - Time.now) < SidekiqAlive.config.quiet_timeout
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "gserver"
|
4
|
+
|
5
|
+
module SidekiqAlive
|
6
|
+
module Server
|
7
|
+
# Simple HTTP server implementation
|
8
|
+
#
|
9
|
+
class HttpServer < GServer
|
10
|
+
# Request class for HTTP server
|
11
|
+
#
|
12
|
+
class Request
|
13
|
+
attr_reader :data, :header, :method, :path, :proto
|
14
|
+
|
15
|
+
def initialize(data, method = nil, path = nil, proto = nil)
|
16
|
+
@header = {}
|
17
|
+
@data = data
|
18
|
+
@method = method
|
19
|
+
@path = path
|
20
|
+
@proto = proto
|
21
|
+
end
|
22
|
+
|
23
|
+
def content_length
|
24
|
+
len = @header["Content-Length"]
|
25
|
+
return if len.nil?
|
26
|
+
|
27
|
+
len.to_i
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Response class for HTTP server
|
32
|
+
#
|
33
|
+
class Response
|
34
|
+
attr_reader :header
|
35
|
+
attr_accessor :body, :status, :status_message
|
36
|
+
|
37
|
+
def initialize(status = 200)
|
38
|
+
@status = status
|
39
|
+
@status_message = nil
|
40
|
+
@header = {}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def initialize(handle_obj, port, host, logger = Logger.new($stdout))
|
45
|
+
@handler = handle_obj
|
46
|
+
@logger = logger
|
47
|
+
|
48
|
+
super(port, host, 1, nil, logger.debug?, logger.debug?)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
attr_reader :handler, :logger
|
54
|
+
|
55
|
+
CRLF = "\r\n"
|
56
|
+
HTTP_PROTO = "HTTP/1.1"
|
57
|
+
SERVER_NAME = "SidekiqAlive/#{SidekiqAlive::VERSION} (Ruby/#{RUBY_VERSION})"
|
58
|
+
|
59
|
+
# Default header for the server name
|
60
|
+
DEFAULT_HEADER = {
|
61
|
+
"Server" => SERVER_NAME,
|
62
|
+
}
|
63
|
+
|
64
|
+
# Mapping of status codes and error messages
|
65
|
+
STATUS_CODE_MAPPING = {
|
66
|
+
200 => "OK",
|
67
|
+
400 => "Bad Request",
|
68
|
+
403 => "Forbidden",
|
69
|
+
404 => "Not Found",
|
70
|
+
405 => "Method Not Allowed",
|
71
|
+
411 => "Length Required",
|
72
|
+
500 => "Internal Server Error",
|
73
|
+
}
|
74
|
+
|
75
|
+
def serve(io)
|
76
|
+
# parse first line
|
77
|
+
if io.gets =~ /^(\S+)\s+(\S+)\s+(\S+)/
|
78
|
+
request = Request.new(io, ::Regexp.last_match(1), ::Regexp.last_match(2), ::Regexp.last_match(3))
|
79
|
+
else
|
80
|
+
io << http_resp(status_code: 400)
|
81
|
+
return
|
82
|
+
end
|
83
|
+
|
84
|
+
# parse HTTP headers
|
85
|
+
while (line = io.gets) !~ /^(\n|\r)/
|
86
|
+
if line =~ /^([\w-]+):\s*(.*)$/
|
87
|
+
request.header[::Regexp.last_match(1)] = ::Regexp.last_match(2).strip
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
io.binmode
|
92
|
+
response = Response.new
|
93
|
+
|
94
|
+
# execute request handler
|
95
|
+
handler.request_handler(request, response)
|
96
|
+
|
97
|
+
http_response = http_resp(
|
98
|
+
status_code: response.status,
|
99
|
+
status_message: response.status_message,
|
100
|
+
header: response.header,
|
101
|
+
body: response.body,
|
102
|
+
)
|
103
|
+
|
104
|
+
# write response back to the client
|
105
|
+
io << http_response
|
106
|
+
rescue StandardError
|
107
|
+
io << http_resp(status_code: 500)
|
108
|
+
end
|
109
|
+
|
110
|
+
def http_header(header = nil)
|
111
|
+
new_header = DEFAULT_HEADER.dup
|
112
|
+
new_header.merge(header) unless header.nil?
|
113
|
+
|
114
|
+
new_header["Connection"] = "Keep-Alive"
|
115
|
+
new_header["Date"] = http_date(Time.now)
|
116
|
+
|
117
|
+
new_header
|
118
|
+
end
|
119
|
+
|
120
|
+
def http_resp(status_code:, status_message: nil, header: nil, body: nil)
|
121
|
+
status_message ||= STATUS_CODE_MAPPING[status_code]
|
122
|
+
status_line = "#{HTTP_PROTO} #{status_code} #{status_message}".rstrip + CRLF
|
123
|
+
|
124
|
+
resp_header = http_header(header)
|
125
|
+
resp_header["Content-Length"] = body.bytesize.to_s unless body.nil?
|
126
|
+
header_lines = resp_header.map { |k, v| "#{k}: #{v}#{CRLF}" }.join
|
127
|
+
|
128
|
+
[status_line, header_lines, CRLF, body].compact.join
|
129
|
+
end
|
130
|
+
|
131
|
+
def http_date(a_time)
|
132
|
+
a_time.gmtime.strftime("%a, %d %b %Y %H:%M:%S GMT")
|
133
|
+
end
|
134
|
+
|
135
|
+
def log(msg)
|
136
|
+
logger.debug(msg)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "base"
|
4
|
+
|
5
|
+
module SidekiqAlive
|
6
|
+
module Server
|
7
|
+
class Rack
|
8
|
+
extend Base
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def run!
|
12
|
+
logger.info("[SidekiqAlive] Starting healthcheck '#{server}' server")
|
13
|
+
@server_pid = ::Process.fork do
|
14
|
+
@handler = handler
|
15
|
+
configure_shutdown_signal { @handler.shutdown }
|
16
|
+
configure_quiet_signal { @quiet = Time.now }
|
17
|
+
|
18
|
+
@handler.run(self, Port: port, Host: host, AccessLog: [], Logger: logger)
|
19
|
+
end
|
20
|
+
configure_shutdown
|
21
|
+
|
22
|
+
self
|
23
|
+
end
|
24
|
+
|
25
|
+
def call(env)
|
26
|
+
req = ::Rack::Request.new(env)
|
27
|
+
|
28
|
+
if req.path != path
|
29
|
+
logger.warn("[SidekiqAlive] Path '#{req.path}' not found")
|
30
|
+
return [404, {}, ["Not found"]]
|
31
|
+
end
|
32
|
+
|
33
|
+
if quiet?
|
34
|
+
logger.debug("[SidekiqAlive] [SidekiqAlive] Server in quiet mode, skipping alive key lookup!")
|
35
|
+
return [200, {}, ["Server is shutting down"]]
|
36
|
+
end
|
37
|
+
|
38
|
+
if SidekiqAlive.alive?
|
39
|
+
logger.debug("[SidekiqAlive] Found alive key!")
|
40
|
+
return [200, {}, ["Alive!"]]
|
41
|
+
end
|
42
|
+
|
43
|
+
response = "Can't find the alive key"
|
44
|
+
logger.error("[SidekiqAlive] #{response}")
|
45
|
+
[404, {}, [response]]
|
46
|
+
rescue StandardError => e
|
47
|
+
logger.error("[SidekiqAlive] #{response} looking for alive key. Error: #{e.message}")
|
48
|
+
[500, {}, ["Internal Server Error"]]
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def quiet?
|
54
|
+
@quiet && (@quiet - Time.now) < SidekiqAlive.config.quiet_timeout
|
55
|
+
end
|
56
|
+
|
57
|
+
def handler
|
58
|
+
Helpers.use_rackup? ? ::Rackup::Handler.get(server) : ::Rack::Handler.get(server)
|
59
|
+
end
|
60
|
+
|
61
|
+
def server
|
62
|
+
SidekiqAlive.config.server
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/sidekiq_alive/server.rb
CHANGED
@@ -1,45 +1,30 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "rack"
|
4
|
-
|
5
3
|
module SidekiqAlive
|
6
|
-
|
4
|
+
module Server
|
7
5
|
class << self
|
8
6
|
def run!
|
9
|
-
|
10
|
-
|
11
|
-
Signal.trap("TERM") { handler.shutdown }
|
12
|
-
|
13
|
-
handler.run(self, Port: port, Host: host, AccessLog: [], Logger: SidekiqAlive.logger)
|
7
|
+
server.run!
|
14
8
|
end
|
15
9
|
|
16
|
-
|
17
|
-
SidekiqAlive.config.host
|
18
|
-
end
|
10
|
+
private
|
19
11
|
|
20
|
-
def
|
21
|
-
|
12
|
+
def server
|
13
|
+
use_rack? ? Rack : Default
|
22
14
|
end
|
23
15
|
|
24
|
-
def
|
25
|
-
SidekiqAlive.config.
|
26
|
-
end
|
16
|
+
def use_rack?
|
17
|
+
return false unless SidekiqAlive.config.server
|
27
18
|
|
28
|
-
|
29
|
-
SidekiqAlive.config.server
|
19
|
+
Helpers.use_rackup? || Helpers.use_rack?
|
30
20
|
end
|
31
21
|
|
32
|
-
def
|
33
|
-
|
34
|
-
[404, {}, ["Not found"]]
|
35
|
-
elsif SidekiqAlive.alive?
|
36
|
-
[200, {}, ["Alive!"]]
|
37
|
-
else
|
38
|
-
response = "Can't find the alive key"
|
39
|
-
SidekiqAlive.logger.error(response)
|
40
|
-
[404, {}, [response]]
|
41
|
-
end
|
22
|
+
def logger
|
23
|
+
SidekiqAlive.logger
|
42
24
|
end
|
43
25
|
end
|
44
26
|
end
|
45
27
|
end
|
28
|
+
|
29
|
+
require_relative "server/default"
|
30
|
+
require_relative "server/rack"
|
data/lib/sidekiq_alive.rb
CHANGED
@@ -20,35 +20,35 @@ module SidekiqAlive
|
|
20
20
|
|
21
21
|
if Helpers.sidekiq_7
|
22
22
|
sq_config.capsule(CAPSULE_NAME) do |cap|
|
23
|
-
cap.concurrency =
|
23
|
+
cap.concurrency = config.concurrency
|
24
24
|
cap.queues = [current_queue]
|
25
25
|
end
|
26
26
|
else
|
27
27
|
(sq_config.respond_to?(:[]) ? sq_config[:queues] : sq_config.options[:queues]).unshift(current_queue)
|
28
28
|
end
|
29
29
|
|
30
|
-
logger.info(startup_info)
|
31
|
-
|
30
|
+
logger.info("[SidekiqAlive] #{startup_info}")
|
32
31
|
register_current_instance
|
33
|
-
|
34
32
|
store_alive_key
|
35
33
|
# Passing the hostname argument it's only for debugging enqueued jobs
|
36
34
|
SidekiqAlive::Worker.perform_async(hostname)
|
37
|
-
@
|
35
|
+
@server = SidekiqAlive::Server.run!
|
38
36
|
|
39
|
-
logger.info(successful_startup_text)
|
37
|
+
logger.info("[SidekiqAlive] #{successful_startup_text}")
|
40
38
|
end
|
41
39
|
|
42
40
|
sq_config.on(:quiet) do
|
43
|
-
|
44
|
-
|
41
|
+
logger.info("[SidekiqAlive] #{shutdown_info}")
|
42
|
+
purge_pending_jobs
|
43
|
+
# set web server to quiet mode
|
44
|
+
@server&.quiet!
|
45
45
|
end
|
46
46
|
|
47
47
|
sq_config.on(:shutdown) do
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
remove_queue
|
49
|
+
# make sure correct redis connection pool is used
|
50
|
+
# sidekiq will terminate non internal capsules
|
51
|
+
Redis.adapter("internal").zrem(HOSTNAME_REGISTRY, current_instance_register_key)
|
52
52
|
config.shutdown_callback.call
|
53
53
|
end
|
54
54
|
end
|
@@ -62,13 +62,6 @@ module SidekiqAlive
|
|
62
62
|
register_instance(current_instance_register_key)
|
63
63
|
end
|
64
64
|
|
65
|
-
def unregister_current_instance
|
66
|
-
# Delete any pending jobs for this instance
|
67
|
-
logger.info(shutdown_info)
|
68
|
-
purge_pending_jobs
|
69
|
-
redis.zrem(HOSTNAME_REGISTRY, current_instance_register_key)
|
70
|
-
end
|
71
|
-
|
72
65
|
def registered_instances
|
73
66
|
# before we return we make sure we expire old keys
|
74
67
|
expire_old_keys
|
@@ -82,9 +75,14 @@ module SidekiqAlive
|
|
82
75
|
else
|
83
76
|
schedule_set.scan('"class":"SidekiqAlive::Worker"').select { |job| job.queue == current_queue }
|
84
77
|
end
|
85
|
-
logger.info("[SidekiqAlive] Purging #{jobs.count} pending for #{hostname}")
|
86
|
-
jobs.each(&:delete)
|
87
78
|
|
79
|
+
unless jobs.empty?
|
80
|
+
logger.info("[SidekiqAlive] Purging #{jobs.count} pending jobs for #{hostname}")
|
81
|
+
jobs.each(&:delete)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def remove_queue
|
88
86
|
logger.info("[SidekiqAlive] Removing queue #{current_queue}")
|
89
87
|
Sidekiq::Queue.new(current_queue).clear
|
90
88
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq_alive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrejs Cunskis
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2024-02-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -39,20 +39,6 @@ dependencies:
|
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '1.6'
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: rack-test
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
45
|
-
requirements:
|
46
|
-
- - "~>"
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version: 2.1.0
|
49
|
-
type: :development
|
50
|
-
prerelease: false
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
52
|
-
requirements:
|
53
|
-
- - "~>"
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: 2.1.0
|
56
42
|
- !ruby/object:Gem::Dependency
|
57
43
|
name: rake
|
58
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -115,28 +101,28 @@ dependencies:
|
|
115
101
|
requirements:
|
116
102
|
- - "~>"
|
117
103
|
- !ruby/object:Gem::Version
|
118
|
-
version: 0.
|
104
|
+
version: 0.50.0
|
119
105
|
type: :development
|
120
106
|
prerelease: false
|
121
107
|
version_requirements: !ruby/object:Gem::Requirement
|
122
108
|
requirements:
|
123
109
|
- - "~>"
|
124
110
|
- !ruby/object:Gem::Version
|
125
|
-
version: 0.
|
111
|
+
version: 0.50.0
|
126
112
|
- !ruby/object:Gem::Dependency
|
127
|
-
name:
|
113
|
+
name: gserver
|
128
114
|
requirement: !ruby/object:Gem::Requirement
|
129
115
|
requirements:
|
130
|
-
- - "
|
116
|
+
- - "~>"
|
131
117
|
- !ruby/object:Gem::Version
|
132
|
-
version:
|
118
|
+
version: 0.0.1
|
133
119
|
type: :runtime
|
134
120
|
prerelease: false
|
135
121
|
version_requirements: !ruby/object:Gem::Requirement
|
136
122
|
requirements:
|
137
|
-
- - "
|
123
|
+
- - "~>"
|
138
124
|
- !ruby/object:Gem::Version
|
139
|
-
version:
|
125
|
+
version: 0.0.1
|
140
126
|
- !ruby/object:Gem::Dependency
|
141
127
|
name: sidekiq
|
142
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,26 +143,6 @@ dependencies:
|
|
157
143
|
- - "<"
|
158
144
|
- !ruby/object:Gem::Version
|
159
145
|
version: '8'
|
160
|
-
- !ruby/object:Gem::Dependency
|
161
|
-
name: webrick
|
162
|
-
requirement: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - ">="
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '1'
|
167
|
-
- - "<"
|
168
|
-
- !ruby/object:Gem::Version
|
169
|
-
version: '2'
|
170
|
-
type: :runtime
|
171
|
-
prerelease: false
|
172
|
-
version_requirements: !ruby/object:Gem::Requirement
|
173
|
-
requirements:
|
174
|
-
- - ">="
|
175
|
-
- !ruby/object:Gem::Version
|
176
|
-
version: '1'
|
177
|
-
- - "<"
|
178
|
-
- !ruby/object:Gem::Version
|
179
|
-
version: '2'
|
180
146
|
description: |
|
181
147
|
SidekiqAlive offers a solution to add liveness probe of a Sidekiq instance.
|
182
148
|
|
@@ -204,6 +170,10 @@ files:
|
|
204
170
|
- lib/sidekiq_alive/redis/redis_client_gem.rb
|
205
171
|
- lib/sidekiq_alive/redis/redis_gem.rb
|
206
172
|
- lib/sidekiq_alive/server.rb
|
173
|
+
- lib/sidekiq_alive/server/base.rb
|
174
|
+
- lib/sidekiq_alive/server/default.rb
|
175
|
+
- lib/sidekiq_alive/server/http_server.rb
|
176
|
+
- lib/sidekiq_alive/server/rack.rb
|
207
177
|
- lib/sidekiq_alive/version.rb
|
208
178
|
- lib/sidekiq_alive/worker.rb
|
209
179
|
homepage: https://github.com/arturictus/sidekiq_alive
|
@@ -213,7 +183,7 @@ metadata:
|
|
213
183
|
homepage_uri: https://github.com/arturictus/sidekiq_alive
|
214
184
|
source_code_uri: https://github.com/arturictus/sidekiq_alive
|
215
185
|
changelog_uri: https://github.com/arturictus/sidekiq_alive/releases
|
216
|
-
documentation_uri: https://github.com/arturictus/sidekiq_alive/blob/v2.
|
186
|
+
documentation_uri: https://github.com/arturictus/sidekiq_alive/blob/v2.4.0/README.md
|
217
187
|
bug_tracker_uri: https://github.com/arturictus/sidekiq_alive/issues
|
218
188
|
post_install_message:
|
219
189
|
rdoc_options: []
|