sidekiq 5.1.3 → 7.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +756 -8
  3. data/LICENSE.txt +9 -0
  4. data/README.md +48 -51
  5. data/bin/multi_queue_bench +271 -0
  6. data/bin/sidekiq +22 -3
  7. data/bin/sidekiqload +213 -115
  8. data/bin/sidekiqmon +11 -0
  9. data/lib/generators/sidekiq/job_generator.rb +59 -0
  10. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  11. data/lib/generators/sidekiq/templates/{worker_spec.rb.erb → job_spec.rb.erb} +1 -1
  12. data/lib/generators/sidekiq/templates/{worker_test.rb.erb → job_test.rb.erb} +1 -1
  13. data/lib/sidekiq/api.rb +640 -330
  14. data/lib/sidekiq/capsule.rb +132 -0
  15. data/lib/sidekiq/cli.rb +244 -257
  16. data/lib/sidekiq/client.rb +132 -103
  17. data/lib/sidekiq/component.rb +68 -0
  18. data/lib/sidekiq/config.rb +293 -0
  19. data/lib/sidekiq/deploy.rb +64 -0
  20. data/lib/sidekiq/embedded.rb +63 -0
  21. data/lib/sidekiq/fetch.rb +49 -42
  22. data/lib/sidekiq/iterable_job.rb +55 -0
  23. data/lib/sidekiq/job/interrupt_handler.rb +24 -0
  24. data/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
  25. data/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
  26. data/lib/sidekiq/job/iterable/enumerators.rb +135 -0
  27. data/lib/sidekiq/job/iterable.rb +231 -0
  28. data/lib/sidekiq/job.rb +385 -0
  29. data/lib/sidekiq/job_logger.rb +49 -12
  30. data/lib/sidekiq/job_retry.rb +167 -103
  31. data/lib/sidekiq/job_util.rb +109 -0
  32. data/lib/sidekiq/launcher.rb +209 -102
  33. data/lib/sidekiq/logger.rb +131 -0
  34. data/lib/sidekiq/manager.rb +43 -46
  35. data/lib/sidekiq/metrics/query.rb +158 -0
  36. data/lib/sidekiq/metrics/shared.rb +97 -0
  37. data/lib/sidekiq/metrics/tracking.rb +148 -0
  38. data/lib/sidekiq/middleware/chain.rb +113 -56
  39. data/lib/sidekiq/middleware/current_attributes.rb +113 -0
  40. data/lib/sidekiq/middleware/i18n.rb +7 -7
  41. data/lib/sidekiq/middleware/modules.rb +23 -0
  42. data/lib/sidekiq/monitor.rb +147 -0
  43. data/lib/sidekiq/paginator.rb +28 -16
  44. data/lib/sidekiq/processor.rb +175 -112
  45. data/lib/sidekiq/rails.rb +54 -39
  46. data/lib/sidekiq/redis_client_adapter.rb +114 -0
  47. data/lib/sidekiq/redis_connection.rb +65 -86
  48. data/lib/sidekiq/ring_buffer.rb +31 -0
  49. data/lib/sidekiq/scheduled.rb +139 -48
  50. data/lib/sidekiq/sd_notify.rb +149 -0
  51. data/lib/sidekiq/systemd.rb +26 -0
  52. data/lib/sidekiq/testing/inline.rb +6 -5
  53. data/lib/sidekiq/testing.rb +95 -94
  54. data/lib/sidekiq/transaction_aware_client.rb +51 -0
  55. data/lib/sidekiq/version.rb +3 -1
  56. data/lib/sidekiq/web/action.rb +22 -12
  57. data/lib/sidekiq/web/application.rb +225 -76
  58. data/lib/sidekiq/web/csrf_protection.rb +183 -0
  59. data/lib/sidekiq/web/helpers.rb +215 -118
  60. data/lib/sidekiq/web/router.rb +23 -19
  61. data/lib/sidekiq/web.rb +114 -106
  62. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  63. data/lib/sidekiq.rb +95 -182
  64. data/sidekiq.gemspec +26 -23
  65. data/web/assets/images/apple-touch-icon.png +0 -0
  66. data/web/assets/javascripts/application.js +157 -61
  67. data/web/assets/javascripts/base-charts.js +106 -0
  68. data/web/assets/javascripts/chart.min.js +13 -0
  69. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  70. data/web/assets/javascripts/dashboard-charts.js +192 -0
  71. data/web/assets/javascripts/dashboard.js +35 -283
  72. data/web/assets/javascripts/metrics.js +298 -0
  73. data/web/assets/stylesheets/application-dark.css +147 -0
  74. data/web/assets/stylesheets/application-rtl.css +10 -93
  75. data/web/assets/stylesheets/application.css +169 -522
  76. data/web/assets/stylesheets/bootstrap.css +2 -2
  77. data/web/locales/ar.yml +71 -64
  78. data/web/locales/cs.yml +62 -62
  79. data/web/locales/da.yml +60 -53
  80. data/web/locales/de.yml +65 -53
  81. data/web/locales/el.yml +43 -24
  82. data/web/locales/en.yml +86 -65
  83. data/web/locales/es.yml +70 -54
  84. data/web/locales/fa.yml +65 -65
  85. data/web/locales/fr.yml +83 -62
  86. data/web/locales/gd.yml +99 -0
  87. data/web/locales/he.yml +65 -64
  88. data/web/locales/hi.yml +59 -59
  89. data/web/locales/it.yml +53 -53
  90. data/web/locales/ja.yml +75 -64
  91. data/web/locales/ko.yml +52 -52
  92. data/web/locales/lt.yml +83 -0
  93. data/web/locales/nb.yml +61 -61
  94. data/web/locales/nl.yml +52 -52
  95. data/web/locales/pl.yml +45 -45
  96. data/web/locales/pt-br.yml +83 -55
  97. data/web/locales/pt.yml +51 -51
  98. data/web/locales/ru.yml +68 -63
  99. data/web/locales/sv.yml +53 -53
  100. data/web/locales/ta.yml +60 -60
  101. data/web/locales/tr.yml +101 -0
  102. data/web/locales/uk.yml +62 -61
  103. data/web/locales/ur.yml +64 -64
  104. data/web/locales/vi.yml +83 -0
  105. data/web/locales/zh-cn.yml +43 -16
  106. data/web/locales/zh-tw.yml +42 -8
  107. data/web/views/_footer.erb +18 -3
  108. data/web/views/_job_info.erb +21 -4
  109. data/web/views/_metrics_period_select.erb +12 -0
  110. data/web/views/_nav.erb +4 -18
  111. data/web/views/_paging.erb +2 -0
  112. data/web/views/_poll_link.erb +3 -6
  113. data/web/views/_summary.erb +7 -7
  114. data/web/views/busy.erb +79 -29
  115. data/web/views/dashboard.erb +49 -19
  116. data/web/views/dead.erb +3 -3
  117. data/web/views/filtering.erb +7 -0
  118. data/web/views/layout.erb +9 -7
  119. data/web/views/metrics.erb +91 -0
  120. data/web/views/metrics_for_job.erb +59 -0
  121. data/web/views/morgue.erb +14 -15
  122. data/web/views/queue.erb +33 -23
  123. data/web/views/queues.erb +19 -5
  124. data/web/views/retries.erb +19 -16
  125. data/web/views/retry.erb +3 -3
  126. data/web/views/scheduled.erb +17 -15
  127. metadata +84 -129
  128. data/.github/contributing.md +0 -32
  129. data/.github/issue_template.md +0 -11
  130. data/.gitignore +0 -13
  131. data/.travis.yml +0 -14
  132. data/3.0-Upgrade.md +0 -70
  133. data/4.0-Upgrade.md +0 -53
  134. data/5.0-Upgrade.md +0 -56
  135. data/COMM-LICENSE +0 -95
  136. data/Ent-Changes.md +0 -216
  137. data/Gemfile +0 -8
  138. data/LICENSE +0 -9
  139. data/Pro-2.0-Upgrade.md +0 -138
  140. data/Pro-3.0-Upgrade.md +0 -44
  141. data/Pro-4.0-Upgrade.md +0 -35
  142. data/Pro-Changes.md +0 -729
  143. data/Rakefile +0 -8
  144. data/bin/sidekiqctl +0 -99
  145. data/code_of_conduct.md +0 -50
  146. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  147. data/lib/sidekiq/core_ext.rb +0 -1
  148. data/lib/sidekiq/delay.rb +0 -42
  149. data/lib/sidekiq/exception_handler.rb +0 -29
  150. data/lib/sidekiq/extensions/action_mailer.rb +0 -57
  151. data/lib/sidekiq/extensions/active_record.rb +0 -40
  152. data/lib/sidekiq/extensions/class_methods.rb +0 -40
  153. data/lib/sidekiq/extensions/generic_proxy.rb +0 -31
  154. data/lib/sidekiq/logging.rb +0 -122
  155. data/lib/sidekiq/middleware/server/active_record.rb +0 -23
  156. data/lib/sidekiq/util.rb +0 -66
  157. data/lib/sidekiq/worker.rb +0 -204
data/Changes.md CHANGED
@@ -1,6 +1,754 @@
1
1
  # Sidekiq Changes
2
2
 
3
- [Sidekiq Changes](https://github.com/mperham/sidekiq/blob/master/Changes.md) | [Sidekiq Pro Changes](https://github.com/mperham/sidekiq/blob/master/Pro-Changes.md) | [Sidekiq Enterprise Changes](https://github.com/mperham/sidekiq/blob/master/Ent-Changes.md)
3
+ [Sidekiq Changes](https://github.com/sidekiq/sidekiq/blob/main/Changes.md) | [Sidekiq Pro Changes](https://github.com/sidekiq/sidekiq/blob/main/Pro-Changes.md) | [Sidekiq Enterprise Changes](https://github.com/sidekiq/sidekiq/blob/main/Ent-Changes.md)
4
+
5
+ 7.3.1
6
+ ----------
7
+
8
+ - Don't count job interruptions as failures in metrics [#6386]
9
+ - Add frozen string literal to a number of .rb files.
10
+ - Fix frozen string error with style_tag and script_tag [#6371]
11
+ - Fix an error on Ruby 2.7 because of usage of `Hash#except` [#6376]
12
+
13
+ 7.3.0
14
+ ----------
15
+
16
+ - **NEW FEATURE** Add `Sidekiq::IterableJob`, iteration support for long-running jobs. [#6286, fatkodima]
17
+ Iterable jobs are interruptible and can restart quickly if
18
+ running during a deploy. You must ensure that `each_iteration`
19
+ doesn't take more than Sidekiq's `-t` timeout (default: 25 seconds). Iterable jobs must not implement `perform`.
20
+ ```ruby
21
+ class ProcessArrayJob
22
+ include Sidekiq::IterableJob
23
+ def build_enumerator(*args, **kwargs)
24
+ array_enumerator(args, **kwargs)
25
+ end
26
+ def each_iteration(arg)
27
+ puts arg
28
+ end
29
+ end
30
+ ProcessArrayJob.perform_async(1, 2, 3)
31
+ ```
32
+ See the [Iteration](//github.com/sidekiq/sidekiq/wiki/Iteration) wiki page and the RDoc in `Sidekiq::IterableJob`.
33
+ This feature should be considered BETA until the next minor release.
34
+ - **SECURITY** The Web UI no longer allows extensions to use `<script>`.
35
+ Adjust CSP to disallow inline scripts within the Web UI. Please see
36
+ `examples/webui-ext` for how to register Web UI extensions and use
37
+ dynamic CSS and JS. This will make Sidekiq immune to XSS attacks. [#6270]
38
+ - Add config option, `:skip_default_job_logging` to disable Sidekiq's default
39
+ start/finish job logging. [#6200]
40
+ - Allow `Sidekiq::Limiter.redis` to use Redis Cluster [#6288]
41
+ - Retain CurrentAttributeѕ after inline execution [#6307]
42
+ - Ignore non-existent CurrentAttributes attributes when restoring [#6341]
43
+ - Raise default Redis {read,write,connect} timeouts from 1 to 3 seconds
44
+ to minimize ReadTimeoutErrors [#6162]
45
+ - Add `logger` as a dependency since it will become bundled in Ruby 3.5 [#6320]
46
+ - Ignore unsupported locales in the Web UI [#6313]
47
+
48
+ 7.2.4
49
+ ----------
50
+
51
+ - Fix XSS in metrics filtering introduced in 7.2.0, CVE-2024-32887
52
+ Thanks to @UmerAdeemCheema for the security report.
53
+
54
+ 7.2.3
55
+ ----------
56
+
57
+ - [Support Dragonfly.io](https://www.mikeperham.com/2024/02/01/supporting-dragonfly/) as an alternative Redis implementation
58
+ - Fix error unpacking some compressed error backtraces [#6241]
59
+ - Fix potential heartbeat data leak [#6227]
60
+ - Add ability to find a currently running work by jid [#6212, fatkodima]
61
+
62
+ 7.2.2
63
+ ----------
64
+
65
+ - Add `Process.warmup` call in Ruby 3.3+
66
+ - Batch jobs now skip transactional push [#6160]
67
+
68
+ 7.2.1
69
+ ----------
70
+
71
+ - Add `Sidekiq::Work` type which replaces the raw Hash as the third parameter in
72
+ `Sidekiq::WorkSet#each { |pid, tid, hash| ... }` [#6145]
73
+ - **DEPRECATED**: direct access to the attributes within the `hash` block parameter above.
74
+ The `Sidekiq::Work` instance contains accessor methods to get at the same data, e.g.
75
+ ```ruby
76
+ work["queue"] # Old
77
+ work.queue # New
78
+ ```
79
+ - Fix Ruby 3.3 warnings around `base64` gem [#6151, earlopain]
80
+
81
+ 7.2.0
82
+ ----------
83
+
84
+ - `sidekiq_retries_exhausted` can return `:discard` to avoid the deadset
85
+ and all death handlers [#6091]
86
+ - Metrics filtering by job class in Web UI [#5974]
87
+ - Better readability and formatting for numbers within the Web UI [#6080]
88
+ - Add explicit error if user code tries to nest test modes [#6078]
89
+ ```ruby
90
+ Sidekiq::Testing.inline! # global setting
91
+ Sidekiq::Testing.fake! do # override within block
92
+ # ok
93
+ Sidekiq::Testing.inline! do # can't override the override
94
+ # not ok, nested
95
+ end
96
+ end
97
+ ```
98
+ - **SECURITY** Forbid inline JavaScript execution in Web UI [#6074]
99
+ - Adjust redis-client adapter to avoid `method_missing` [#6083]
100
+ This can result in app code breaking if your app's Redis API usage was
101
+ depending on Sidekiq's adapter to correct invalid redis-client API usage.
102
+ One example:
103
+ ```ruby
104
+ # bad, not redis-client native
105
+ # Unsupported command argument type: TrueClass (TypeError)
106
+ Sidekiq.redis { |c| c.set("key", "value", nx: true, ex: 15) }
107
+ # good
108
+ Sidekiq.redis { |c| c.set("key", "value", "nx", "ex", 15) }
109
+ ```
110
+
111
+ 7.1.6
112
+ ----------
113
+
114
+ - The block forms of testing modes (inline, fake) are now thread-safe so you can have
115
+ a multithreaded test suite which uses different modes for different tests. [#6069]
116
+ - Fix breakage with non-Proc error handlers [#6065]
117
+
118
+ 7.1.5
119
+ ----------
120
+
121
+ - **FEATURE**: Job filtering within the Web UI. This feature has been open
122
+ sourced from Sidekiq Pro. [#6052]
123
+ - **API CHANGE** Error handlers now take three arguments `->(ex, context, config)`.
124
+ The previous calling convention will work until Sidekiq 8.0 but will print
125
+ out a deprecation warning. [#6051]
126
+ - Fix issue with the `batch_size` and `at` options in `S::Client.push_bulk` [#6040]
127
+ - Fix inline testing firing batch callbacks early [#6057]
128
+ - Use new log broadcast API in Rails 7.1 [#6054]
129
+ - Crash if user tries to use RESP2 `protocol: 2` [#6061]
130
+
131
+ 7.1.4
132
+ ----------
133
+
134
+ - Fix empty `retry_for` logic [#6035]
135
+
136
+ 7.1.3
137
+ ----------
138
+
139
+ - Add `sidekiq_options retry_for: 48.hours` to allow time-based retry windows [#6029]
140
+ - Support sidekiq_retry_in and sidekiq_retries_exhausted_block in ActiveJobs (#5994)
141
+ - Lowercase all Rack headers for Rack 3.0 [#5951]
142
+ - Validate Sidekiq::Web page refresh delay to avoid potential DoS,
143
+ CVE-2023-26141, thanks for reporting Keegan!
144
+
145
+ 7.1.2
146
+ ----------
147
+
148
+ - Mark Web UI assets as private so CDNs won't cache them [#5936]
149
+ - Fix stackoverflow when using Oj and the JSON log formatter [#5920]
150
+ - Remove spurious `enqueued_at` from scheduled ActiveJobs [#5937]
151
+
152
+ 7.1.1
153
+ ----------
154
+
155
+ - Support multiple CurrentAttributes [#5904]
156
+ - Speed up latency fetch with large queues on Redis <7 [#5910]
157
+ - Allow a larger default client pool [#5886]
158
+ - Ensure Sidekiq.options[:environment] == RAILS_ENV [#5932]
159
+
160
+ 7.1.0
161
+ ----------
162
+
163
+ - Improve display of ActiveJob arguments in Web UI [#5825, cover]
164
+ - Update `push_bulk` to push `batch_size` jobs at a time and allow laziness [#5827, fatkodima]
165
+ This allows Sidekiq::Client to push unlimited jobs as long as it has enough memory for the batch_size.
166
+ - Update `perform_bulk` to use `push_bulk` internally.
167
+ - Change return value of `push_bulk` to map 1-to-1 with arguments.
168
+ If you call `push_bulk(args: [[1], [2], [3]])`, you will now always get
169
+ an array of 3 values as the result: `["jid1", nil, "jid3"]` where nil means
170
+ that particular job did not push successfully (possibly due to middleware
171
+ stopping it). Previously nil values were removed so it was impossible to tell
172
+ which jobs pushed successfully and which did not.
173
+ - Migrate away from all deprecated Redis commands [#5788]
174
+ Sidekiq will now print a warning if you use one of those deprecated commands.
175
+ - Prefix all Sidekiq thread names [#5872]
176
+
177
+ 7.0.9
178
+ ----------
179
+
180
+ - Restore confirmation dialogs in Web UI [#5881, shevaun]
181
+ - Increase fetch timeout to minimize ReadTimeoutError [#5874]
182
+ - Reverse histogram tooltip ordering [#5868]
183
+ - Add Scottish Gaelic (gd) locale [#5867, GunChleoc]
184
+
185
+ 7.0.8
186
+ ----------
187
+
188
+ - **SECURITY** Sanitize `period` input parameter on Metrics pages.
189
+ Specially crafted values can lead to XSS. This functionality
190
+ was introduced in 7.0.4. Thank you to spercex @ huntr.dev [#5694]
191
+ - Add job hash as 3rd parameter to the `sidekiq_retry_in` block.
192
+
193
+ 7.0.7
194
+ ----------
195
+
196
+ - Fix redis-client API usage which could result in stuck Redis
197
+ connections [#5823]
198
+ - Fix AS::Duration with `sidekiq_retry_in` [#5806]
199
+ - Restore dumping config options on startup with `-v` [#5822]
200
+
201
+ 7.0.5,7.0.6
202
+ ----------
203
+
204
+ - More context for debugging json unsafe errors [#5787]
205
+
206
+ 7.0.4
207
+ ----------
208
+
209
+ - Performance and memory optimizations [#5768, fatkodima]
210
+ - Add 1-8 hour period selector to Metrics pages [#5694]
211
+ - Fix process display with `sidekiqmon` [#5733]
212
+
213
+ 7.0.3
214
+ ----------
215
+
216
+ - Don't warn about memory policy on Redis Enterprise [#5712]
217
+ - Don't allow Quiet/Stop on embedded Sidekiq instances [#5716]
218
+ - Fix `size: X` for configuring the default Redis pool size [#5702]
219
+ - Improve the display of queue weights on Busy page [#5642]
220
+ - Freeze CurrentAttributes on a job once initially set [#5692]
221
+
222
+ 7.0.2
223
+ ----------
224
+
225
+ - Improve compatibility with custom loggers [#5673]
226
+ - Add queue weights on Busy page [#5640]
227
+ - Add BID link on job_info page if job is part of a Batch [#5623]
228
+ - Allow custom extensions to add rows/links within Job detail pages [#5624]
229
+ ```ruby
230
+ Sidekiq::Web.custom_job_info_rows << AddAccountLink.new
231
+
232
+ class AddAccountLink
233
+ include CGI::Util
234
+ def add_pair(job)
235
+ # yield a (name, value) pair
236
+ # You can include HTML tags and CSS, Sidekiq does not do any
237
+ # escaping so beware user data injection! Note how we use CGI's
238
+ # `h` escape helper.
239
+ aid = job["account_id"]
240
+ yield "Account", "<a href='/accounts/#{h aid}'>#{h aid}</a>" if aid
241
+ end
242
+ end
243
+ ```
244
+
245
+ 7.0.1
246
+ ----------
247
+
248
+ - Allow an embedding process to reuse its own heartbeat thread
249
+ - Update zh-cn localization
250
+
251
+ 7.0.0
252
+ ----------
253
+
254
+ - Embedded mode!
255
+ - Capsules!!
256
+ - Job Execution metrics!!!
257
+ - See `docs/7.0-Upgrade.md` for release notes
258
+
259
+ 6.5.{10,11,12}
260
+ ----------
261
+
262
+ - Fixes for Rails 7.1 [#6067, #6070]
263
+
264
+ 6.5.9
265
+ ----------
266
+
267
+ - Ensure Sidekiq.options[:environment] == RAILS_ENV [#5932]
268
+
269
+ 6.5.8
270
+ ----------
271
+
272
+ - Fail if using a bad version of scout_apm [#5616]
273
+ - Add pagination to Busy page [#5556]
274
+ - Speed up WorkSet#each [#5559]
275
+ - Adjust CurrentAttributes to work with the String class name so we aren't referencing the Class within a Rails initializer [#5536]
276
+
277
+ 6.5.7
278
+ ----------
279
+
280
+ - Updates for JA and ZH locales
281
+ - Further optimizations for scheduled polling [#5513]
282
+
283
+ 6.5.6
284
+ ----------
285
+
286
+ - Fix deprecation warnings with redis-rb 4.8.0 [#5484]
287
+ - Lock redis-rb to < 5.0 as we are moving to redis-client in Sidekiq 7.0
288
+
289
+ 6.5.5
290
+ ----------
291
+
292
+ - Fix require issue with job_retry.rb [#5462]
293
+ - Improve Sidekiq::Web compatibility with Rack 3.x
294
+
295
+ 6.5.4
296
+ ----------
297
+
298
+ - Fix invalid code on Ruby 2.5 [#5460]
299
+ - Fix further metrics dependency issues [#5457]
300
+
301
+ 6.5.3
302
+ ----------
303
+
304
+ - Don't require metrics code without explicit opt-in [#5456]
305
+
306
+ 6.5.2
307
+ ----------
308
+
309
+ - [Job Metrics are under active development, help wanted!](https://github.com/sidekiq/sidekiq/wiki/Metrics#contributing) **BETA**
310
+ - Add `Context` column on queue page which shows any CurrentAttributes [#5450]
311
+ - `sidekiq_retry_in` may now return `:discard` or `:kill` to dynamically stop job retries [#5406]
312
+ - Smarter sorting of processes in /busy Web UI [#5398]
313
+ - Fix broken hamburger menu in mobile UI [#5428]
314
+ - Require redis-rb 4.5.0. Note that Sidekiq will break if you use the
315
+ [`Redis.exists_returns_integer = false`](https://github.com/redis/redis-rb/blob/master/CHANGELOG.md#450) flag. [#5394]
316
+
317
+ 6.5.1
318
+ ----------
319
+
320
+ - Fix `push_bulk` breakage [#5387]
321
+
322
+ 6.5.0
323
+ ---------
324
+
325
+ - Substantial refactoring of Sidekiq server internals, part of a larger effort
326
+ to reduce Sidekiq's internal usage of global methods and data, see [docs/global_to_local.md](docs/global_to_local.md) and [docs/middleware.md](docs/middleware.md).
327
+ - **Add beta support for the `redis-client` gem**. This will become the default Redis driver in Sidekiq 7.0. [#5298]
328
+ Read more: https://github.com/sidekiq/sidekiq/wiki/Using-redis-client
329
+ - **Add beta support for DB transaction-aware client** [#5291]
330
+ Add this line to your initializer and any jobs created during a transaction
331
+ will only be pushed to Redis **after the transaction commits**. You will need to add the
332
+ `after_commit_everywhere` gem to your Gemfile.
333
+ ```ruby
334
+ Sidekiq.transactional_push!
335
+ ```
336
+ This feature does not have a lot of production usage yet; please try it out and let us
337
+ know if you have any issues. It will be fully supported in Sidekiq 7.0 or removed if it
338
+ proves problematic.
339
+ - Fix regression with middleware arguments [#5312]
340
+
341
+ 6.4.2
342
+ ---------
343
+
344
+ - Strict argument checking now runs after client-side middleware [#5246]
345
+ - Fix page events with live polling [#5184]
346
+ - Many under-the-hood changes to remove all usage of the term "worker"
347
+ from the Sidekiq codebase and APIs. This mostly involved RDoc and local
348
+ variable names but a few constants and public APIs were changed. The old
349
+ APIs will be removed in Sidekiq 7.0.
350
+ ```
351
+ Sidekiq::DEFAULT_WORKER_OPTIONS -> Sidekiq.default_job_options
352
+ Sidekiq.default_worker_options -> Sidekiq.default_job_options
353
+ Sidekiq::Queues["default"].jobs_by_worker(HardJob) -> Sidekiq::Queues["default"].jobs_by_class(HardJob)
354
+ ```
355
+
356
+ 6.4.1
357
+ ---------
358
+
359
+ - Fix pipeline/multi deprecations in redis-rb 4.6
360
+ - Fix sidekiq.yml YAML load errors on Ruby 3.1 [#5141]
361
+ - Sharding support for `perform_bulk` [#5129]
362
+ - Refactor job logger for SPEEEEEEED
363
+
364
+ 6.4.0
365
+ ---------
366
+
367
+ - **SECURITY**: Validate input to avoid possible DoS in Web UI.
368
+ - Add **strict argument checking** [#5071]
369
+ Sidekiq will now log a warning if JSON-unsafe arguments are passed to `perform_async`.
370
+ Add `Sidekiq.strict_args!(false)` to your initializer to disable this warning.
371
+ This warning will switch to an exception in Sidekiq 7.0.
372
+ - Note that Delayed Extensions will be removed in Sidekiq 7.0 [#5076]
373
+ - Add `perform_{inline,sync}` in Sidekiq::Job to run a job synchronously [#5061, hasan-ally]
374
+ ```ruby
375
+ SomeJob.perform_async(args...)
376
+ SomeJob.perform_sync(args...)
377
+ SomeJob.perform_inline(args...)
378
+ ```
379
+ You can also dynamically redirect a job to run synchronously:
380
+ ```ruby
381
+ SomeJob.set("sync": true).perform_async(args...) # will run via perform_inline
382
+ ```
383
+ - Replace Sidekiq::Worker `app/workers` generator with Sidekiq::Job `app/sidekiq` generator [#5055]
384
+ ```
385
+ bin/rails generate sidekiq:job ProcessOrderJob
386
+ ```
387
+ - Fix job retries losing CurrentAttributes [#5090]
388
+ - Tweak shutdown to give long-running threads time to cleanup [#5095]
389
+
390
+ 6.3.1
391
+ ---------
392
+
393
+ - Fix keyword arguments error with CurrentAttributes on Ruby 3.0 [#5048]
394
+
395
+ 6.3.0
396
+ ---------
397
+
398
+ - **BREAK**: The Web UI has been refactored to remove jQuery. Any UI extensions
399
+ which use jQuery will break.
400
+ - **FEATURE**: Sidekiq.logger has been enhanced so any `Rails.logger`
401
+ output in jobs now shows up in the Sidekiq console. Remove any logger
402
+ hacks in your initializer and see if it Just Works™ now. [#5021]
403
+ - **FEATURE**: Add `Sidekiq::Job` alias for `Sidekiq::Worker`, to better
404
+ reflect industry standard terminology. You can now do this:
405
+ ```ruby
406
+ class MyJob
407
+ include Sidekiq::Job
408
+ sidekiq_options ...
409
+ def perform(args)
410
+ end
411
+ end
412
+ ```
413
+ - **FEATURE**: Support for serializing ActiveSupport::CurrentAttributes into each job. [#4982]
414
+ ```ruby
415
+ # config/initializers/sidekiq.rb
416
+ require "sidekiq/middleware/current_attributes"
417
+ Sidekiq::CurrentAttributes.persist(Myapp::Current) # Your AS::CurrentAttributes singleton
418
+ ```
419
+ - **FEATURE**: Add `Sidekiq::Worker.perform_bulk` for enqueuing jobs in bulk,
420
+ similar to `Sidekiq::Client.push_bulk` [#5042]
421
+ ```ruby
422
+ MyJob.perform_bulk([[1], [2], [3]])
423
+ ```
424
+ - Implement `queue_as`, `wait` and `wait_until` for ActiveJob compatibility [#5003]
425
+ - Scheduler now uses Lua to reduce Redis load and network roundtrips [#5044]
426
+ - Retry Redis operation if we get an `UNBLOCKED` Redis error [#4985]
427
+ - Run existing signal traps, if any, before running Sidekiq's trap [#4991]
428
+ - Fix fetch bug when using weighted queues which caused Sidekiq to stop
429
+ processing queues randomly [#5031]
430
+
431
+ 6.2.2
432
+ ---------
433
+
434
+ - Reduce retry jitter, add jitter to `sidekiq_retry_in` values [#4957]
435
+ - Minimize scheduler load on Redis at scale [#4882]
436
+ - Improve logging of delay jobs [#4904, BuonOno]
437
+ - Minor CSS improvements for buttons and tables, design PRs always welcome!
438
+ - Tweak Web UI `Cache-Control` header [#4966]
439
+ - Rename internal API class `Sidekiq::Job` to `Sidekiq::JobRecord` [#4955]
440
+
441
+ 6.2.1
442
+ ---------
443
+
444
+ - Update RTT warning logic to handle transient RTT spikes [#4851]
445
+ - Fix very low priority CVE on unescaped queue name [#4852]
446
+ - Add note about sessions and Rails apps in API mode
447
+
448
+ 6.2.0
449
+ ---------
450
+
451
+ - Store Redis RTT and log if poor [#4824]
452
+ - Add process/thread stats to Busy page [#4806]
453
+ - Improve Web UI on mobile devices [#4840]
454
+ - **Refactor Web UI session usage** [#4804]
455
+ Numerous people have hit "Forbidden" errors and struggled with Sidekiq's
456
+ Web UI session requirement. If you have code in your initializer for
457
+ Web sessions, it's quite possible it will need to be removed. Here's
458
+ an overview:
459
+ ```
460
+ Sidekiq::Web needs a valid Rack session for CSRF protection. If this is a Rails app,
461
+ make sure you mount Sidekiq::Web *inside* your routes in `config/routes.rb` so
462
+ Sidekiq can reuse the Rails session:
463
+
464
+ Rails.application.routes.draw do
465
+ mount Sidekiq::Web => "/sidekiq"
466
+ ....
467
+ end
468
+
469
+ If this is a bare Rack app, use a session middleware before Sidekiq::Web:
470
+
471
+ # first, use IRB to create a shared secret key for sessions and commit it
472
+ require 'securerandom'; File.open(".session.key", "w") {|f| f.write(SecureRandom.hex(32)) }
473
+
474
+ # now, update your Rack app to include the secret with a session cookie middleware
475
+ use Rack::Session::Cookie, secret: File.read(".session.key"), same_site: true, max_age: 86400
476
+ run Sidekiq::Web
477
+
478
+ If this is a Rails app in API mode, you need to enable sessions.
479
+
480
+ https://guides.rubyonrails.org/api_app.html#using-session-middlewares
481
+ ```
482
+
483
+ 6.1.3
484
+ ---------
485
+
486
+ - Warn if Redis is configured to evict data under memory pressure [#4752]
487
+ - Add process RSS on the Busy page [#4717]
488
+
489
+ 6.1.2
490
+ ---------
491
+
492
+ - Improve readability in dark mode Web UI [#4674]
493
+ - Fix Web UI crash with corrupt session [#4672]
494
+ - Allow middleware to yield arguments [#4673, @eugeneius]
495
+ - Migrate CI from CircleCI to GitHub Actions [#4677]
496
+
497
+ 6.1.1
498
+ ---------
499
+
500
+ - Jobs are now sorted by age in the Busy Workers table. [#4641]
501
+ - Fix "check all" JS logic in Web UI [#4619]
502
+
503
+ 6.1.0
504
+ ---------
505
+
506
+ - Web UI - Dark Mode fixes [#4543, natematykiewicz]
507
+ - Ensure `Rack::ContentLength` is loaded as middleware for correct Web UI responses [#4541]
508
+ - Avoid exception dumping SSL store in Redis connection logging [#4532]
509
+ - Better error messages in Sidekiq::Client [#4549]
510
+ - Remove rack-protection, reimplement CSRF protection [#4588]
511
+ - Require redis-rb 4.2 [#4591]
512
+ - Update to jquery 1.12.4 [#4593]
513
+ - Refactor internal fetch logic and API [#4602]
514
+
515
+ 6.0.7
516
+ ---------
517
+
518
+ - Refactor systemd integration to work better with custom binaries [#4511]
519
+ - Don't connect to Redis at process exit if not needed [#4502]
520
+ - Remove Redis connection naming [#4479]
521
+ - Fix Redis Sentinel password redaction [#4499]
522
+ - Add Vietnamese locale (vi) [#4528]
523
+
524
+ 6.0.6
525
+ ---------
526
+
527
+ - **Integrate with systemd's watchdog and notification features** [#4488]
528
+ Set `Type=notify` in [sidekiq.service](https://github.com/sidekiq/sidekiq/blob/4b8a8bd3ae42f6e48ae1fdaf95ed7d7af18ed8bb/examples/systemd/sidekiq.service#L30-L39). The integration works automatically.
529
+ - Use `setTimeout` rather than `setInterval` to avoid thundering herd [#4480]
530
+ - Fix edge case where a job can be pushed without a queue.
531
+ - Flush job stats at exit [#4498]
532
+ - Check RAILS_ENV before RACK_ENV [#4493]
533
+ - Add Lithuanian locale [#4476]
534
+
535
+ 6.0.5
536
+ ---------
537
+
538
+ - Fix broken Web UI response when using NewRelic and Rack 2.1.2+. [#4440]
539
+ - Update APIs to use `UNLINK`, not `DEL`. [#4449]
540
+ - Fix Ruby 2.7 warnings [#4412]
541
+ - Add support for `APP_ENV` [[95fa5d9]](https://github.com/sidekiq/sidekiq/commit/95fa5d90192148026e52ca2902f1b83c70858ce8)
542
+
543
+ 6.0.4
544
+ ---------
545
+
546
+ - Fix ActiveJob's `sidekiq_options` integration [#4404]
547
+ - Sidekiq Pro users will now see a Pause button next to each queue in
548
+ the Web UI, allowing them to pause queues manually [#4374, shayonj]
549
+ - Fix Sidekiq::Workers API unintentional change in 6.0.2 [#4387]
550
+
551
+
552
+ 6.0.3
553
+ ---------
554
+
555
+ - Fix `Sidekiq::Client.push_bulk` API which was erroneously putting
556
+ invalid `at` values in the job payloads [#4321]
557
+
558
+ 6.0.2
559
+ ---------
560
+
561
+ - Fix Sidekiq Enterprise's rolling restart functionality, broken by refactoring in 6.0.0. [#4334]
562
+ - More internal refactoring and performance tuning [fatkodima]
563
+
564
+ 6.0.1
565
+ ---------
566
+
567
+ - **Performance tuning**, Sidekiq should be 10-15% faster now [#4303, 4299,
568
+ 4269, fatkodima]
569
+ - **Dark Mode support in Web UI** (further design polish welcome!) [#4227, mperham,
570
+ fatkodima, silent-e]
571
+ - **Job-specific log levels**, allowing you to turn on debugging for
572
+ problematic workers. [fatkodima, #4287]
573
+ ```ruby
574
+ MyWorker.set(log_level: :debug).perform_async(...)
575
+ ```
576
+ - **Ad-hoc job tags**. You can tag your jobs with, e.g, subdomain, tenant, country,
577
+ locale, application, version, user/client, "alpha/beta/pro/ent", types of jobs,
578
+ teams/people responsible for jobs, additional metadata, etc.
579
+ Tags are shown on different pages with job listings. Sidekiq Pro users
580
+ can filter based on them [fatkodima, #4280]
581
+ ```ruby
582
+ class MyWorker
583
+ include Sidekiq::Worker
584
+ sidekiq_options tags: ['bank-ops', 'alpha']
585
+ ...
586
+ end
587
+ ```
588
+ - Fetch scheduled jobs in batches before pushing into specific queues.
589
+ This will decrease enqueueing time of scheduled jobs by a third. [fatkodima, #4273]
590
+ ```
591
+ ScheduledSet with 10,000 jobs
592
+ Before: 56.6 seconds
593
+ After: 39.2 seconds
594
+ ```
595
+ - Compress error backtraces before pushing into Redis, if you are
596
+ storing error backtraces, this will halve the size of your RetrySet
597
+ in Redis [fatkodima, #4272]
598
+ ```
599
+ RetrySet with 100,000 jobs
600
+ Before: 261 MB
601
+ After: 129 MB
602
+ ```
603
+ - Support display of ActiveJob 6.0 payloads in the Web UI [#4263]
604
+ - Add `SortedSet#scan` for pattern based scanning. For large sets this API will be **MUCH** faster
605
+ than standard iteration using each. [fatkodima, #4262]
606
+ ```ruby
607
+ Sidekiq::DeadSet.new.scan("UnreliableApi") do |job|
608
+ job.retry
609
+ end
610
+ ```
611
+ - Dramatically speed up SortedSet#find\_job(jid) by using Redis's ZSCAN
612
+ support, approx 10x faster. [fatkodima, #4259]
613
+ ```
614
+ zscan 0.179366 0.047727 0.227093 ( 1.161376)
615
+ enum 8.522311 0.419826 8.942137 ( 9.785079)
616
+ ```
617
+ - Respect rails' generators `test_framework` option and gracefully handle extra `worker` suffix on generator [fatkodima, #4256]
618
+ - Add ability to sort 'Enqueued' page on Web UI by position in the queue [fatkodima, #4248]
619
+ - Support `Client.push_bulk` with different delays [fatkodima, #4243]
620
+ ```ruby
621
+ Sidekiq::Client.push_bulk("class" => FooJob, "args" => [[1], [2]], "at" => [1.minute.from_now.to_f, 5.minutes.from_now.to_f])
622
+ ```
623
+ - Easier way to test enqueuing specific ActionMailer and ActiveRecord delayed jobs. Instead of manually
624
+ parsing embedded class, you can now test by fetching jobs for specific classes. [fatkodima, #4292]
625
+ ```ruby
626
+ assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs_for(FooMailer).size
627
+ ```
628
+ - Add `sidekiqmon` to gemspec executables [#4242]
629
+ - Gracefully handle `Sidekiq.logger = nil` [#4240]
630
+ - Inject Sidekiq::LogContext module if user-supplied logger does not include it [#4239]
631
+
632
+ 6.0
633
+ ---------
634
+
635
+ This release has major breaking changes. Read and test carefully in production.
636
+
637
+ - With Rails 6.0.2+, ActiveJobs can now use `sidekiq_options` directly to configure Sidekiq
638
+ features/internals like the retry subsystem. [#4213, pirj]
639
+ ```ruby
640
+ class MyJob < ActiveJob::Base
641
+ queue_as :myqueue
642
+ sidekiq_options retry: 10, backtrace: 20
643
+ def perform(...)
644
+ end
645
+ end
646
+ ```
647
+ - Logging has been redesigned to allow for pluggable log formatters:
648
+ ```ruby
649
+ Sidekiq.configure_server do |config|
650
+ config.log_formatter = Sidekiq::Logger::Formatters::JSON.new
651
+ end
652
+ ```
653
+ See the [Logging wiki page](https://github.com/sidekiq/sidekiq/wiki/Logging) for more details.
654
+ - **BREAKING CHANGE** Validate proper usage of the `REDIS_PROVIDER`
655
+ variable. This variable is meant to hold the name of the environment
656
+ variable which contains your Redis URL, so that you can switch Redis
657
+ providers quickly and easily with a single variable change. It is not
658
+ meant to hold the actual Redis URL itself. If you want to manually set
659
+ the Redis URL (not recommended as it implies you have no failover),
660
+ then you may set `REDIS_URL` directly. [#3969]
661
+ - **BREAKING CHANGE** Increase default shutdown timeout from 8 seconds
662
+ to 25 seconds. Both Heroku and ECS now use 30 second shutdown timeout
663
+ by default and we want Sidekiq to take advantage of this time. If you
664
+ have deployment scripts which depend on the old default timeout, use `-t 8` to
665
+ get the old behavior. [#3968]
666
+ - **BREAKING CHANGE** Remove the daemonization, logfile and pidfile
667
+ arguments to Sidekiq. Use a proper process supervisor (e.g. systemd or
668
+ foreman) to manage Sidekiq. See the Deployment wiki page for links to
669
+ more resources.
670
+ - Integrate the StandardRB code formatter to ensure consistent code
671
+ styling. [#4114, gearnode]
672
+
673
+ 5.2.10
674
+ ---------
675
+
676
+ - Backport fix for CVE-2022-23837.
677
+ - Migrate to `exists?` for redis-rb.
678
+ - Lock redis-rb to <4.6 to avoid deprecations.
679
+
680
+ 5.2.9
681
+ ---------
682
+
683
+ - Release Rack lock due to a cascade of CVEs. [#4566]
684
+ Pro-tip: don't lock Rack.
685
+
686
+ 5.2.8
687
+ ---------
688
+
689
+ - Lock to Rack 2.0.x to prevent future incompatibilities
690
+ - Fix invalid reference in `sidekiqctl`
691
+
692
+ 5.2.7
693
+ ---------
694
+
695
+ - Fix stale `enqueued_at` when retrying [#4149]
696
+ - Move build to [Circle CI](https://circleci.com/gh/mperham/sidekiq) [#4120]
697
+
698
+ 5.2.6
699
+ ---------
700
+
701
+ - Fix edge case where a job failure during Redis outage could result in a lost job [#4141]
702
+ - Better handling of malformed job arguments in payload [#4095]
703
+ - Restore bootstap's dropdown css component [#4099, urkle]
704
+ - Display human-friendly time diff for longer queue latencies [#4111, interlinked]
705
+ - Allow `Sidekiq::Worker#set` to be chained
706
+
707
+ 5.2.5
708
+ ---------
709
+
710
+ - Fix default usage of `config/sidekiq.yml` [#4077, Tensho]
711
+
712
+ 5.2.4
713
+ ---------
714
+
715
+ - Add warnings for various deprecations and changes coming in Sidekiq 6.0.
716
+ See the 6-0 branch. [#4056]
717
+ - Various improvements to the Sidekiq test suite and coverage [#4026, #4039, Tensho]
718
+
719
+ 5.2.3
720
+ ---------
721
+
722
+ - Warning message on invalid REDIS\_PROVIDER [#3970]
723
+ - Add `sidekiqctl status` command [#4003, dzunk]
724
+ - Update elapsed time calculatons to use monotonic clock [#3999]
725
+ - Fix a few issues with mobile Web UI styling [#3973, navied]
726
+ - Jobs with `retry: false` now go through the global `death_handlers`,
727
+ meaning you can take action on failed ephemeral jobs. [#3980, Benjamin-Dobell]
728
+ - Fix race condition in defining Workers. [#3997, mattbooks]
729
+
730
+ 5.2.2
731
+ ---------
732
+
733
+ - Raise error for duplicate queue names in config to avoid unexpected fetch algorithm change [#3911]
734
+ - Fix concurrency bug on JRuby [#3958, mattbooks]
735
+ - Add "Kill All" button to the retries page [#3938]
736
+
737
+ 5.2.1
738
+ -----------
739
+
740
+ - Fix concurrent modification error during heartbeat [#3921]
741
+
742
+ 5.2.0
743
+ -----------
744
+
745
+ - **Decrease default concurrency from 25 to 10** [#3892]
746
+ - Verify connection pool sizing upon startup [#3917]
747
+ - Smoother scheduling for large Sidekiq clusters [#3889]
748
+ - Switch Sidekiq::Testing impl from alias\_method to Module#prepend, for resiliency [#3852]
749
+ - Update Sidekiq APIs to use SCAN for scalability [#3848, ffiller]
750
+ - Remove concurrent-ruby gem dependency [#3830]
751
+ - Optimize Web UI's bootstrap.css [#3914]
4
752
 
5
753
  5.1.3
6
754
  -----------
@@ -94,7 +842,7 @@ Sidekiq::Middleware::Server::Logging -> Sidekiq::JobLogger
94
842
  - The `SomeWorker.set(options)` API was re-written to avoid thread-local state. [#2152]
95
843
  - Sidekiq Enterprise's encrypted jobs now display "[encrypted data]" in the Web UI instead
96
844
  of random hex bytes.
97
- - Please see the [5.0 Upgrade notes](5.0-Upgrade.md) for more detail.
845
+ - Please see the [5.0 Upgrade notes](docs/5.0-Upgrade.md) for more detail.
98
846
 
99
847
  4.2.10
100
848
  -----------
@@ -312,7 +1060,7 @@ Sidekiq::Queues.clear_all
312
1060
  - Sidekiq's internals have been completely overhauled for performance
313
1061
  and to remove dependencies. This has resulted in major speedups, as
314
1062
  [detailed on my blog](http://www.mikeperham.com/2015/10/14/optimizing-sidekiq/).
315
- - See the [4.0 upgrade notes](4.0-Upgrade.md) for more detail.
1063
+ - See the [4.0 upgrade notes](docs/4.0-Upgrade.md) for more detail.
316
1064
 
317
1065
  3.5.4
318
1066
  -----------
@@ -349,7 +1097,7 @@ Sidekiq::Queues.clear_all
349
1097
  - **FIX MEMORY LEAK** Under rare conditions, threads may leak [#2598, gazay]
350
1098
  - Add Ukrainian locale [#2561, elrakita]
351
1099
  - Disconnect and retry Redis operations if we see a READONLY error [#2550]
352
- - Add server middleware testing harness; see [wiki](https://github.com/mperham/sidekiq/wiki/Testing#testing-server-middleware) [#2534, ryansch]
1100
+ - Add server middleware testing harness; see [wiki](https://github.com/sidekiq/sidekiq/wiki/Testing#testing-server-middleware) [#2534, ryansch]
353
1101
 
354
1102
  3.5.0
355
1103
  -----------
@@ -367,7 +1115,7 @@ Sidekiq::Queues.clear_all
367
1115
  - Fix CSRF vulnerability in Web UI, thanks to Egor Homakov for
368
1116
  reporting. [#2422] If you are running the Web UI as a standalone Rack app,
369
1117
  ensure you have a [session middleware
370
- configured](https://github.com/mperham/sidekiq/wiki/Monitoring#standalone):
1118
+ configured](https://github.com/sidekiq/sidekiq/wiki/Monitoring#standalone):
371
1119
  ```ruby
372
1120
  use Rack::Session::Cookie, :secret => "some unique secret string here"
373
1121
  ```
@@ -579,7 +1327,7 @@ sidekiq_options :dead => false, :retry => 5
579
1327
  3.0.0
580
1328
  -----------
581
1329
 
582
- Please see [3.0-Upgrade.md](3.0-Upgrade.md) for more comprehensive upgrade notes.
1330
+ Please see [3.0-Upgrade.md](docs/3.0-Upgrade.md) for more comprehensive upgrade notes.
583
1331
 
584
1332
  - **Dead Job Queue** - jobs which run out of retries are now moved to a dead
585
1333
  job queue. These jobs must be retried manually or they will expire
@@ -623,7 +1371,7 @@ Sidekiq::Client.via(ConnectionPool.new { Redis.new }) do
623
1371
  end
624
1372
  ```
625
1373
  **Sharding support does require a breaking change to client-side
626
- middleware, see 3.0-Upgrade.md.**
1374
+ middleware, see docs/3.0-Upgrade.md.**
627
1375
  - New Chinese, Greek, Swedish and Czech translations for the Web UI.
628
1376
  - Updated most languages translations for the new UI features.
629
1377
  - **Remove official Capistrano integration** - this integration has been
@@ -751,7 +1499,7 @@ middleware, see 3.0-Upgrade.md.**
751
1499
  appear to be doing any work. [#1194]
752
1500
  - Sidekiq's testing behavior is now dynamic. You can choose between
753
1501
  `inline` and `fake` behavior in your tests. See
754
- [Testing](https://github.com/mperham/sidekiq/wiki/Testing) for detail. [#1193]
1502
+ [Testing](https://github.com/sidekiq/sidekiq/wiki/Testing) for detail. [#1193]
755
1503
  - The Retries table has a new column for the error message.
756
1504
  - The Web UI topbar now contains the status and live poll button.
757
1505
  - Orphaned worker records are now auto-vacuumed when you visit the