sidekiq 5.0.0 → 6.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 (79) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +61 -0
  3. data/.github/issue_template.md +3 -1
  4. data/.gitignore +1 -1
  5. data/.standard.yml +20 -0
  6. data/6.0-Upgrade.md +70 -0
  7. data/COMM-LICENSE +12 -10
  8. data/Changes.md +169 -1
  9. data/Ent-2.0-Upgrade.md +37 -0
  10. data/Ent-Changes.md +76 -0
  11. data/Gemfile +16 -21
  12. data/Gemfile.lock +196 -0
  13. data/LICENSE +1 -1
  14. data/Pro-4.0-Upgrade.md +35 -0
  15. data/Pro-5.0-Upgrade.md +25 -0
  16. data/Pro-Changes.md +137 -1
  17. data/README.md +18 -30
  18. data/Rakefile +6 -8
  19. data/bin/sidekiqload +28 -24
  20. data/bin/sidekiqmon +9 -0
  21. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +1 -1
  22. data/lib/generators/sidekiq/templates/worker_test.rb.erb +1 -1
  23. data/lib/generators/sidekiq/worker_generator.rb +12 -14
  24. data/lib/sidekiq.rb +69 -49
  25. data/lib/sidekiq/api.rb +216 -160
  26. data/lib/sidekiq/cli.rb +174 -207
  27. data/lib/sidekiq/client.rb +55 -51
  28. data/lib/sidekiq/delay.rb +24 -4
  29. data/lib/sidekiq/exception_handler.rb +12 -16
  30. data/lib/sidekiq/extensions/action_mailer.rb +10 -20
  31. data/lib/sidekiq/extensions/active_record.rb +9 -7
  32. data/lib/sidekiq/extensions/class_methods.rb +9 -7
  33. data/lib/sidekiq/extensions/generic_proxy.rb +4 -4
  34. data/lib/sidekiq/fetch.rb +5 -6
  35. data/lib/sidekiq/job_logger.rb +42 -14
  36. data/lib/sidekiq/job_retry.rb +71 -57
  37. data/lib/sidekiq/launcher.rb +74 -60
  38. data/lib/sidekiq/logger.rb +69 -0
  39. data/lib/sidekiq/manager.rb +12 -15
  40. data/lib/sidekiq/middleware/chain.rb +3 -2
  41. data/lib/sidekiq/middleware/i18n.rb +5 -7
  42. data/lib/sidekiq/monitor.rb +148 -0
  43. data/lib/sidekiq/paginator.rb +11 -12
  44. data/lib/sidekiq/processor.rb +126 -82
  45. data/lib/sidekiq/rails.rb +24 -32
  46. data/lib/sidekiq/redis_connection.rb +46 -14
  47. data/lib/sidekiq/scheduled.rb +50 -25
  48. data/lib/sidekiq/testing.rb +35 -27
  49. data/lib/sidekiq/testing/inline.rb +2 -1
  50. data/lib/sidekiq/util.rb +20 -14
  51. data/lib/sidekiq/version.rb +2 -1
  52. data/lib/sidekiq/web.rb +45 -53
  53. data/lib/sidekiq/web/action.rb +14 -10
  54. data/lib/sidekiq/web/application.rb +83 -58
  55. data/lib/sidekiq/web/helpers.rb +105 -67
  56. data/lib/sidekiq/web/router.rb +18 -15
  57. data/lib/sidekiq/worker.rb +144 -41
  58. data/sidekiq.gemspec +16 -27
  59. data/web/assets/javascripts/application.js +0 -0
  60. data/web/assets/javascripts/dashboard.js +21 -23
  61. data/web/assets/stylesheets/application.css +35 -2
  62. data/web/assets/stylesheets/bootstrap.css +2 -2
  63. data/web/locales/ar.yml +1 -0
  64. data/web/locales/en.yml +2 -0
  65. data/web/locales/es.yml +4 -3
  66. data/web/locales/ja.yml +7 -4
  67. data/web/views/_footer.erb +4 -1
  68. data/web/views/_nav.erb +3 -17
  69. data/web/views/busy.erb +5 -1
  70. data/web/views/layout.erb +1 -1
  71. data/web/views/queue.erb +1 -0
  72. data/web/views/queues.erb +2 -0
  73. data/web/views/retries.erb +4 -0
  74. metadata +25 -171
  75. data/.travis.yml +0 -18
  76. data/bin/sidekiqctl +0 -99
  77. data/lib/sidekiq/core_ext.rb +0 -119
  78. data/lib/sidekiq/logging.rb +0 -106
  79. data/lib/sidekiq/middleware/server/active_record.rb +0 -22
data/README.md CHANGED
@@ -3,7 +3,7 @@ Sidekiq
3
3
 
4
4
  [![Gem Version](https://badge.fury.io/rb/sidekiq.svg)](https://rubygems.org/gems/sidekiq)
5
5
  [![Code Climate](https://codeclimate.com/github/mperham/sidekiq.svg)](https://codeclimate.com/github/mperham/sidekiq)
6
- [![Build Status](https://travis-ci.org/mperham/sidekiq.svg)](https://travis-ci.org/mperham/sidekiq)
6
+ [![Build Status](https://circleci.com/gh/mperham/sidekiq/tree/master.svg?style=svg)](https://circleci.com/gh/mperham/sidekiq/tree/master)
7
7
  [![Gitter Chat](https://badges.gitter.im/mperham/sidekiq.svg)](https://gitter.im/mperham/sidekiq)
8
8
 
9
9
 
@@ -13,31 +13,26 @@ Sidekiq uses threads to handle many jobs at the same time in the
13
13
  same process. It does not require Rails but will integrate tightly with
14
14
  Rails to make background processing dead simple.
15
15
 
16
- Sidekiq is compatible with Resque. It uses the exact same
17
- message format as Resque so it can integrate into an existing Resque processing farm.
18
- You can have Sidekiq and Resque run side-by-side at the same time and
19
- use the Resque client to enqueue jobs in Redis to be processed by Sidekiq.
20
-
21
16
  Performance
22
17
  ---------------
23
18
 
24
- Version | Latency | Garbage created for 10,000 jobs | Time to process 100,000 jobs | Throughput
25
- -----------------|------|---------|---------|------------------------
26
- Sidekiq 4.0.0 | 10ms | 151 MB | 22 sec | **4500 jobs/sec**
27
- Sidekiq 3.5.1 | 22ms | 1257 MB | 125 sec | 800 jobs/sec
28
- Resque 1.25.2 | - | - | 420 sec | 240 jobs/sec
29
- DelayedJob 4.1.1 | - | - | 465 sec | 215 jobs/sec
19
+ Version | Latency | Garbage created for 10k jobs | Time to process 100k jobs | Throughput | Ruby
20
+ -----------------|------|---------|---------|------------------------|-----
21
+ Sidekiq 6.0.0 | 3 ms | 156 MB | 19 sec | **5200 jobs/sec** | MRI 2.6.3
22
+ Sidekiq 4.0.0 | 10 ms | 151 MB | 22 sec | 4500 jobs/sec |
23
+ Sidekiq 3.5.1 | 22 ms | 1257 MB | 125 sec | 800 jobs/sec |
24
+ Resque 1.25.2 | - | - | 420 sec | 240 jobs/sec |
25
+ DelayedJob 4.1.1 | - | - | 465 sec | 215 jobs/sec |
30
26
 
27
+ This benchmark can be found in `bin/sidekiqload` and assumes a Redis network latency of 1ms.
31
28
 
32
29
  Requirements
33
30
  -----------------
34
31
 
35
- Sidekiq supports CRuby 2.2.2+ and JRuby 9k.
36
-
37
- All Rails releases >= 4.0 are officially supported.
32
+ - Redis: 4.0+
33
+ - Ruby: MRI 2.5+ or JRuby 9.2+.
38
34
 
39
- Redis 2.8 or greater is required. 3.0.3+ is recommended for large
40
- installations with thousands of worker threads.
35
+ Sidekiq 6.0 supports Rails 5.0+ but does not require it.
41
36
 
42
37
 
43
38
  Installation
@@ -62,7 +57,7 @@ Want to Upgrade?
62
57
  I also sell Sidekiq Pro and Sidekiq Enterprise, extensions to Sidekiq which provide more
63
58
  features, a commercial-friendly license and allow you to support high
64
59
  quality open source development all at the same time. Please see the
65
- [Sidekiq](http://sidekiq.org/) homepage for more detail.
60
+ [Sidekiq](https://sidekiq.org/) homepage for more detail.
66
61
 
67
62
  Subscribe to the **[quarterly newsletter](https://tinyletter.com/sidekiq)** to stay informed about the latest
68
63
  features and changes to Sidekiq and its bigger siblings.
@@ -76,23 +71,16 @@ Problems?
76
71
  If you have a problem, please review the [FAQ](https://github.com/mperham/sidekiq/wiki/FAQ) and [Troubleshooting](https://github.com/mperham/sidekiq/wiki/Problems-and-Troubleshooting) wiki pages.
77
72
  Searching the [issues](https://github.com/mperham/sidekiq/issues) for your problem is also a good idea.
78
73
 
74
+ Sidekiq Pro and Sidekiq Enterprise customers get private email support. You can purchase at https://sidekiq.org; email support@contribsys.com for help.
75
+
79
76
  Useful resources:
80
77
 
81
78
  * Product documentation is in the [wiki](https://github.com/mperham/sidekiq/wiki).
82
- * Release announcements are made to the [@sidekiq](https://twitter.com/sidekiq) Twitter account.
83
- * Here's a [Reddit forum](https://reddit.com/r/sidekiq) dedicated to Sidekiq discussion
79
+ * Occasional announcements are made to the [@sidekiq](https://twitter.com/sidekiq) Twitter account.
84
80
  * The [Sidekiq tag](https://stackoverflow.com/questions/tagged/sidekiq) on Stack Overflow has lots of useful Q & A.
85
81
 
86
- **No support via Twitter, 140 characters is not enough.**
87
-
88
82
  Every Friday morning is Sidekiq happy hour: I video chat and answer questions.
89
- See the [Sidekiq support page](http://sidekiq.org/support) for details.
90
-
91
- Thanks
92
- -----------------
93
-
94
- Sidekiq stays fast by using the [JProfiler java profiler](http://www.ej-technologies.com/products/jprofiler/overview.html) to find and fix
95
- performance problems on JRuby. Unfortunately MRI does not have good multithreaded profiling tools.
83
+ See the [Sidekiq support page](https://sidekiq.org/support.html) for details.
96
84
 
97
85
 
98
86
  License
@@ -104,4 +92,4 @@ Please see [LICENSE](https://github.com/mperham/sidekiq/blob/master/LICENSE) for
104
92
  Author
105
93
  -----------------
106
94
 
107
- Mike Perham, [@mperham](https://twitter.com/mperham) / [@sidekiq](https://twitter.com/sidekiq), [http://www.mikeperham.com](http://www.mikeperham.com) / [http://www.contribsys.com](http://www.contribsys.com)
95
+ Mike Perham, [@mperham@mastodon.xyz](https://mastodon.xyz/@mperham) / [@sidekiq](https://twitter.com/sidekiq), [https://www.mikeperham.com](https://www.mikeperham.com) / [https://www.contribsys.com](https://www.contribsys.com)
data/Rakefile CHANGED
@@ -1,12 +1,10 @@
1
- require 'bundler/gem_tasks'
2
- require 'rake/testtask'
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+ require "standard/rake"
4
+
3
5
  Rake::TestTask.new(:test) do |test|
4
6
  test.warning = true
5
- test.pattern = 'test/**/test_*.rb'
7
+ test.pattern = "test/**/test_*.rb"
6
8
  end
7
9
 
8
- task :default => :test
9
-
10
- task :appraise do
11
- exec("cd myapp && rake appraise")
12
- end
10
+ task default: [:standard, :test]
@@ -13,8 +13,8 @@ require_relative '../lib/sidekiq/launcher'
13
13
  include Sidekiq::Util
14
14
 
15
15
  Sidekiq.configure_server do |config|
16
- #config.options[:concurrency] = 1
17
- config.redis = { db: 13 }
16
+ config.options[:concurrency] = 10
17
+ config.redis = { db: 13, port: 6380, driver: :hiredis }
18
18
  config.options[:queues] << 'default'
19
19
  config.logger.level = Logger::ERROR
20
20
  config.average_scheduled_poll_interval = 2
@@ -28,7 +28,8 @@ class LoadWorker
28
28
  1
29
29
  end
30
30
 
31
- def perform(idx)
31
+ def perform(idx, ts=nil)
32
+ puts(Time.now.to_f - ts) if ts != nil
32
33
  #raise idx.to_s if idx % 100 == 1
33
34
  end
34
35
  end
@@ -36,14 +37,15 @@ end
36
37
  # brew tap shopify/shopify
37
38
  # brew install toxiproxy
38
39
  # gem install toxiproxy
39
- #require 'toxiproxy'
40
+ # run `toxiproxy-server` in a separate terminal window.
41
+ require 'toxiproxy'
40
42
  # simulate a non-localhost network for realer-world conditions.
41
43
  # adding 1ms of network latency has an ENORMOUS impact on benchmarks
42
- #Toxiproxy.populate([{
43
- #"name": "redis",
44
- #"listen": "127.0.0.1:6380",
45
- #"upstream": "127.0.0.1:6379"
46
- #}])
44
+ Toxiproxy.populate([{
45
+ "name": "redis",
46
+ "listen": "127.0.0.1:6380",
47
+ "upstream": "127.0.0.1:6379"
48
+ }])
47
49
 
48
50
  self_read, self_write = IO.pipe
49
51
  %w(INT TERM TSTP TTIN).each do |sig|
@@ -65,14 +67,14 @@ def handle_signal(launcher, sig)
65
67
  # http://jira.codehaus.org/browse/JRUBY-4637
66
68
  raise Interrupt
67
69
  when 'TERM'
68
- # Heroku sends TERM and then waits 10 seconds for process to exit.
70
+ # Heroku sends TERM and then waits 30 seconds for process to exit.
69
71
  raise Interrupt
70
72
  when 'TSTP'
71
73
  Sidekiq.logger.info "Received TSTP, no longer accepting new work"
72
74
  launcher.quiet
73
75
  when 'TTIN'
74
76
  Thread.list.each do |thread|
75
- Sidekiq.logger.warn "Thread TID-#{thread.object_id.to_s(36)} #{thread['label']}"
77
+ Sidekiq.logger.warn "Thread TID-#{(thread.object_id ^ ::Process.pid).to_s(36)} #{thread['label']}"
76
78
  if thread.backtrace
77
79
  Sidekiq.logger.warn thread.backtrace.join("\n")
78
80
  else
@@ -103,18 +105,20 @@ Sidekiq.logger.error "Created #{count*iter} jobs"
103
105
  Monitoring = Thread.new do
104
106
  watchdog("monitor thread") do
105
107
  while true
106
- sleep 1
107
- qsize, retries = Sidekiq.redis do |conn|
108
- conn.pipelined do
109
- conn.llen "queue:default"
110
- conn.zcard "retry"
111
- end
112
- end.map(&:to_i)
113
- total = qsize + retries
114
- #GC.start
108
+ sleep 0.5
109
+ qsize = Sidekiq.redis do |conn|
110
+ conn.llen "queue:default"
111
+ end
112
+ total = qsize
115
113
  Sidekiq.logger.error("RSS: #{Process.rss} Pending: #{total}")
116
114
  if total == 0
117
- Sidekiq.logger.error("Done")
115
+ Sidekiq.logger.error("Done, now here's the latency for three jobs")
116
+
117
+ LoadWorker.perform_async(1, Time.now.to_f)
118
+ LoadWorker.perform_async(2, Time.now.to_f)
119
+ LoadWorker.perform_async(3, Time.now.to_f)
120
+
121
+ sleep 0.2
118
122
  exit(0)
119
123
  end
120
124
  end
@@ -125,8 +129,8 @@ begin
125
129
  #RubyProf::exclude_threads = [ Monitoring ]
126
130
  #RubyProf.start
127
131
  fire_event(:startup)
128
- #Sidekiq.logger.error "Simulating 1ms of latency between Sidekiq and redis"
129
- #Toxiproxy[:redis].downstream(:latency, latency: 1).apply do
132
+ Sidekiq.logger.error "Simulating 1ms of latency between Sidekiq and redis"
133
+ Toxiproxy[:redis].downstream(:latency, latency: 1).apply do
130
134
  launcher = Sidekiq::Launcher.new(Sidekiq.options)
131
135
  launcher.run
132
136
 
@@ -134,7 +138,7 @@ begin
134
138
  signal = readable_io.first[0].gets.strip
135
139
  handle_signal(launcher, signal)
136
140
  end
137
- #end
141
+ end
138
142
  rescue SystemExit => e
139
143
  #Sidekiq.logger.error("Profiling...")
140
144
  #result = RubyProf.stop
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'sidekiq/monitor'
4
+
5
+ if ARGV[0] == 'status'
6
+ Sidekiq::Monitor::Status.new.display(ARGV[1])
7
+ else
8
+ Sidekiq::Monitor.print_usage
9
+ end
@@ -1,6 +1,6 @@
1
1
  require 'rails_helper'
2
2
  <% module_namespacing do -%>
3
3
  RSpec.describe <%= class_name %>Worker, type: :worker do
4
- pending "add some examples to (or delete) #{__FILE__}"
4
+ pending "add some examples to (or delete) #{__FILE__}"
5
5
  end
6
6
  <% end -%>
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
  <% module_namespacing do -%>
3
- class <%= class_name %>WorkerTest < <% if defined? Minitest::Test %>Minitest::Test<% else %>MiniTest::Unit::TestCase<% end %>
3
+ class <%= class_name %>WorkerTest < Minitest::Test
4
4
  def test_example
5
5
  skip "add some examples to (or delete) #{__FILE__}"
6
6
  end
@@ -1,18 +1,18 @@
1
- require 'rails/generators/named_base'
1
+ require "rails/generators/named_base"
2
2
 
3
3
  module Sidekiq
4
4
  module Generators # :nodoc:
5
5
  class WorkerGenerator < ::Rails::Generators::NamedBase # :nodoc:
6
- desc 'This generator creates a Sidekiq Worker in app/workers and a corresponding test'
6
+ desc "This generator creates a Sidekiq Worker in app/workers and a corresponding test"
7
7
 
8
- check_class_collision suffix: 'Worker'
8
+ check_class_collision suffix: "Worker"
9
9
 
10
10
  def self.default_generator_root
11
11
  File.dirname(__FILE__)
12
12
  end
13
13
 
14
14
  def create_worker_file
15
- template 'worker.rb.erb', File.join('app/workers', class_path, "#{file_name}_worker.rb")
15
+ template "worker.rb.erb", File.join("app/workers", class_path, "#{file_name}_worker.rb")
16
16
  end
17
17
 
18
18
  def create_test_file
@@ -27,23 +27,21 @@ module Sidekiq
27
27
 
28
28
  def create_worker_spec
29
29
  template_file = File.join(
30
- 'spec/workers',
31
- class_path,
32
- "#{file_name}_worker_spec.rb"
30
+ "spec/workers",
31
+ class_path,
32
+ "#{file_name}_worker_spec.rb"
33
33
  )
34
- template 'worker_spec.rb.erb', template_file
34
+ template "worker_spec.rb.erb", template_file
35
35
  end
36
36
 
37
37
  def create_worker_test
38
38
  template_file = File.join(
39
- 'test/workers',
40
- class_path,
41
- "#{file_name}_worker_test.rb"
39
+ "test/workers",
40
+ class_path,
41
+ "#{file_name}_worker_test.rb"
42
42
  )
43
- template 'worker_test.rb.erb', template_file
43
+ template "worker_test.rb.erb", template_file
44
44
  end
45
-
46
-
47
45
  end
48
46
  end
49
47
  end
@@ -1,30 +1,31 @@
1
- # encoding: utf-8
2
1
  # frozen_string_literal: true
3
- require 'sidekiq/version'
4
- fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.2.2." if RUBY_PLATFORM != 'java' && RUBY_VERSION < '2.2.2'
5
2
 
6
- require 'sidekiq/logging'
7
- require 'sidekiq/client'
8
- require 'sidekiq/worker'
9
- require 'sidekiq/redis_connection'
10
- require 'sidekiq/delay'
3
+ require "sidekiq/version"
4
+ fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.5.0." if RUBY_PLATFORM != "java" && Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.5.0")
11
5
 
12
- require 'json'
6
+ require "sidekiq/logger"
7
+ require "sidekiq/client"
8
+ require "sidekiq/worker"
9
+ require "sidekiq/redis_connection"
10
+ require "sidekiq/delay"
11
+
12
+ require "json"
13
13
 
14
14
  module Sidekiq
15
- NAME = 'Sidekiq'.freeze
16
- LICENSE = 'See LICENSE and the LGPL-3.0 for licensing details.'
15
+ NAME = "Sidekiq"
16
+ LICENSE = "See LICENSE and the LGPL-3.0 for licensing details."
17
17
 
18
18
  DEFAULTS = {
19
19
  queues: [],
20
20
  labels: [],
21
- concurrency: 25,
22
- require: '.',
21
+ concurrency: 10,
22
+ require: ".",
23
23
  environment: nil,
24
- timeout: 8,
24
+ timeout: 25,
25
25
  poll_interval_average: nil,
26
- average_scheduled_poll_interval: 15,
26
+ average_scheduled_poll_interval: 5,
27
27
  error_handlers: [],
28
+ death_handlers: [],
28
29
  lifecycle_events: {
29
30
  startup: [],
30
31
  quiet: [],
@@ -37,8 +38,8 @@ module Sidekiq
37
38
  }
38
39
 
39
40
  DEFAULT_WORKER_OPTIONS = {
40
- 'retry' => true,
41
- 'queue' => 'default'
41
+ "retry" => true,
42
+ "queue" => "default",
42
43
  }
43
44
 
44
45
  FAKE_INFO = {
@@ -46,8 +47,8 @@ module Sidekiq
46
47
  "uptime_in_days" => "9999",
47
48
  "connected_clients" => "9999",
48
49
  "used_memory_human" => "9P",
49
- "used_memory_peak_human" => "9P"
50
- }.freeze
50
+ "used_memory_peak_human" => "9P",
51
+ }
51
52
 
52
53
  def self.❨╯°□°❩╯︵┻━┻
53
54
  puts "Calm down, yo."
@@ -56,6 +57,7 @@ module Sidekiq
56
57
  def self.options
57
58
  @options ||= DEFAULTS.dup
58
59
  end
60
+
59
61
  def self.options=(opts)
60
62
  @options = opts
61
63
  end
@@ -94,9 +96,13 @@ module Sidekiq
94
96
  begin
95
97
  yield conn
96
98
  rescue Redis::CommandError => ex
97
- #2550 Failover can cause the server to become a slave, need
98
- # to disconnect and reopen the socket to get back to the master.
99
- (conn.disconnect!; retryable = false; retry) if retryable && ex.message =~ /READONLY/
99
+ # 2550 Failover can cause the server to become a replica, need
100
+ # to disconnect and reopen the socket to get back to the primary.
101
+ if retryable && ex.message =~ /READONLY/
102
+ conn.disconnect!
103
+ retryable = false
104
+ retry
105
+ end
100
106
  raise
101
107
  end
102
108
  end
@@ -104,19 +110,17 @@ module Sidekiq
104
110
 
105
111
  def self.redis_info
106
112
  redis do |conn|
107
- begin
108
- # admin commands can't go through redis-namespace starting
109
- # in redis-namespace 2.0
110
- if conn.respond_to?(:namespace)
111
- conn.redis.info
112
- else
113
- conn.info
114
- end
115
- rescue Redis::CommandError => ex
116
- #2850 return fake version when INFO command has (probably) been renamed
117
- raise unless ex.message =~ /unknown command/
118
- FAKE_INFO
113
+ # admin commands can't go through redis-namespace starting
114
+ # in redis-namespace 2.0
115
+ if conn.respond_to?(:namespace)
116
+ conn.redis.info
117
+ else
118
+ conn.info
119
119
  end
120
+ rescue Redis::CommandError => ex
121
+ # 2850 return fake version when INFO command has (probably) been renamed
122
+ raise unless /unknown command/.match?(ex.message)
123
+ FAKE_INFO
120
124
  end
121
125
  end
122
126
 
@@ -149,36 +153,53 @@ module Sidekiq
149
153
  end
150
154
 
151
155
  def self.default_worker_options=(hash)
152
- @default_worker_options = default_worker_options.merge(hash.stringify_keys)
156
+ # stringify
157
+ @default_worker_options = default_worker_options.merge(Hash[hash.map { |k, v| [k.to_s, v] }])
153
158
  end
159
+
154
160
  def self.default_worker_options
155
161
  defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
156
162
  end
157
163
 
164
+ ##
165
+ # Death handlers are called when all retries for a job have been exhausted and
166
+ # the job dies. It's the notification to your application
167
+ # that this job will not succeed without manual intervention.
168
+ #
158
169
  # Sidekiq.configure_server do |config|
159
- # config.default_retries_exhausted = -> (job, ex) do
170
+ # config.death_handlers << ->(job, ex) do
160
171
  # end
161
172
  # end
162
- def self.default_retries_exhausted=(prok)
163
- @default_retries_exhausted = prok
164
- end
165
- @default_retries_exhausted = ->(job, ex) { }
166
- def self.default_retries_exhausted
167
- @default_retries_exhausted
173
+ def self.death_handlers
174
+ options[:death_handlers]
168
175
  end
169
176
 
170
177
  def self.load_json(string)
171
178
  JSON.parse(string)
172
179
  end
180
+
173
181
  def self.dump_json(object)
174
182
  JSON.generate(object)
175
183
  end
176
184
 
185
+ def self.log_formatter
186
+ @log_formatter ||= if ENV["DYNO"]
187
+ Sidekiq::Logger::Formatters::WithoutTimestamp.new
188
+ else
189
+ Sidekiq::Logger::Formatters::Pretty.new
190
+ end
191
+ end
192
+
193
+ def self.log_formatter=(log_formatter)
194
+ @log_formatter = log_formatter
195
+ end
196
+
177
197
  def self.logger
178
- Sidekiq::Logging.logger
198
+ @logger ||= Sidekiq::Logger.new(STDOUT, level: Logger::INFO)
179
199
  end
180
- def self.logger=(log)
181
- Sidekiq::Logging.logger = log
200
+
201
+ def self.logger=(logger)
202
+ @logger = logger
182
203
  end
183
204
 
184
205
  # How frequently Redis should be checked by a random Sidekiq process for
@@ -187,7 +208,7 @@ module Sidekiq
187
208
  #
188
209
  # See sidekiq/scheduled.rb for an in-depth explanation of this value
189
210
  def self.average_scheduled_poll_interval=(interval)
190
- self.options[:average_scheduled_poll_interval] = interval
211
+ options[:average_scheduled_poll_interval] = interval
191
212
  end
192
213
 
193
214
  # Register a proc to handle any error which occurs within the Sidekiq process.
@@ -198,7 +219,7 @@ module Sidekiq
198
219
  #
199
220
  # The default error handler logs errors to Sidekiq.logger.
200
221
  def self.error_handlers
201
- self.options[:error_handlers]
222
+ options[:error_handlers]
202
223
  end
203
224
 
204
225
  # Register a block to run at a point in the Sidekiq lifecycle.
@@ -222,7 +243,6 @@ module Sidekiq
222
243
  # otherwise Ruby's Thread#kill will commit. See #377.
223
244
  # DO NOT RESCUE THIS ERROR IN YOUR WORKERS
224
245
  class Shutdown < Interrupt; end
225
-
226
246
  end
227
247
 
228
- require 'sidekiq/rails' if defined?(::Rails::Engine)
248
+ require "sidekiq/rails" if defined?(::Rails::Engine)