sidekiq_alive 2.3.1 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +21 -11
- data/lib/sidekiq_alive/config.rb +5 -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 +18 -20
- 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,13 +260,6 @@ SidekiqAlive.setup do |config|
|
|
262
260
|
#
|
263
261
|
# config.queue_prefix = :other
|
264
262
|
|
265
|
-
# ==> Rack server
|
266
|
-
# Web server used to serve an HTTP response.
|
267
|
-
# Can also be set with the environment variable SIDEKIQ_ALIVE_SERVER.
|
268
|
-
# default: 'webrick'
|
269
|
-
#
|
270
|
-
# config.server = 'puma'
|
271
|
-
|
272
263
|
# ==> Concurrency
|
273
264
|
# The maximum number of Redis connections requested for the SidekiqAlive pool.
|
274
265
|
# Can also be set with the environment variable SIDEKIQ_ALIVE_CONCURRENCY.
|
@@ -276,6 +267,25 @@ SidekiqAlive.setup do |config|
|
|
276
267
|
# default: 2
|
277
268
|
#
|
278
269
|
# config.concurrency = 3
|
270
|
+
|
271
|
+
# ==> Rack server
|
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.
|
274
|
+
# Can also be set with the environment variable SIDEKIQ_ALIVE_SERVER.
|
275
|
+
# default: nil
|
276
|
+
#
|
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
|
+
|
279
289
|
end
|
280
290
|
```
|
281
291
|
|
data/lib/sidekiq_alive/config.rb
CHANGED
@@ -12,11 +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
17
|
:shutdown_callback,
|
19
|
-
:concurrency
|
18
|
+
:concurrency,
|
19
|
+
:server,
|
20
|
+
:quiet_timeout
|
20
21
|
|
21
22
|
def initialize
|
22
23
|
set_defaults
|
@@ -31,10 +32,11 @@ module SidekiqAlive
|
|
31
32
|
@callback = proc {}
|
32
33
|
@registered_instance_key = "SIDEKIQ_REGISTERED_INSTANCE"
|
33
34
|
@queue_prefix = :"sidekiq-alive"
|
34
|
-
@server = ENV.fetch("SIDEKIQ_ALIVE_SERVER", "webrick")
|
35
35
|
@custom_liveness_probe = proc { true }
|
36
36
|
@shutdown_callback = proc {}
|
37
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
|
38
40
|
end
|
39
41
|
|
40
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
@@ -27,28 +27,28 @@ module SidekiqAlive
|
|
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: []
|