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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 562294aa960a1c1cd11b0a020b0f7cce26f09ee4c2faeb7044e21fd9bf3be8c5
4
- data.tar.gz: c31918f4c756cc551a3dcab2ea0d2c781c394e23e463c0a2c72ae68bfb52cd16
3
+ metadata.gz: 203a0459203c7e31aa2a223c7a6a2eea009f109697843b83eacd73577606487b
4
+ data.tar.gz: b85f281d7fc890744c303a51c46bdd846c3101e0acd44f3557a3549a00f25807
5
5
  SHA512:
6
- metadata.gz: 595baafc8b0499bb8f900cdaf3eac250d623ba3b51d65b4510d311b2913b1e0560fc967c63dbeaf9145cab43527a5d133b7af6127492103e0caf8538b61ed55e
7
- data.tar.gz: 05deade6b05eb839fb0c6d1c0d08768b2141cc24c61cdd2edc1aa453338b12bc7b5bce3a8d19692968a7f85939541519fb6c70eb759273c1b2fe5afffce8b413
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, like cleaning up created queue
250
+ # When sidekiq process is shutting down, you can perform some arbitrary action.
251
251
  # default: proc {}
252
252
  #
253
- # config.shutdown_callback = proc do
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: 'webrick'
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
 
@@ -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:)
@@ -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
@@ -1,45 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "rack"
4
-
5
3
  module SidekiqAlive
6
- class Server
4
+ module Server
7
5
  class << self
8
6
  def run!
9
- handler = Rack::Handler.get(server)
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
- def host
17
- SidekiqAlive.config.host
18
- end
10
+ private
19
11
 
20
- def port
21
- SidekiqAlive.config.port
12
+ def server
13
+ use_rack? ? Rack : Default
22
14
  end
23
15
 
24
- def path
25
- SidekiqAlive.config.path
26
- end
16
+ def use_rack?
17
+ return false unless SidekiqAlive.config.server
27
18
 
28
- def server
29
- SidekiqAlive.config.server
19
+ Helpers.use_rackup? || Helpers.use_rack?
30
20
  end
31
21
 
32
- def call(env)
33
- if Rack::Request.new(env).path != path
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"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SidekiqAlive
4
- VERSION = "2.3.0"
4
+ VERSION = "2.4.0"
5
5
  end
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 = 2
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
- @server_pid = fork { SidekiqAlive::Server.run! }
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
- unregister_current_instance
44
- config.shutdown_callback.call
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
- Process.kill("TERM", @server_pid) unless @server_pid.nil?
49
- Process.wait(@server_pid) unless @server_pid.nil?
50
-
51
- unregister_current_instance
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.3.0
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: 2023-09-07 00:00:00.000000000 Z
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.49.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.49.0
111
+ version: 0.50.0
126
112
  - !ruby/object:Gem::Dependency
127
- name: rack
113
+ name: gserver
128
114
  requirement: !ruby/object:Gem::Requirement
129
115
  requirements:
130
- - - "<"
116
+ - - "~>"
131
117
  - !ruby/object:Gem::Version
132
- version: '3'
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: '3'
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.3.0/README.md
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: []