sidekiq 5.1.1 → 7.1.2

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 (149) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +627 -8
  3. data/LICENSE.txt +9 -0
  4. data/README.md +47 -50
  5. data/bin/sidekiq +22 -3
  6. data/bin/sidekiqload +213 -115
  7. data/bin/sidekiqmon +11 -0
  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 +566 -329
  13. data/lib/sidekiq/capsule.rb +127 -0
  14. data/lib/sidekiq/cli.rb +241 -256
  15. data/lib/sidekiq/client.rb +125 -102
  16. data/lib/sidekiq/component.rb +68 -0
  17. data/lib/sidekiq/config.rb +278 -0
  18. data/lib/sidekiq/deploy.rb +62 -0
  19. data/lib/sidekiq/embedded.rb +61 -0
  20. data/lib/sidekiq/fetch.rb +49 -42
  21. data/lib/sidekiq/job.rb +374 -0
  22. data/lib/sidekiq/job_logger.rb +36 -9
  23. data/lib/sidekiq/job_retry.rb +147 -98
  24. data/lib/sidekiq/job_util.rb +105 -0
  25. data/lib/sidekiq/launcher.rb +207 -103
  26. data/lib/sidekiq/logger.rb +131 -0
  27. data/lib/sidekiq/manager.rb +43 -47
  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 +136 -0
  31. data/lib/sidekiq/middleware/chain.rb +113 -56
  32. data/lib/sidekiq/middleware/current_attributes.rb +95 -0
  33. data/lib/sidekiq/middleware/i18n.rb +7 -7
  34. data/lib/sidekiq/middleware/modules.rb +21 -0
  35. data/lib/sidekiq/monitor.rb +146 -0
  36. data/lib/sidekiq/paginator.rb +28 -16
  37. data/lib/sidekiq/processor.rb +159 -107
  38. data/lib/sidekiq/rails.rb +54 -43
  39. data/lib/sidekiq/redis_client_adapter.rb +96 -0
  40. data/lib/sidekiq/redis_connection.rb +39 -81
  41. data/lib/sidekiq/ring_buffer.rb +29 -0
  42. data/lib/sidekiq/scheduled.rb +139 -48
  43. data/lib/sidekiq/sd_notify.rb +149 -0
  44. data/lib/sidekiq/systemd.rb +24 -0
  45. data/lib/sidekiq/testing/inline.rb +6 -5
  46. data/lib/sidekiq/testing.rb +70 -88
  47. data/lib/sidekiq/transaction_aware_client.rb +44 -0
  48. data/lib/sidekiq/version.rb +3 -1
  49. data/lib/sidekiq/web/action.rb +15 -11
  50. data/lib/sidekiq/web/application.rb +143 -77
  51. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  52. data/lib/sidekiq/web/helpers.rb +144 -106
  53. data/lib/sidekiq/web/router.rb +23 -19
  54. data/lib/sidekiq/web.rb +60 -111
  55. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  56. data/lib/sidekiq.rb +94 -183
  57. data/sidekiq.gemspec +25 -23
  58. data/web/assets/images/apple-touch-icon.png +0 -0
  59. data/web/assets/javascripts/application.js +130 -61
  60. data/web/assets/javascripts/base-charts.js +106 -0
  61. data/web/assets/javascripts/chart.min.js +13 -0
  62. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  63. data/web/assets/javascripts/dashboard-charts.js +166 -0
  64. data/web/assets/javascripts/dashboard.js +36 -282
  65. data/web/assets/javascripts/metrics.js +264 -0
  66. data/web/assets/stylesheets/application-dark.css +147 -0
  67. data/web/assets/stylesheets/application-rtl.css +2 -95
  68. data/web/assets/stylesheets/application.css +134 -521
  69. data/web/assets/stylesheets/bootstrap.css +2 -2
  70. data/web/locales/ar.yml +71 -64
  71. data/web/locales/cs.yml +62 -62
  72. data/web/locales/da.yml +60 -53
  73. data/web/locales/de.yml +65 -53
  74. data/web/locales/el.yml +43 -24
  75. data/web/locales/en.yml +84 -65
  76. data/web/locales/es.yml +70 -54
  77. data/web/locales/fa.yml +65 -65
  78. data/web/locales/fr.yml +83 -62
  79. data/web/locales/gd.yml +99 -0
  80. data/web/locales/he.yml +65 -64
  81. data/web/locales/hi.yml +59 -59
  82. data/web/locales/it.yml +53 -53
  83. data/web/locales/ja.yml +75 -64
  84. data/web/locales/ko.yml +52 -52
  85. data/web/locales/lt.yml +83 -0
  86. data/web/locales/nb.yml +61 -61
  87. data/web/locales/nl.yml +52 -52
  88. data/web/locales/pl.yml +45 -45
  89. data/web/locales/pt-br.yml +63 -55
  90. data/web/locales/pt.yml +51 -51
  91. data/web/locales/ru.yml +68 -63
  92. data/web/locales/sv.yml +53 -53
  93. data/web/locales/ta.yml +60 -60
  94. data/web/locales/uk.yml +62 -61
  95. data/web/locales/ur.yml +64 -64
  96. data/web/locales/vi.yml +83 -0
  97. data/web/locales/zh-cn.yml +43 -16
  98. data/web/locales/zh-tw.yml +42 -8
  99. data/web/views/_footer.erb +8 -2
  100. data/web/views/_job_info.erb +21 -4
  101. data/web/views/_metrics_period_select.erb +12 -0
  102. data/web/views/_nav.erb +4 -18
  103. data/web/views/_paging.erb +2 -0
  104. data/web/views/_poll_link.erb +3 -6
  105. data/web/views/_summary.erb +7 -7
  106. data/web/views/busy.erb +75 -25
  107. data/web/views/dashboard.erb +58 -18
  108. data/web/views/dead.erb +3 -3
  109. data/web/views/layout.erb +4 -2
  110. data/web/views/metrics.erb +82 -0
  111. data/web/views/metrics_for_job.erb +68 -0
  112. data/web/views/morgue.erb +14 -15
  113. data/web/views/queue.erb +33 -23
  114. data/web/views/queues.erb +14 -4
  115. data/web/views/retries.erb +19 -16
  116. data/web/views/retry.erb +3 -3
  117. data/web/views/scheduled.erb +17 -15
  118. metadata +71 -140
  119. data/.github/contributing.md +0 -32
  120. data/.github/issue_template.md +0 -11
  121. data/.gitignore +0 -13
  122. data/.travis.yml +0 -14
  123. data/3.0-Upgrade.md +0 -70
  124. data/4.0-Upgrade.md +0 -53
  125. data/5.0-Upgrade.md +0 -56
  126. data/COMM-LICENSE +0 -95
  127. data/Ent-Changes.md +0 -210
  128. data/Gemfile +0 -8
  129. data/LICENSE +0 -9
  130. data/Pro-2.0-Upgrade.md +0 -138
  131. data/Pro-3.0-Upgrade.md +0 -44
  132. data/Pro-4.0-Upgrade.md +0 -35
  133. data/Pro-Changes.md +0 -716
  134. data/Rakefile +0 -8
  135. data/bin/sidekiqctl +0 -99
  136. data/code_of_conduct.md +0 -50
  137. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  138. data/lib/sidekiq/core_ext.rb +0 -1
  139. data/lib/sidekiq/delay.rb +0 -41
  140. data/lib/sidekiq/exception_handler.rb +0 -29
  141. data/lib/sidekiq/extensions/action_mailer.rb +0 -57
  142. data/lib/sidekiq/extensions/active_record.rb +0 -40
  143. data/lib/sidekiq/extensions/class_methods.rb +0 -40
  144. data/lib/sidekiq/extensions/generic_proxy.rb +0 -31
  145. data/lib/sidekiq/logging.rb +0 -122
  146. data/lib/sidekiq/middleware/server/active_record.rb +0 -22
  147. data/lib/sidekiq/middleware/server/active_record_cache.rb +0 -11
  148. data/lib/sidekiq/util.rb +0 -66
  149. data/lib/sidekiq/worker.rb +0 -204
@@ -1,204 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'sidekiq/client'
3
-
4
- module Sidekiq
5
-
6
- ##
7
- # Include this module in your worker class and you can easily create
8
- # asynchronous jobs:
9
- #
10
- # class HardWorker
11
- # include Sidekiq::Worker
12
- #
13
- # def perform(*args)
14
- # # do some work
15
- # end
16
- # end
17
- #
18
- # Then in your Rails app, you can do this:
19
- #
20
- # HardWorker.perform_async(1, 2, 3)
21
- #
22
- # Note that perform_async is a class method, perform is an instance method.
23
- module Worker
24
- attr_accessor :jid
25
-
26
- def self.included(base)
27
- raise ArgumentError, "You cannot include Sidekiq::Worker in an ActiveJob: #{base.name}" if base.ancestors.any? {|c| c.name == 'ActiveJob::Base' }
28
-
29
- base.extend(ClassMethods)
30
- base.sidekiq_class_attribute :sidekiq_options_hash
31
- base.sidekiq_class_attribute :sidekiq_retry_in_block
32
- base.sidekiq_class_attribute :sidekiq_retries_exhausted_block
33
- end
34
-
35
- def logger
36
- Sidekiq.logger
37
- end
38
-
39
- # This helper class encapsulates the set options for `set`, e.g.
40
- #
41
- # SomeWorker.set(queue: 'foo').perform_async(....)
42
- #
43
- class Setter
44
- def initialize(klass, opts)
45
- @klass = klass
46
- @opts = opts
47
- end
48
-
49
- def perform_async(*args)
50
- @klass.client_push(@opts.merge('args'.freeze => args, 'class'.freeze => @klass))
51
- end
52
-
53
- # +interval+ must be a timestamp, numeric or something that acts
54
- # numeric (like an activesupport time interval).
55
- def perform_in(interval, *args)
56
- int = interval.to_f
57
- now = Time.now.to_f
58
- ts = (int < 1_000_000_000 ? now + int : int)
59
-
60
- payload = @opts.merge('class'.freeze => @klass, 'args'.freeze => args, 'at'.freeze => ts)
61
- # Optimization to enqueue something now that is scheduled to go out now or in the past
62
- payload.delete('at'.freeze) if ts <= now
63
- @klass.client_push(payload)
64
- end
65
- alias_method :perform_at, :perform_in
66
- end
67
-
68
- module ClassMethods
69
-
70
- def delay(*args)
71
- raise ArgumentError, "Do not call .delay on a Sidekiq::Worker class, call .perform_async"
72
- end
73
-
74
- def delay_for(*args)
75
- raise ArgumentError, "Do not call .delay_for on a Sidekiq::Worker class, call .perform_in"
76
- end
77
-
78
- def delay_until(*args)
79
- raise ArgumentError, "Do not call .delay_until on a Sidekiq::Worker class, call .perform_at"
80
- end
81
-
82
- def set(options)
83
- Setter.new(self, options)
84
- end
85
-
86
- def perform_async(*args)
87
- client_push('class'.freeze => self, 'args'.freeze => args)
88
- end
89
-
90
- # +interval+ must be a timestamp, numeric or something that acts
91
- # numeric (like an activesupport time interval).
92
- def perform_in(interval, *args)
93
- int = interval.to_f
94
- now = Time.now.to_f
95
- ts = (int < 1_000_000_000 ? now + int : int)
96
-
97
- item = { 'class'.freeze => self, 'args'.freeze => args, 'at'.freeze => ts }
98
-
99
- # Optimization to enqueue something now that is scheduled to go out now or in the past
100
- item.delete('at'.freeze) if ts <= now
101
-
102
- client_push(item)
103
- end
104
- alias_method :perform_at, :perform_in
105
-
106
- ##
107
- # Allows customization for this type of Worker.
108
- # Legal options:
109
- #
110
- # queue - use a named queue for this Worker, default 'default'
111
- # retry - enable the RetryJobs middleware for this Worker, *true* to use the default
112
- # or *Integer* count
113
- # backtrace - whether to save any error backtrace in the retry payload to display in web UI,
114
- # can be true, false or an integer number of lines to save, default *false*
115
- # pool - use the given Redis connection pool to push this type of job to a given shard.
116
- #
117
- # In practice, any option is allowed. This is the main mechanism to configure the
118
- # options for a specific job.
119
- def sidekiq_options(opts={})
120
- # stringify
121
- self.sidekiq_options_hash = get_sidekiq_options.merge(Hash[opts.map{|k, v| [k.to_s, v]}])
122
- end
123
-
124
- def sidekiq_retry_in(&block)
125
- self.sidekiq_retry_in_block = block
126
- end
127
-
128
- def sidekiq_retries_exhausted(&block)
129
- self.sidekiq_retries_exhausted_block = block
130
- end
131
-
132
- def get_sidekiq_options # :nodoc:
133
- self.sidekiq_options_hash ||= Sidekiq.default_worker_options
134
- end
135
-
136
- def client_push(item) # :nodoc:
137
- pool = Thread.current[:sidekiq_via_pool] || get_sidekiq_options['pool'.freeze] || Sidekiq.redis_pool
138
- # stringify
139
- item.keys.each do |key|
140
- item[key.to_s] = item.delete(key)
141
- end
142
-
143
- Sidekiq::Client.new(pool).push(item)
144
- end
145
-
146
- def sidekiq_class_attribute(*attrs)
147
- instance_reader = true
148
- instance_writer = true
149
-
150
- attrs.each do |name|
151
- singleton_class.instance_eval do
152
- undef_method(name) if method_defined?(name) || private_method_defined?(name)
153
- end
154
- define_singleton_method(name) { nil }
155
-
156
- ivar = "@#{name}"
157
-
158
- singleton_class.instance_eval do
159
- m = "#{name}="
160
- undef_method(m) if method_defined?(m) || private_method_defined?(m)
161
- end
162
- define_singleton_method("#{name}=") do |val|
163
- singleton_class.class_eval do
164
- undef_method(name) if method_defined?(name) || private_method_defined?(name)
165
- define_method(name) { val }
166
- end
167
-
168
- if singleton_class?
169
- class_eval do
170
- undef_method(name) if method_defined?(name) || private_method_defined?(name)
171
- define_method(name) do
172
- if instance_variable_defined? ivar
173
- instance_variable_get ivar
174
- else
175
- singleton_class.send name
176
- end
177
- end
178
- end
179
- end
180
- val
181
- end
182
-
183
- if instance_reader
184
- undef_method(name) if method_defined?(name) || private_method_defined?(name)
185
- define_method(name) do
186
- if instance_variable_defined?(ivar)
187
- instance_variable_get ivar
188
- else
189
- self.class.public_send name
190
- end
191
- end
192
- end
193
-
194
- if instance_writer
195
- m = "#{name}="
196
- undef_method(m) if method_defined?(m) || private_method_defined?(m)
197
- attr_writer name
198
- end
199
- end
200
- end
201
-
202
- end
203
- end
204
- end