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.

Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +203 -5
  3. data/LICENSE.txt +9 -0
  4. data/README.md +20 -14
  5. data/bin/sidekiq +4 -9
  6. data/bin/sidekiqload +71 -76
  7. data/bin/sidekiqmon +1 -1
  8. data/lib/generators/sidekiq/job_generator.rb +57 -0
  9. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  10. data/lib/generators/sidekiq/templates/{worker_spec.rb.erb → job_spec.rb.erb} +1 -1
  11. data/lib/generators/sidekiq/templates/{worker_test.rb.erb → job_test.rb.erb} +1 -1
  12. data/lib/sidekiq/api.rb +334 -229
  13. data/lib/sidekiq/capsule.rb +110 -0
  14. data/lib/sidekiq/cli.rb +91 -79
  15. data/lib/sidekiq/client.rb +74 -85
  16. data/lib/sidekiq/{util.rb → component.rb} +13 -14
  17. data/lib/sidekiq/config.rb +271 -0
  18. data/lib/sidekiq/deploy.rb +62 -0
  19. data/lib/sidekiq/embedded.rb +61 -0
  20. data/lib/sidekiq/fetch.rb +26 -24
  21. data/lib/sidekiq/{worker.rb → job.rb} +162 -28
  22. data/lib/sidekiq/job_logger.rb +17 -29
  23. data/lib/sidekiq/job_retry.rb +79 -60
  24. data/lib/sidekiq/job_util.rb +71 -0
  25. data/lib/sidekiq/launcher.rb +96 -96
  26. data/lib/sidekiq/logger.rb +9 -44
  27. data/lib/sidekiq/manager.rb +40 -41
  28. data/lib/sidekiq/metrics/query.rb +153 -0
  29. data/lib/sidekiq/metrics/shared.rb +95 -0
  30. data/lib/sidekiq/metrics/tracking.rb +134 -0
  31. data/lib/sidekiq/middleware/chain.rb +89 -45
  32. data/lib/sidekiq/middleware/current_attributes.rb +58 -0
  33. data/lib/sidekiq/middleware/i18n.rb +6 -4
  34. data/lib/sidekiq/middleware/modules.rb +21 -0
  35. data/lib/sidekiq/monitor.rb +1 -1
  36. data/lib/sidekiq/paginator.rb +16 -8
  37. data/lib/sidekiq/processor.rb +56 -59
  38. data/lib/sidekiq/rails.rb +17 -5
  39. data/lib/sidekiq/redis_client_adapter.rb +118 -0
  40. data/lib/sidekiq/redis_connection.rb +17 -88
  41. data/lib/sidekiq/ring_buffer.rb +29 -0
  42. data/lib/sidekiq/scheduled.rb +102 -39
  43. data/lib/sidekiq/testing/inline.rb +4 -4
  44. data/lib/sidekiq/testing.rb +42 -71
  45. data/lib/sidekiq/transaction_aware_client.rb +44 -0
  46. data/lib/sidekiq/version.rb +2 -1
  47. data/lib/sidekiq/web/action.rb +3 -3
  48. data/lib/sidekiq/web/application.rb +33 -12
  49. data/lib/sidekiq/web/csrf_protection.rb +12 -9
  50. data/lib/sidekiq/web/helpers.rb +30 -40
  51. data/lib/sidekiq/web.rb +9 -19
  52. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  53. data/lib/sidekiq.rb +86 -201
  54. data/sidekiq.gemspec +30 -6
  55. data/web/assets/javascripts/application.js +113 -60
  56. data/web/assets/javascripts/base-charts.js +106 -0
  57. data/web/assets/javascripts/chart.min.js +13 -0
  58. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  59. data/web/assets/javascripts/dashboard-charts.js +166 -0
  60. data/web/assets/javascripts/dashboard.js +36 -273
  61. data/web/assets/javascripts/metrics.js +236 -0
  62. data/web/assets/stylesheets/application-dark.css +28 -45
  63. data/web/assets/stylesheets/application-rtl.css +2 -95
  64. data/web/assets/stylesheets/application.css +84 -529
  65. data/web/locales/ar.yml +71 -65
  66. data/web/locales/cs.yml +62 -62
  67. data/web/locales/da.yml +52 -52
  68. data/web/locales/de.yml +65 -65
  69. data/web/locales/el.yml +43 -24
  70. data/web/locales/en.yml +83 -67
  71. data/web/locales/es.yml +70 -54
  72. data/web/locales/fa.yml +65 -65
  73. data/web/locales/fr.yml +69 -62
  74. data/web/locales/he.yml +65 -64
  75. data/web/locales/hi.yml +59 -59
  76. data/web/locales/it.yml +53 -53
  77. data/web/locales/ja.yml +72 -66
  78. data/web/locales/ko.yml +52 -52
  79. data/web/locales/lt.yml +66 -66
  80. data/web/locales/nb.yml +61 -61
  81. data/web/locales/nl.yml +52 -52
  82. data/web/locales/pl.yml +45 -45
  83. data/web/locales/pt-br.yml +63 -55
  84. data/web/locales/pt.yml +51 -51
  85. data/web/locales/ru.yml +67 -66
  86. data/web/locales/sv.yml +53 -53
  87. data/web/locales/ta.yml +60 -60
  88. data/web/locales/uk.yml +62 -61
  89. data/web/locales/ur.yml +64 -64
  90. data/web/locales/vi.yml +67 -67
  91. data/web/locales/zh-cn.yml +37 -11
  92. data/web/locales/zh-tw.yml +42 -8
  93. data/web/views/_footer.erb +6 -3
  94. data/web/views/_job_info.erb +1 -1
  95. data/web/views/_nav.erb +1 -1
  96. data/web/views/_poll_link.erb +2 -5
  97. data/web/views/_summary.erb +7 -7
  98. data/web/views/busy.erb +17 -11
  99. data/web/views/dashboard.erb +58 -18
  100. data/web/views/dead.erb +1 -1
  101. data/web/views/layout.erb +1 -1
  102. data/web/views/metrics.erb +80 -0
  103. data/web/views/metrics_for_job.erb +69 -0
  104. data/web/views/morgue.erb +6 -6
  105. data/web/views/queue.erb +15 -11
  106. data/web/views/queues.erb +3 -3
  107. data/web/views/retries.erb +7 -7
  108. data/web/views/retry.erb +1 -1
  109. data/web/views/scheduled.erb +1 -1
  110. metadata +78 -28
  111. data/LICENSE +0 -9
  112. data/lib/generators/sidekiq/worker_generator.rb +0 -57
  113. data/lib/sidekiq/delay.rb +0 -41
  114. data/lib/sidekiq/exception_handler.rb +0 -27
  115. data/lib/sidekiq/extensions/action_mailer.rb +0 -48
  116. data/lib/sidekiq/extensions/active_record.rb +0 -43
  117. data/lib/sidekiq/extensions/class_methods.rb +0 -43
  118. 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 Util
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? && Sidekiq.log_formatter.is_a?(Sidekiq::Logger::Formatters::Pretty)
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 sig do
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 = Sidekiq.redis_info
63
- ver = info["redis_version"]
64
- raise "You are connecting to Redis v#{ver}, Sidekiq requires Redis v4.0.0 or greater" if ver < "4"
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
- cursize = Sidekiq.redis_pool.size
81
- needed = Sidekiq.options[:concurrency] + 2
82
- raise "Your pool of #{cursize} Redis connections is too small, please increase the size to at least #{needed}" if cursize < needed
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
- Sidekiq.options[:identity] = identity
98
+ @config[:identity] = identity
86
99
 
87
100
  # Touch middleware so it isn't lazy loaded by multiple threads, #3043
88
- Sidekiq.server_middleware
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: #{Sidekiq.client_middleware.map(&:klass).join(", ")}" }
95
- logger.debug { "Server Middleware: #{Sidekiq.server_middleware.map(&:klass).join(", ")}" }
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(options)
118
+ @launcher = Sidekiq::Launcher.new(@config)
106
119
 
107
120
  begin
108
121
  launcher.run
109
122
 
110
- while (readable_io = IO.select([self_read]))
111
- signal = readable_io.first[0].gets.strip
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
- def self.w
129
- "\e[37m"
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} $: ,$$: #{r} / ___|(_) __| | ___| | _(_) __ _
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
- Sidekiq.logger.info "Received TSTP, no longer accepting new work"
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
- Sidekiq.logger.warn "Thread TID-#{(thread.object_id ^ ::Process.pid).to_s(36)} #{thread.name}"
201
+ cli.logger.warn "Thread TID-#{(thread.object_id ^ ::Process.pid).to_s(36)} #{thread.name}"
174
202
  if thread.backtrace
175
- Sidekiq.logger.warn thread.backtrace.join("\n")
203
+ cli.logger.warn thread.backtrace.join("\n")
176
204
  else
177
- Sidekiq.logger.warn "<no backtrace available>"
205
+ cli.logger.warn "<no backtrace available>"
178
206
  end
179
207
  end
180
208
  }
181
209
  }
182
- UNHANDLED_SIGNAL_HANDLER = ->(cli) { Sidekiq.logger.info "No signal handler registered, ignoring" }
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
- Sidekiq.logger.debug "Got #{sig} signal"
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(options[:require], "config")
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
- options.merge!(opts)
250
- end
277
+ @config.merge!(opts)
251
278
 
252
- def options
253
- Sidekiq.options
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?(options[:require])
295
+ if File.directory?(@config[:require])
260
296
  require "rails"
261
- if ::Rails::VERSION::MAJOR < 5
262
- raise "Sidekiq no longer supports this version of Rails"
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
- options[:tag] ||= default_tag
300
+ require "sidekiq/rails"
301
+ require File.expand_path("#{@config[:require]}/config/environment.rb")
302
+ @config[:tag] ||= default_tag
268
303
  else
269
- require options[: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?(options[:require]) ||
287
- (File.directory?(options[:require]) && !File.exist?("#{options[:require]}/config/application.rb"))
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 worker classes with -r [DIR|FILE]."
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}: #{options[opt]} is not a valid value" if options.key?(opt) && options[opt].to_i <= 0
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
- queue, weight = arg.split(",")
328
- parse_queue opts, queue, weight
358
+ opts[:queues] ||= []
359
+ opts[:queues] << arg
329
360
  end
330
361
 
331
- o.on "-r", "--require [PATH|DIR]", "Location of Rails application with workers or file to require" do |arg|
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 "-L", "--logfile PATH", "path to writable logfile" do |arg|
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
- Sidekiq.logger.level = ::Logger::DEBUG if options[:verbose]
394
+ @config.logger.level = ::Logger::DEBUG if @config[:verbose]
372
395
  end
373
396
 
374
397
  def parse_config(path)
375
- opts = YAML.load(ERB.new(File.read(path)).result) || {}
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"