sidekiq 6.2.0 → 7.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sidekiq might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Changes.md +203 -5
- data/LICENSE.txt +9 -0
- data/README.md +20 -14
- data/bin/sidekiq +4 -9
- data/bin/sidekiqload +71 -76
- data/bin/sidekiqmon +1 -1
- data/lib/generators/sidekiq/job_generator.rb +57 -0
- data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
- data/lib/generators/sidekiq/templates/{worker_spec.rb.erb → job_spec.rb.erb} +1 -1
- data/lib/generators/sidekiq/templates/{worker_test.rb.erb → job_test.rb.erb} +1 -1
- data/lib/sidekiq/api.rb +334 -229
- data/lib/sidekiq/capsule.rb +110 -0
- data/lib/sidekiq/cli.rb +91 -79
- data/lib/sidekiq/client.rb +74 -85
- data/lib/sidekiq/{util.rb → component.rb} +13 -14
- data/lib/sidekiq/config.rb +271 -0
- data/lib/sidekiq/deploy.rb +62 -0
- data/lib/sidekiq/embedded.rb +61 -0
- data/lib/sidekiq/fetch.rb +26 -24
- data/lib/sidekiq/{worker.rb → job.rb} +162 -28
- data/lib/sidekiq/job_logger.rb +17 -29
- data/lib/sidekiq/job_retry.rb +79 -60
- data/lib/sidekiq/job_util.rb +71 -0
- data/lib/sidekiq/launcher.rb +96 -96
- data/lib/sidekiq/logger.rb +9 -44
- data/lib/sidekiq/manager.rb +40 -41
- data/lib/sidekiq/metrics/query.rb +153 -0
- data/lib/sidekiq/metrics/shared.rb +95 -0
- data/lib/sidekiq/metrics/tracking.rb +134 -0
- data/lib/sidekiq/middleware/chain.rb +89 -45
- data/lib/sidekiq/middleware/current_attributes.rb +58 -0
- data/lib/sidekiq/middleware/i18n.rb +6 -4
- data/lib/sidekiq/middleware/modules.rb +21 -0
- data/lib/sidekiq/monitor.rb +1 -1
- data/lib/sidekiq/paginator.rb +16 -8
- data/lib/sidekiq/processor.rb +56 -59
- data/lib/sidekiq/rails.rb +17 -5
- data/lib/sidekiq/redis_client_adapter.rb +118 -0
- data/lib/sidekiq/redis_connection.rb +17 -88
- data/lib/sidekiq/ring_buffer.rb +29 -0
- data/lib/sidekiq/scheduled.rb +102 -39
- data/lib/sidekiq/testing/inline.rb +4 -4
- data/lib/sidekiq/testing.rb +42 -71
- data/lib/sidekiq/transaction_aware_client.rb +44 -0
- data/lib/sidekiq/version.rb +2 -1
- data/lib/sidekiq/web/action.rb +3 -3
- data/lib/sidekiq/web/application.rb +33 -12
- data/lib/sidekiq/web/csrf_protection.rb +12 -9
- data/lib/sidekiq/web/helpers.rb +30 -40
- data/lib/sidekiq/web.rb +9 -19
- data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
- data/lib/sidekiq.rb +86 -201
- data/sidekiq.gemspec +30 -6
- data/web/assets/javascripts/application.js +113 -60
- data/web/assets/javascripts/base-charts.js +106 -0
- data/web/assets/javascripts/chart.min.js +13 -0
- data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
- data/web/assets/javascripts/dashboard-charts.js +166 -0
- data/web/assets/javascripts/dashboard.js +36 -273
- data/web/assets/javascripts/metrics.js +236 -0
- data/web/assets/stylesheets/application-dark.css +28 -45
- data/web/assets/stylesheets/application-rtl.css +2 -95
- data/web/assets/stylesheets/application.css +84 -529
- data/web/locales/ar.yml +71 -65
- data/web/locales/cs.yml +62 -62
- data/web/locales/da.yml +52 -52
- data/web/locales/de.yml +65 -65
- data/web/locales/el.yml +43 -24
- data/web/locales/en.yml +83 -67
- data/web/locales/es.yml +70 -54
- data/web/locales/fa.yml +65 -65
- data/web/locales/fr.yml +69 -62
- data/web/locales/he.yml +65 -64
- data/web/locales/hi.yml +59 -59
- data/web/locales/it.yml +53 -53
- data/web/locales/ja.yml +72 -66
- data/web/locales/ko.yml +52 -52
- data/web/locales/lt.yml +66 -66
- data/web/locales/nb.yml +61 -61
- data/web/locales/nl.yml +52 -52
- data/web/locales/pl.yml +45 -45
- data/web/locales/pt-br.yml +63 -55
- data/web/locales/pt.yml +51 -51
- data/web/locales/ru.yml +67 -66
- data/web/locales/sv.yml +53 -53
- data/web/locales/ta.yml +60 -60
- data/web/locales/uk.yml +62 -61
- data/web/locales/ur.yml +64 -64
- data/web/locales/vi.yml +67 -67
- data/web/locales/zh-cn.yml +37 -11
- data/web/locales/zh-tw.yml +42 -8
- data/web/views/_footer.erb +6 -3
- data/web/views/_job_info.erb +1 -1
- data/web/views/_nav.erb +1 -1
- data/web/views/_poll_link.erb +2 -5
- data/web/views/_summary.erb +7 -7
- data/web/views/busy.erb +17 -11
- data/web/views/dashboard.erb +58 -18
- data/web/views/dead.erb +1 -1
- data/web/views/layout.erb +1 -1
- data/web/views/metrics.erb +80 -0
- data/web/views/metrics_for_job.erb +69 -0
- data/web/views/morgue.erb +6 -6
- data/web/views/queue.erb +15 -11
- data/web/views/queues.erb +3 -3
- data/web/views/retries.erb +7 -7
- data/web/views/retry.erb +1 -1
- data/web/views/scheduled.erb +1 -1
- metadata +78 -28
- data/LICENSE +0 -9
- data/lib/generators/sidekiq/worker_generator.rb +0 -57
- data/lib/sidekiq/delay.rb +0 -41
- data/lib/sidekiq/exception_handler.rb +0 -27
- data/lib/sidekiq/extensions/action_mailer.rb +0 -48
- data/lib/sidekiq/extensions/active_record.rb +0 -43
- data/lib/sidekiq/extensions/class_methods.rb +0 -43
- data/lib/sidekiq/extensions/generic_proxy.rb +0 -31
@@ -0,0 +1,110 @@
|
|
1
|
+
require "sidekiq/component"
|
2
|
+
|
3
|
+
module Sidekiq
|
4
|
+
# A Sidekiq::Capsule is the set of resources necessary to
|
5
|
+
# process one or more queues with a given concurrency.
|
6
|
+
# One "default" Capsule is started but the user may declare additional
|
7
|
+
# Capsules in their initializer.
|
8
|
+
#
|
9
|
+
# This capsule will pull jobs from the "single" queue and process
|
10
|
+
# the jobs with one thread, meaning the jobs will be processed serially.
|
11
|
+
#
|
12
|
+
# Sidekiq.configure_server do |config|
|
13
|
+
# config.capsule("single-threaded") do |cap|
|
14
|
+
# cap.concurrency = 1
|
15
|
+
# cap.queues = %w(single)
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
class Capsule
|
19
|
+
include Sidekiq::Component
|
20
|
+
|
21
|
+
attr_reader :name
|
22
|
+
attr_reader :queues
|
23
|
+
attr_accessor :concurrency
|
24
|
+
|
25
|
+
def initialize(name, config)
|
26
|
+
@name = name
|
27
|
+
@config = config
|
28
|
+
@queues = ["default"]
|
29
|
+
@concurrency = config[:concurrency]
|
30
|
+
end
|
31
|
+
|
32
|
+
def fetcher
|
33
|
+
@fetcher ||= begin
|
34
|
+
inst = (config[:fetch_class] || Sidekiq::BasicFetch).new(self)
|
35
|
+
inst.setup(config[:fetch_setup]) if inst.respond_to?(:setup)
|
36
|
+
inst
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def stop
|
41
|
+
fetcher&.bulk_requeue([])
|
42
|
+
end
|
43
|
+
|
44
|
+
def queues=(val)
|
45
|
+
@queues = Array(val).each_with_object([]) do |qstr, memo|
|
46
|
+
arr = qstr
|
47
|
+
arr = qstr.split(",") if qstr.is_a?(String)
|
48
|
+
name, weight = arr
|
49
|
+
[weight.to_i, 1].max.times do
|
50
|
+
memo << name
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Allow the middleware to be different per-capsule.
|
56
|
+
# Avoid if possible and add middleware globally so all
|
57
|
+
# capsules share the same chains. Easier to debug that way.
|
58
|
+
def client_middleware
|
59
|
+
@client_chain ||= config.client_middleware.copy_for(self)
|
60
|
+
yield @client_chain if block_given?
|
61
|
+
@client_chain
|
62
|
+
end
|
63
|
+
|
64
|
+
def server_middleware
|
65
|
+
@server_chain ||= config.server_middleware.copy_for(self)
|
66
|
+
yield @server_chain if block_given?
|
67
|
+
@server_chain
|
68
|
+
end
|
69
|
+
|
70
|
+
def redis_pool
|
71
|
+
Thread.current[:sidekiq_redis_pool] || local_redis_pool
|
72
|
+
end
|
73
|
+
|
74
|
+
def local_redis_pool
|
75
|
+
# connection pool is lazy, it will not create connections unless you actually need them
|
76
|
+
# so don't be skimpy!
|
77
|
+
@redis ||= config.new_redis_pool(@concurrency, name)
|
78
|
+
end
|
79
|
+
|
80
|
+
def redis
|
81
|
+
raise ArgumentError, "requires a block" unless block_given?
|
82
|
+
redis_pool.with do |conn|
|
83
|
+
retryable = true
|
84
|
+
begin
|
85
|
+
yield conn
|
86
|
+
rescue RedisClientAdapter::BaseError => ex
|
87
|
+
# 2550 Failover can cause the server to become a replica, need
|
88
|
+
# to disconnect and reopen the socket to get back to the primary.
|
89
|
+
# 4495 Use the same logic if we have a "Not enough replicas" error from the primary
|
90
|
+
# 4985 Use the same logic when a blocking command is force-unblocked
|
91
|
+
# The same retry logic is also used in client.rb
|
92
|
+
if retryable && ex.message =~ /READONLY|NOREPLICAS|UNBLOCKED/
|
93
|
+
conn.close
|
94
|
+
retryable = false
|
95
|
+
retry
|
96
|
+
end
|
97
|
+
raise
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def lookup(name)
|
103
|
+
config.lookup(name)
|
104
|
+
end
|
105
|
+
|
106
|
+
def logger
|
107
|
+
config.logger
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
data/lib/sidekiq/cli.rb
CHANGED
@@ -9,18 +9,23 @@ require "erb"
|
|
9
9
|
require "fileutils"
|
10
10
|
|
11
11
|
require "sidekiq"
|
12
|
+
require "sidekiq/config"
|
13
|
+
require "sidekiq/component"
|
14
|
+
require "sidekiq/capsule"
|
12
15
|
require "sidekiq/launcher"
|
13
|
-
require "sidekiq/util"
|
14
16
|
|
15
|
-
module Sidekiq
|
17
|
+
module Sidekiq # :nodoc:
|
16
18
|
class CLI
|
17
|
-
include
|
19
|
+
include Sidekiq::Component
|
18
20
|
include Singleton unless $TESTING
|
19
21
|
|
20
22
|
attr_accessor :launcher
|
21
23
|
attr_accessor :environment
|
24
|
+
attr_accessor :config
|
25
|
+
|
26
|
+
def parse(args = ARGV.dup)
|
27
|
+
@config ||= Sidekiq.default_configuration
|
22
28
|
|
23
|
-
def parse(args = ARGV)
|
24
29
|
setup_options(args)
|
25
30
|
initialize_logger
|
26
31
|
validate!
|
@@ -36,7 +41,7 @@ module Sidekiq
|
|
36
41
|
def run(boot_app: true)
|
37
42
|
boot_application if boot_app
|
38
43
|
|
39
|
-
if environment == "development" && $stdout.tty? &&
|
44
|
+
if environment == "development" && $stdout.tty? && @config.logger.formatter.is_a?(Sidekiq::Logger::Formatters::Pretty)
|
40
45
|
print_banner
|
41
46
|
end
|
42
47
|
logger.info "Booted Rails #{::Rails.version} application in #{environment} environment" if rails_app?
|
@@ -46,7 +51,15 @@ module Sidekiq
|
|
46
51
|
# USR1 and USR2 don't work on the JVM
|
47
52
|
sigs << "USR2" if Sidekiq.pro? && !jruby?
|
48
53
|
sigs.each do |sig|
|
49
|
-
trap
|
54
|
+
old_handler = Signal.trap(sig) do
|
55
|
+
if old_handler.respond_to?(:call)
|
56
|
+
begin
|
57
|
+
old_handler.call
|
58
|
+
rescue Exception => exc
|
59
|
+
# signal handlers can't use Logger so puts only
|
60
|
+
puts ["Error in #{sig} handler", exc].inspect
|
61
|
+
end
|
62
|
+
end
|
50
63
|
self_write.puts(sig)
|
51
64
|
end
|
52
65
|
rescue ArgumentError
|
@@ -59,9 +72,9 @@ module Sidekiq
|
|
59
72
|
|
60
73
|
# touch the connection pool so it is created before we
|
61
74
|
# fire startup and start multithreading.
|
62
|
-
info =
|
63
|
-
ver = info["redis_version"]
|
64
|
-
raise "You are connecting to Redis
|
75
|
+
info = @config.redis_info
|
76
|
+
ver = Gem::Version.new(info["redis_version"])
|
77
|
+
raise "You are connecting to Redis #{ver}, Sidekiq requires Redis 6.2.0 or greater" if ver < Gem::Version.new("6.2.0")
|
65
78
|
|
66
79
|
maxmemory_policy = info["maxmemory_policy"]
|
67
80
|
if maxmemory_policy != "noeviction"
|
@@ -77,22 +90,22 @@ module Sidekiq
|
|
77
90
|
|
78
91
|
# Since the user can pass us a connection pool explicitly in the initializer, we
|
79
92
|
# need to verify the size is large enough or else Sidekiq's performance is dramatically slowed.
|
80
|
-
|
81
|
-
|
82
|
-
|
93
|
+
@config.capsules.each_pair do |name, cap|
|
94
|
+
raise ArgumentError, "Pool size too small for #{name}" if cap.redis_pool.size < cap.concurrency
|
95
|
+
end
|
83
96
|
|
84
97
|
# cache process identity
|
85
|
-
|
98
|
+
@config[:identity] = identity
|
86
99
|
|
87
100
|
# Touch middleware so it isn't lazy loaded by multiple threads, #3043
|
88
|
-
|
101
|
+
@config.server_middleware
|
89
102
|
|
90
103
|
# Before this point, the process is initializing with just the main thread.
|
91
104
|
# Starting here the process will now have multiple threads running.
|
92
105
|
fire_event(:startup, reverse: false, reraise: true)
|
93
106
|
|
94
|
-
logger.debug { "Client Middleware: #{
|
95
|
-
logger.debug { "Server Middleware: #{
|
107
|
+
logger.debug { "Client Middleware: #{@config.default_capsule.client_middleware.map(&:klass).join(", ")}" }
|
108
|
+
logger.debug { "Server Middleware: #{@config.default_capsule.server_middleware.map(&:klass).join(", ")}" }
|
96
109
|
|
97
110
|
launch(self_read)
|
98
111
|
end
|
@@ -102,13 +115,13 @@ module Sidekiq
|
|
102
115
|
logger.info "Starting processing, hit Ctrl-C to stop"
|
103
116
|
end
|
104
117
|
|
105
|
-
@launcher = Sidekiq::Launcher.new(
|
118
|
+
@launcher = Sidekiq::Launcher.new(@config)
|
106
119
|
|
107
120
|
begin
|
108
121
|
launcher.run
|
109
122
|
|
110
|
-
while
|
111
|
-
signal =
|
123
|
+
while self_read.wait_readable
|
124
|
+
signal = self_read.gets.strip
|
112
125
|
handle_signal(signal)
|
113
126
|
end
|
114
127
|
rescue Interrupt
|
@@ -125,19 +138,34 @@ module Sidekiq
|
|
125
138
|
end
|
126
139
|
end
|
127
140
|
|
128
|
-
|
129
|
-
|
141
|
+
HOLIDAY_COLORS = {
|
142
|
+
# got other color-specific holidays from around the world?
|
143
|
+
# https://developer-book.com/post/definitive-guide-for-colored-text-in-terminal/#256-color-escape-codes
|
144
|
+
"3-17" => "\e[1;32m", # St. Patrick's Day green
|
145
|
+
"10-31" => "\e[38;5;208m" # Halloween orange
|
146
|
+
}
|
147
|
+
|
148
|
+
def self.day
|
149
|
+
@@day ||= begin
|
150
|
+
t = Date.today
|
151
|
+
"#{t.month}-#{t.day}"
|
152
|
+
end
|
130
153
|
end
|
131
154
|
|
132
155
|
def self.r
|
133
|
-
"\e[31m"
|
156
|
+
@@r ||= HOLIDAY_COLORS[day] || "\e[1;31m"
|
134
157
|
end
|
135
158
|
|
136
159
|
def self.b
|
137
|
-
"\e[30m"
|
160
|
+
@@b ||= HOLIDAY_COLORS[day] || "\e[30m"
|
161
|
+
end
|
162
|
+
|
163
|
+
def self.w
|
164
|
+
"\e[1;37m"
|
138
165
|
end
|
139
166
|
|
140
167
|
def self.reset
|
168
|
+
@@b = @@r = @@day = nil
|
141
169
|
"\e[0m"
|
142
170
|
end
|
143
171
|
|
@@ -150,7 +178,7 @@ module Sidekiq
|
|
150
178
|
#{w} ,$$$$$b#{b}/#{w}md$$$P^'
|
151
179
|
#{w} .d$$$$$$#{b}/#{w}$$$P'
|
152
180
|
#{w} $$^' `"#{b}/#{w}$$$' #{r}____ _ _ _ _
|
153
|
-
#{w} $:
|
181
|
+
#{w} $: #{b}'#{w},$$: #{r} / ___|(_) __| | ___| | _(_) __ _
|
154
182
|
#{w} `b :$$ #{r} \\___ \\| |/ _` |/ _ \\ |/ / |/ _` |
|
155
183
|
#{w} $$: #{r} ___) | | (_| | __/ <| | (_| |
|
156
184
|
#{w} $$ #{r}|____/|_|\\__,_|\\___|_|\\_\\_|\\__, |
|
@@ -165,25 +193,25 @@ module Sidekiq
|
|
165
193
|
# Heroku sends TERM and then waits 30 seconds for process to exit.
|
166
194
|
"TERM" => ->(cli) { raise Interrupt },
|
167
195
|
"TSTP" => ->(cli) {
|
168
|
-
|
196
|
+
cli.logger.info "Received TSTP, no longer accepting new work"
|
169
197
|
cli.launcher.quiet
|
170
198
|
},
|
171
199
|
"TTIN" => ->(cli) {
|
172
200
|
Thread.list.each do |thread|
|
173
|
-
|
201
|
+
cli.logger.warn "Thread TID-#{(thread.object_id ^ ::Process.pid).to_s(36)} #{thread.name}"
|
174
202
|
if thread.backtrace
|
175
|
-
|
203
|
+
cli.logger.warn thread.backtrace.join("\n")
|
176
204
|
else
|
177
|
-
|
205
|
+
cli.logger.warn "<no backtrace available>"
|
178
206
|
end
|
179
207
|
end
|
180
208
|
}
|
181
209
|
}
|
182
|
-
UNHANDLED_SIGNAL_HANDLER = ->(cli) {
|
210
|
+
UNHANDLED_SIGNAL_HANDLER = ->(cli) { cli.logger.info "No signal handler registered, ignoring" }
|
183
211
|
SIGNAL_HANDLERS.default = UNHANDLED_SIGNAL_HANDLER
|
184
212
|
|
185
213
|
def handle_signal(sig)
|
186
|
-
|
214
|
+
logger.debug "Got #{sig} signal"
|
187
215
|
SIGNAL_HANDLERS[sig].call(self)
|
188
216
|
end
|
189
217
|
|
@@ -229,7 +257,7 @@ module Sidekiq
|
|
229
257
|
config_dir = if File.directory?(opts[:require].to_s)
|
230
258
|
File.join(opts[:require], "config")
|
231
259
|
else
|
232
|
-
File.join(
|
260
|
+
File.join(@config[:require], "config")
|
233
261
|
end
|
234
262
|
|
235
263
|
%w[sidekiq.yml sidekiq.yml.erb].each do |config_file|
|
@@ -246,27 +274,34 @@ module Sidekiq
|
|
246
274
|
opts[:concurrency] = Integer(ENV["RAILS_MAX_THREADS"]) if opts[:concurrency].nil? && ENV["RAILS_MAX_THREADS"]
|
247
275
|
|
248
276
|
# merge with defaults
|
249
|
-
|
250
|
-
end
|
277
|
+
@config.merge!(opts)
|
251
278
|
|
252
|
-
|
253
|
-
|
279
|
+
@config.default_capsule.tap do |cap|
|
280
|
+
cap.queues = opts[:queues]
|
281
|
+
cap.concurrency = opts[:concurrency] || @config[:concurrency]
|
282
|
+
end
|
283
|
+
|
284
|
+
opts[:capsules]&.each do |name, cap_config|
|
285
|
+
@config.capsule(name.to_s) do |cap|
|
286
|
+
cap.queues = cap_config[:queues]
|
287
|
+
cap.concurrency = cap_config[:concurrency]
|
288
|
+
end
|
289
|
+
end
|
254
290
|
end
|
255
291
|
|
256
292
|
def boot_application
|
257
293
|
ENV["RACK_ENV"] = ENV["RAILS_ENV"] = environment
|
258
294
|
|
259
|
-
if File.directory?(
|
295
|
+
if File.directory?(@config[:require])
|
260
296
|
require "rails"
|
261
|
-
if ::Rails::VERSION::MAJOR <
|
262
|
-
|
263
|
-
else
|
264
|
-
require "sidekiq/rails"
|
265
|
-
require File.expand_path("#{options[:require]}/config/environment.rb")
|
297
|
+
if ::Rails::VERSION::MAJOR < 6
|
298
|
+
warn "Sidekiq #{Sidekiq::VERSION} only supports Rails 6+"
|
266
299
|
end
|
267
|
-
|
300
|
+
require "sidekiq/rails"
|
301
|
+
require File.expand_path("#{@config[:require]}/config/environment.rb")
|
302
|
+
@config[:tag] ||= default_tag
|
268
303
|
else
|
269
|
-
require
|
304
|
+
require @config[:require]
|
270
305
|
end
|
271
306
|
end
|
272
307
|
|
@@ -283,18 +318,18 @@ module Sidekiq
|
|
283
318
|
end
|
284
319
|
|
285
320
|
def validate!
|
286
|
-
if !File.exist?(
|
287
|
-
(File.directory?(
|
321
|
+
if !File.exist?(@config[:require]) ||
|
322
|
+
(File.directory?(@config[:require]) && !File.exist?("#{@config[:require]}/config/application.rb"))
|
288
323
|
logger.info "=================================================================="
|
289
324
|
logger.info " Please point Sidekiq to a Rails application or a Ruby file "
|
290
|
-
logger.info " to load your
|
325
|
+
logger.info " to load your job classes with -r [DIR|FILE]."
|
291
326
|
logger.info "=================================================================="
|
292
327
|
logger.info @parser
|
293
328
|
die(1)
|
294
329
|
end
|
295
330
|
|
296
331
|
[:concurrency, :timeout].each do |opt|
|
297
|
-
raise ArgumentError, "#{opt}: #{
|
332
|
+
raise ArgumentError, "#{opt}: #{@config[opt]} is not a valid value" if @config[opt].to_i <= 0
|
298
333
|
end
|
299
334
|
end
|
300
335
|
|
@@ -311,10 +346,6 @@ module Sidekiq
|
|
311
346
|
opts[:concurrency] = Integer(arg)
|
312
347
|
end
|
313
348
|
|
314
|
-
o.on "-d", "--daemon", "Daemonize process" do |arg|
|
315
|
-
puts "ERROR: Daemonization mode was removed in Sidekiq 6.0, please use a proper process supervisor to start and manage your services"
|
316
|
-
end
|
317
|
-
|
318
349
|
o.on "-e", "--environment ENV", "Application environment" do |arg|
|
319
350
|
opts[:environment] = arg
|
320
351
|
end
|
@@ -324,11 +355,11 @@ module Sidekiq
|
|
324
355
|
end
|
325
356
|
|
326
357
|
o.on "-q", "--queue QUEUE[,WEIGHT]", "Queues to process with optional weights" do |arg|
|
327
|
-
|
328
|
-
|
358
|
+
opts[:queues] ||= []
|
359
|
+
opts[:queues] << arg
|
329
360
|
end
|
330
361
|
|
331
|
-
o.on "-r", "--require [PATH|DIR]", "Location of Rails application with
|
362
|
+
o.on "-r", "--require [PATH|DIR]", "Location of Rails application with jobs or file to require" do |arg|
|
332
363
|
opts[:require] = arg
|
333
364
|
end
|
334
365
|
|
@@ -344,15 +375,7 @@ module Sidekiq
|
|
344
375
|
opts[:config_file] = arg
|
345
376
|
end
|
346
377
|
|
347
|
-
o.on "-
|
348
|
-
puts "ERROR: Logfile redirection was removed in Sidekiq 6.0, Sidekiq will only log to STDOUT"
|
349
|
-
end
|
350
|
-
|
351
|
-
o.on "-P", "--pidfile PATH", "path to pidfile" do |arg|
|
352
|
-
puts "ERROR: PID file creation was removed in Sidekiq 6.0, please use a proper process supervisor to start and manage your services"
|
353
|
-
end
|
354
|
-
|
355
|
-
o.on "-V", "--version", "Print version and exit" do |arg|
|
378
|
+
o.on "-V", "--version", "Print version and exit" do
|
356
379
|
puts "Sidekiq #{Sidekiq::VERSION}"
|
357
380
|
die(0)
|
358
381
|
end
|
@@ -368,11 +391,13 @@ module Sidekiq
|
|
368
391
|
end
|
369
392
|
|
370
393
|
def initialize_logger
|
371
|
-
|
394
|
+
@config.logger.level = ::Logger::DEBUG if @config[:verbose]
|
372
395
|
end
|
373
396
|
|
374
397
|
def parse_config(path)
|
375
|
-
|
398
|
+
erb = ERB.new(File.read(path))
|
399
|
+
erb.filename = File.expand_path(path)
|
400
|
+
opts = YAML.safe_load(erb.result, permitted_classes: [Symbol], aliases: true) || {}
|
376
401
|
|
377
402
|
if opts.respond_to? :deep_symbolize_keys!
|
378
403
|
opts.deep_symbolize_keys!
|
@@ -383,23 +408,9 @@ module Sidekiq
|
|
383
408
|
opts = opts.merge(opts.delete(environment.to_sym) || {})
|
384
409
|
opts.delete(:strict)
|
385
410
|
|
386
|
-
parse_queues(opts, opts.delete(:queues) || [])
|
387
|
-
|
388
411
|
opts
|
389
412
|
end
|
390
413
|
|
391
|
-
def parse_queues(opts, queues_and_weights)
|
392
|
-
queues_and_weights.each { |queue_and_weight| parse_queue(opts, *queue_and_weight) }
|
393
|
-
end
|
394
|
-
|
395
|
-
def parse_queue(opts, queue, weight = nil)
|
396
|
-
opts[:queues] ||= []
|
397
|
-
opts[:strict] = true if opts[:strict].nil?
|
398
|
-
raise ArgumentError, "queues: #{queue} cannot be defined twice" if opts[:queues].include?(queue)
|
399
|
-
[weight.to_i, 1].max.times { opts[:queues] << queue }
|
400
|
-
opts[:strict] = false if weight.to_i > 0
|
401
|
-
end
|
402
|
-
|
403
414
|
def rails_app?
|
404
415
|
defined?(::Rails) && ::Rails.respond_to?(:application)
|
405
416
|
end
|
@@ -407,3 +418,4 @@ module Sidekiq
|
|
407
418
|
end
|
408
419
|
|
409
420
|
require "sidekiq/systemd"
|
421
|
+
require "sidekiq/metrics/tracking"
|