sidekiq 6.1.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 (141) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +256 -7
  3. data/LICENSE.txt +9 -0
  4. data/README.md +21 -16
  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 +352 -229
  13. data/lib/sidekiq/capsule.rb +110 -0
  14. data/lib/sidekiq/cli.rb +109 -89
  15. data/lib/sidekiq/client.rb +75 -86
  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 +31 -23
  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 +80 -60
  24. data/lib/sidekiq/job_util.rb +71 -0
  25. data/lib/sidekiq/launcher.rb +143 -92
  26. data/lib/sidekiq/logger.rb +11 -45
  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 +90 -46
  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 +42 -17
  49. data/lib/sidekiq/web/csrf_protection.rb +33 -6
  50. data/lib/sidekiq/web/helpers.rb +52 -41
  51. data/lib/sidekiq/web/router.rb +4 -1
  52. data/lib/sidekiq/web.rb +26 -81
  53. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  54. data/lib/sidekiq.rb +86 -201
  55. data/sidekiq.gemspec +38 -6
  56. data/web/assets/images/apple-touch-icon.png +0 -0
  57. data/web/assets/javascripts/application.js +113 -65
  58. data/web/assets/javascripts/base-charts.js +106 -0
  59. data/web/assets/javascripts/chart.min.js +13 -0
  60. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  61. data/web/assets/javascripts/dashboard-charts.js +166 -0
  62. data/web/assets/javascripts/dashboard.js +36 -273
  63. data/web/assets/javascripts/metrics.js +236 -0
  64. data/web/assets/stylesheets/application-dark.css +61 -51
  65. data/web/assets/stylesheets/application-rtl.css +2 -95
  66. data/web/assets/stylesheets/application.css +98 -532
  67. data/web/locales/ar.yml +71 -65
  68. data/web/locales/cs.yml +62 -62
  69. data/web/locales/da.yml +52 -52
  70. data/web/locales/de.yml +65 -65
  71. data/web/locales/el.yml +43 -24
  72. data/web/locales/en.yml +83 -67
  73. data/web/locales/es.yml +70 -54
  74. data/web/locales/fa.yml +65 -65
  75. data/web/locales/fr.yml +69 -62
  76. data/web/locales/he.yml +65 -64
  77. data/web/locales/hi.yml +59 -59
  78. data/web/locales/it.yml +53 -53
  79. data/web/locales/ja.yml +72 -66
  80. data/web/locales/ko.yml +52 -52
  81. data/web/locales/lt.yml +66 -66
  82. data/web/locales/nb.yml +61 -61
  83. data/web/locales/nl.yml +52 -52
  84. data/web/locales/pl.yml +45 -45
  85. data/web/locales/pt-br.yml +63 -55
  86. data/web/locales/pt.yml +51 -51
  87. data/web/locales/ru.yml +68 -63
  88. data/web/locales/sv.yml +53 -53
  89. data/web/locales/ta.yml +60 -60
  90. data/web/locales/uk.yml +62 -61
  91. data/web/locales/ur.yml +64 -64
  92. data/web/locales/vi.yml +67 -67
  93. data/web/locales/zh-cn.yml +37 -11
  94. data/web/locales/zh-tw.yml +42 -8
  95. data/web/views/_footer.erb +6 -3
  96. data/web/views/_job_info.erb +1 -1
  97. data/web/views/_nav.erb +1 -1
  98. data/web/views/_poll_link.erb +2 -5
  99. data/web/views/_summary.erb +7 -7
  100. data/web/views/busy.erb +57 -21
  101. data/web/views/dashboard.erb +58 -18
  102. data/web/views/dead.erb +1 -1
  103. data/web/views/layout.erb +2 -1
  104. data/web/views/metrics.erb +80 -0
  105. data/web/views/metrics_for_job.erb +69 -0
  106. data/web/views/morgue.erb +6 -6
  107. data/web/views/queue.erb +15 -11
  108. data/web/views/queues.erb +4 -4
  109. data/web/views/retries.erb +7 -7
  110. data/web/views/retry.erb +1 -1
  111. data/web/views/scheduled.erb +1 -1
  112. metadata +87 -52
  113. data/.circleci/config.yml +0 -71
  114. data/.github/contributing.md +0 -32
  115. data/.github/issue_template.md +0 -11
  116. data/.gitignore +0 -13
  117. data/.standard.yml +0 -20
  118. data/3.0-Upgrade.md +0 -70
  119. data/4.0-Upgrade.md +0 -53
  120. data/5.0-Upgrade.md +0 -56
  121. data/6.0-Upgrade.md +0 -72
  122. data/COMM-LICENSE +0 -97
  123. data/Ent-2.0-Upgrade.md +0 -37
  124. data/Ent-Changes.md +0 -269
  125. data/Gemfile +0 -24
  126. data/Gemfile.lock +0 -208
  127. data/LICENSE +0 -9
  128. data/Pro-2.0-Upgrade.md +0 -138
  129. data/Pro-3.0-Upgrade.md +0 -44
  130. data/Pro-4.0-Upgrade.md +0 -35
  131. data/Pro-5.0-Upgrade.md +0 -25
  132. data/Pro-Changes.md +0 -790
  133. data/Rakefile +0 -10
  134. data/code_of_conduct.md +0 -50
  135. data/lib/generators/sidekiq/worker_generator.rb +0 -57
  136. data/lib/sidekiq/delay.rb +0 -41
  137. data/lib/sidekiq/exception_handler.rb +0 -27
  138. data/lib/sidekiq/extensions/action_mailer.rb +0 -47
  139. data/lib/sidekiq/extensions/active_record.rb +0 -43
  140. data/lib/sidekiq/extensions/class_methods.rb +0 -43
  141. data/lib/sidekiq/extensions/generic_proxy.rb +0 -31
data/Rakefile DELETED
@@ -1,10 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
3
- require "standard/rake"
4
-
5
- Rake::TestTask.new(:test) do |test|
6
- test.warning = true
7
- test.pattern = "test/**/test_*.rb"
8
- end
9
-
10
- task default: [:standard, :test]
data/code_of_conduct.md DELETED
@@ -1,50 +0,0 @@
1
- # Contributor Code of Conduct
2
-
3
- As contributors and maintainers of this project, and in the interest of
4
- fostering an open and welcoming community, we pledge to respect all people who
5
- contribute through reporting issues, posting feature requests, updating
6
- documentation, submitting pull requests or patches, and other activities.
7
-
8
- We are committed to making participation in this project a harassment-free
9
- experience for everyone, regardless of level of experience, gender, gender
10
- identity and expression, sexual orientation, disability, personal appearance,
11
- body size, race, ethnicity, age, religion, or nationality.
12
-
13
- Examples of unacceptable behavior by participants include:
14
-
15
- * The use of sexualized language or imagery
16
- * Personal attacks
17
- * Trolling or insulting/derogatory comments
18
- * Public or private harassment
19
- * Publishing other's private information, such as physical or electronic
20
- addresses, without explicit permission
21
- * Other unethical or unprofessional conduct
22
-
23
- Project maintainers have the right and responsibility to remove, edit, or
24
- reject comments, commits, code, wiki edits, issues, and other contributions
25
- that are not aligned to this Code of Conduct, or to ban temporarily or
26
- permanently any contributor for other behaviors that they deem inappropriate,
27
- threatening, offensive, or harmful.
28
-
29
- By adopting this Code of Conduct, project maintainers commit themselves to
30
- fairly and consistently applying these principles to every aspect of managing
31
- this project. Project maintainers who do not follow or enforce the Code of
32
- Conduct may be permanently removed from the project team.
33
-
34
- This Code of Conduct applies both within project spaces and in public spaces
35
- when an individual is representing the project or its community.
36
-
37
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
38
- reported by contacting the project maintainer at mperham AT gmail.com. All
39
- complaints will be reviewed and investigated and will result in a response that
40
- is deemed necessary and appropriate to the circumstances. Maintainers are
41
- obligated to maintain confidentiality with regard to the reporter of an
42
- incident.
43
-
44
-
45
- This Code of Conduct is adapted from the [Contributor Covenant][homepage],
46
- version 1.3.0, available at
47
- [http://contributor-covenant.org/version/1/3/0/][version]
48
-
49
- [homepage]: http://contributor-covenant.org
50
- [version]: http://contributor-covenant.org/version/1/3/0/
@@ -1,57 +0,0 @@
1
- require "rails/generators/named_base"
2
-
3
- module Sidekiq
4
- module Generators # :nodoc:
5
- class WorkerGenerator < ::Rails::Generators::NamedBase # :nodoc:
6
- desc "This generator creates a Sidekiq Worker in app/workers and a corresponding test"
7
-
8
- check_class_collision suffix: "Worker"
9
-
10
- def self.default_generator_root
11
- File.dirname(__FILE__)
12
- end
13
-
14
- def create_worker_file
15
- template "worker.rb.erb", File.join("app/workers", class_path, "#{file_name}_worker.rb")
16
- end
17
-
18
- def create_test_file
19
- return unless test_framework
20
-
21
- if test_framework == :rspec
22
- create_worker_spec
23
- else
24
- create_worker_test
25
- end
26
- end
27
-
28
- private
29
-
30
- def create_worker_spec
31
- template_file = File.join(
32
- "spec/workers",
33
- class_path,
34
- "#{file_name}_worker_spec.rb"
35
- )
36
- template "worker_spec.rb.erb", template_file
37
- end
38
-
39
- def create_worker_test
40
- template_file = File.join(
41
- "test/workers",
42
- class_path,
43
- "#{file_name}_worker_test.rb"
44
- )
45
- template "worker_test.rb.erb", template_file
46
- end
47
-
48
- def file_name
49
- @_file_name ||= super.sub(/_?worker\z/i, "")
50
- end
51
-
52
- def test_framework
53
- ::Rails.application.config.generators.options[:rails][:test_framework]
54
- end
55
- end
56
- end
57
- end
data/lib/sidekiq/delay.rb DELETED
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sidekiq
4
- module Extensions
5
- def self.enable_delay!
6
- if defined?(::ActiveSupport)
7
- require "sidekiq/extensions/active_record"
8
- require "sidekiq/extensions/action_mailer"
9
-
10
- # Need to patch Psych so it can autoload classes whose names are serialized
11
- # in the delayed YAML.
12
- Psych::Visitors::ToRuby.prepend(Sidekiq::Extensions::PsychAutoload)
13
-
14
- ActiveSupport.on_load(:active_record) do
15
- include Sidekiq::Extensions::ActiveRecord
16
- end
17
- ActiveSupport.on_load(:action_mailer) do
18
- extend Sidekiq::Extensions::ActionMailer
19
- end
20
- end
21
-
22
- require "sidekiq/extensions/class_methods"
23
- Module.__send__(:include, Sidekiq::Extensions::Klass)
24
- end
25
-
26
- module PsychAutoload
27
- def resolve_class(klass_name)
28
- return nil if !klass_name || klass_name.empty?
29
- # constantize
30
- names = klass_name.split("::")
31
- names.shift if names.empty? || names.first.empty?
32
-
33
- names.inject(Object) do |constant, name|
34
- constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
35
- end
36
- rescue NameError
37
- super
38
- end
39
- end
40
- end
41
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "sidekiq"
4
-
5
- module Sidekiq
6
- module ExceptionHandler
7
- class Logger
8
- def call(ex, ctx)
9
- Sidekiq.logger.warn(Sidekiq.dump_json(ctx)) unless ctx.empty?
10
- Sidekiq.logger.warn("#{ex.class.name}: #{ex.message}")
11
- Sidekiq.logger.warn(ex.backtrace.join("\n")) unless ex.backtrace.nil?
12
- end
13
-
14
- Sidekiq.error_handlers << Sidekiq::ExceptionHandler::Logger.new
15
- end
16
-
17
- def handle_exception(ex, ctx = {})
18
- Sidekiq.error_handlers.each do |handler|
19
- handler.call(ex, ctx)
20
- rescue => ex
21
- Sidekiq.logger.error "!!! ERROR HANDLER THREW AN ERROR !!!"
22
- Sidekiq.logger.error ex
23
- Sidekiq.logger.error ex.backtrace.join("\n") unless ex.backtrace.nil?
24
- end
25
- end
26
- end
27
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "sidekiq/extensions/generic_proxy"
4
-
5
- module Sidekiq
6
- module Extensions
7
- ##
8
- # Adds 'delay', 'delay_for' and `delay_until` methods to ActionMailer to offload arbitrary email
9
- # delivery to Sidekiq. Example:
10
- #
11
- # UserMailer.delay.send_welcome_email(new_user)
12
- # UserMailer.delay_for(5.days).send_welcome_email(new_user)
13
- # UserMailer.delay_until(5.days.from_now).send_welcome_email(new_user)
14
- class DelayedMailer
15
- include Sidekiq::Worker
16
-
17
- def perform(yml)
18
- (target, method_name, args) = YAML.load(yml)
19
- msg = target.public_send(method_name, *args)
20
- # The email method can return nil, which causes ActionMailer to return
21
- # an undeliverable empty message.
22
- if msg
23
- msg.deliver_now
24
- else
25
- raise "#{target.name}##{method_name} returned an undeliverable mail object"
26
- end
27
- end
28
- end
29
-
30
- module ActionMailer
31
- def sidekiq_delay(options = {})
32
- Proxy.new(DelayedMailer, self, options)
33
- end
34
-
35
- def sidekiq_delay_for(interval, options = {})
36
- Proxy.new(DelayedMailer, self, options.merge("at" => Time.now.to_f + interval.to_f))
37
- end
38
-
39
- def sidekiq_delay_until(timestamp, options = {})
40
- Proxy.new(DelayedMailer, self, options.merge("at" => timestamp.to_f))
41
- end
42
- alias_method :delay, :sidekiq_delay
43
- alias_method :delay_for, :sidekiq_delay_for
44
- alias_method :delay_until, :sidekiq_delay_until
45
- end
46
- end
47
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "sidekiq/extensions/generic_proxy"
4
-
5
- module Sidekiq
6
- module Extensions
7
- ##
8
- # Adds 'delay', 'delay_for' and `delay_until` methods to ActiveRecord to offload instance method
9
- # execution to Sidekiq.
10
- #
11
- # @example
12
- # User.recent_signups.each { |user| user.delay.mark_as_awesome }
13
- #
14
- # Please note, this is not recommended as this will serialize the entire
15
- # object to Redis. Your Sidekiq jobs should pass IDs, not entire instances.
16
- # This is here for backwards compatibility with Delayed::Job only.
17
- class DelayedModel
18
- include Sidekiq::Worker
19
-
20
- def perform(yml)
21
- (target, method_name, args) = YAML.load(yml)
22
- target.__send__(method_name, *args)
23
- end
24
- end
25
-
26
- module ActiveRecord
27
- def sidekiq_delay(options = {})
28
- Proxy.new(DelayedModel, self, options)
29
- end
30
-
31
- def sidekiq_delay_for(interval, options = {})
32
- Proxy.new(DelayedModel, self, options.merge("at" => Time.now.to_f + interval.to_f))
33
- end
34
-
35
- def sidekiq_delay_until(timestamp, options = {})
36
- Proxy.new(DelayedModel, self, options.merge("at" => timestamp.to_f))
37
- end
38
- alias_method :delay, :sidekiq_delay
39
- alias_method :delay_for, :sidekiq_delay_for
40
- alias_method :delay_until, :sidekiq_delay_until
41
- end
42
- end
43
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "sidekiq/extensions/generic_proxy"
4
-
5
- module Sidekiq
6
- module Extensions
7
- ##
8
- # Adds `delay`, `delay_for` and `delay_until` methods to all Classes to offload class method
9
- # execution to Sidekiq.
10
- #
11
- # @example
12
- # User.delay.delete_inactive
13
- # Wikipedia.delay.download_changes_for(Date.today)
14
- #
15
- class DelayedClass
16
- include Sidekiq::Worker
17
-
18
- def perform(yml)
19
- (target, method_name, args) = YAML.load(yml)
20
- target.__send__(method_name, *args)
21
- end
22
- end
23
-
24
- module Klass
25
- def sidekiq_delay(options = {})
26
- Proxy.new(DelayedClass, self, options)
27
- end
28
-
29
- def sidekiq_delay_for(interval, options = {})
30
- Proxy.new(DelayedClass, self, options.merge("at" => Time.now.to_f + interval.to_f))
31
- end
32
-
33
- def sidekiq_delay_until(timestamp, options = {})
34
- Proxy.new(DelayedClass, self, options.merge("at" => timestamp.to_f))
35
- end
36
- alias_method :delay, :sidekiq_delay
37
- alias_method :delay_for, :sidekiq_delay_for
38
- alias_method :delay_until, :sidekiq_delay_until
39
- end
40
- end
41
- end
42
-
43
- Module.__send__(:include, Sidekiq::Extensions::Klass) unless defined?(::Rails)
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "yaml"
4
-
5
- module Sidekiq
6
- module Extensions
7
- SIZE_LIMIT = 8_192
8
-
9
- class Proxy < BasicObject
10
- def initialize(performable, target, options = {})
11
- @performable = performable
12
- @target = target
13
- @opts = options
14
- end
15
-
16
- def method_missing(name, *args)
17
- # Sidekiq has a limitation in that its message must be JSON.
18
- # JSON can't round trip real Ruby objects so we use YAML to
19
- # serialize the objects to a String. The YAML will be converted
20
- # to JSON and then deserialized on the other side back into a
21
- # Ruby object.
22
- obj = [@target, name, args]
23
- marshalled = ::YAML.dump(obj)
24
- if marshalled.size > SIZE_LIMIT
25
- ::Sidekiq.logger.warn { "#{@target}.#{name} job argument is #{marshalled.bytesize} bytes, you should refactor it to reduce the size" }
26
- end
27
- @performable.client_push({"class" => @performable, "args" => [marshalled]}.merge(@opts))
28
- end
29
- end
30
- end
31
- end