sidekiq 7.1.6 → 7.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +184 -0
  3. data/README.md +3 -3
  4. data/bin/multi_queue_bench +271 -0
  5. data/bin/sidekiqload +21 -12
  6. data/lib/active_job/queue_adapters/sidekiq_adapter.rb +75 -0
  7. data/lib/generators/sidekiq/job_generator.rb +2 -0
  8. data/lib/sidekiq/api.rb +139 -44
  9. data/lib/sidekiq/capsule.rb +8 -3
  10. data/lib/sidekiq/cli.rb +4 -1
  11. data/lib/sidekiq/client.rb +21 -1
  12. data/lib/sidekiq/component.rb +22 -0
  13. data/lib/sidekiq/config.rb +31 -7
  14. data/lib/sidekiq/deploy.rb +4 -2
  15. data/lib/sidekiq/embedded.rb +2 -0
  16. data/lib/sidekiq/fetch.rb +1 -1
  17. data/lib/sidekiq/iterable_job.rb +55 -0
  18. data/lib/sidekiq/job/interrupt_handler.rb +24 -0
  19. data/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
  20. data/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
  21. data/lib/sidekiq/job/iterable/enumerators.rb +135 -0
  22. data/lib/sidekiq/job/iterable.rb +294 -0
  23. data/lib/sidekiq/job.rb +14 -3
  24. data/lib/sidekiq/job_logger.rb +7 -6
  25. data/lib/sidekiq/job_retry.rb +9 -4
  26. data/lib/sidekiq/job_util.rb +2 -0
  27. data/lib/sidekiq/launcher.rb +7 -5
  28. data/lib/sidekiq/logger.rb +1 -1
  29. data/lib/sidekiq/metrics/query.rb +6 -1
  30. data/lib/sidekiq/metrics/shared.rb +15 -4
  31. data/lib/sidekiq/metrics/tracking.rb +20 -8
  32. data/lib/sidekiq/middleware/current_attributes.rb +46 -13
  33. data/lib/sidekiq/middleware/modules.rb +2 -0
  34. data/lib/sidekiq/monitor.rb +2 -1
  35. data/lib/sidekiq/paginator.rb +8 -2
  36. data/lib/sidekiq/processor.rb +21 -11
  37. data/lib/sidekiq/rails.rb +19 -3
  38. data/lib/sidekiq/redis_client_adapter.rb +24 -5
  39. data/lib/sidekiq/redis_connection.rb +36 -8
  40. data/lib/sidekiq/ring_buffer.rb +2 -0
  41. data/lib/sidekiq/scheduled.rb +2 -2
  42. data/lib/sidekiq/systemd.rb +2 -0
  43. data/lib/sidekiq/testing.rb +14 -8
  44. data/lib/sidekiq/transaction_aware_client.rb +7 -0
  45. data/lib/sidekiq/version.rb +5 -1
  46. data/lib/sidekiq/web/action.rb +26 -4
  47. data/lib/sidekiq/web/application.rb +53 -64
  48. data/lib/sidekiq/web/csrf_protection.rb +8 -5
  49. data/lib/sidekiq/web/helpers.rb +73 -27
  50. data/lib/sidekiq/web/router.rb +5 -2
  51. data/lib/sidekiq/web.rb +54 -2
  52. data/lib/sidekiq.rb +5 -3
  53. data/sidekiq.gemspec +3 -2
  54. data/web/assets/javascripts/application.js +26 -0
  55. data/web/assets/javascripts/dashboard-charts.js +37 -11
  56. data/web/assets/javascripts/dashboard.js +14 -10
  57. data/web/assets/javascripts/metrics.js +34 -0
  58. data/web/assets/stylesheets/application-rtl.css +10 -0
  59. data/web/assets/stylesheets/application.css +38 -3
  60. data/web/locales/en.yml +3 -1
  61. data/web/locales/fr.yml +0 -1
  62. data/web/locales/gd.yml +0 -1
  63. data/web/locales/it.yml +32 -1
  64. data/web/locales/ja.yml +0 -1
  65. data/web/locales/pt-br.yml +1 -2
  66. data/web/locales/tr.yml +100 -0
  67. data/web/locales/uk.yml +24 -1
  68. data/web/locales/zh-cn.yml +0 -1
  69. data/web/locales/zh-tw.yml +0 -1
  70. data/web/views/_footer.erb +12 -1
  71. data/web/views/_metrics_period_select.erb +1 -1
  72. data/web/views/_summary.erb +7 -7
  73. data/web/views/busy.erb +7 -7
  74. data/web/views/dashboard.erb +29 -36
  75. data/web/views/filtering.erb +4 -5
  76. data/web/views/layout.erb +6 -6
  77. data/web/views/metrics.erb +38 -30
  78. data/web/views/metrics_for_job.erb +29 -38
  79. data/web/views/morgue.erb +2 -2
  80. data/web/views/queue.erb +1 -1
  81. data/web/views/queues.erb +6 -2
  82. metadata +33 -13
data/web/views/busy.erb CHANGED
@@ -86,9 +86,9 @@
86
86
  <% end %>
87
87
  </td>
88
88
  <td><%= relative_time(Time.at(process['started_at'])) %></td>
89
- <td><%= format_memory(process['rss'].to_i) %></td>
90
- <td><%= process['concurrency'] %></td>
91
- <td><%= process['busy'] %></td>
89
+ <td class="num"><%= format_memory(process['rss'].to_i) %></td>
90
+ <td class="num"><%= number_with_delimiter(process['concurrency']) %></td>
91
+ <td class="num"><%= number_with_delimiter(process['busy']) %></td>
92
92
  <td>
93
93
  <% unless process.embedded? %>
94
94
  <form method="POST">
@@ -125,14 +125,14 @@
125
125
  <th><%= t('Arguments') %></th>
126
126
  <th><%= t('Started') %></th>
127
127
  </thead>
128
- <% @workset.each do |process, thread, msg| %>
129
- <% job = Sidekiq::JobRecord.new(msg['payload']) %>
128
+ <% @workset.each do |process, thread, work| %>
129
+ <% job = work.job %>
130
130
  <tr>
131
131
  <td><%= process %></td>
132
132
  <td><%= thread %></td>
133
133
  <td><%= job.jid %></td>
134
134
  <td>
135
- <a href="<%= root_path %>queues/<%= msg['queue'] %>"><%= msg['queue'] %></a>
135
+ <a href="<%= root_path %>queues/<%= work.queue %>"><%= work.queue %></a>
136
136
  </td>
137
137
  <td>
138
138
  <%= job.display_class %>
@@ -141,7 +141,7 @@
141
141
  <td>
142
142
  <div class="args"><%= display_args(job.display_args) %></div>
143
143
  </td>
144
- <td><%= relative_time(Time.at(msg['run_at'])) %></td>
144
+ <td><%= relative_time(work.run_at) %></td>
145
145
  </tr>
146
146
  <% end %>
147
147
  </table>
@@ -1,8 +1,4 @@
1
- <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js"></script>
2
- <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js"></script>
3
- <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js"></script>
4
- <script type="text/javascript" src="<%= root_path %>javascripts/dashboard-charts.js"></script>
5
- <script type="text/javascript" src="<%= root_path %>javascripts/dashboard.js"></script>
1
+ <script type="text/javascript" src="<%= root_path %>javascripts/dashboard.js" nonce="<%= csp_nonce %>"></script>
6
2
  <div class= "dashboard clearfix">
7
3
  <h3 >
8
4
  <%= t('Dashboard') %>
@@ -13,33 +9,29 @@
13
9
  </h3>
14
10
  <div class="interval-slider ltr">
15
11
  <span class="interval-slider-label"><%= t('PollingInterval') %>:</span>
16
- <span id="sldr-text" class="current-interval">5 sec</span>
12
+ <span id="sldr-text" class="current-interval">5 s</span>
17
13
  <br/>
18
- <input id="sldr" type="range" min="2000" max="20000" step="1000" value="5000"/>
14
+ <input id="sldr" aria-label="<%= t("PollingIntervalMilliseconds") %>" type="range" min="2000" max="20000" step="1000" value="5000"/>
19
15
  </div>
20
16
  </div>
21
17
 
22
18
  <div class="row chart">
23
- <canvas id="realtime-chart"></canvas>
24
- <script>
25
- window.realtimeChart = new RealtimeChart(
26
- document.getElementById("realtime-chart"),
27
- <%= Sidekiq.dump_json({
28
- processedLabel: t('Processed'),
29
- failedLabel: t('Failed'),
30
- labels: Array.new(50, ""),
31
- processed: Array.new(50),
32
- failed: Array.new(50),
33
- updateUrl: "#{root_path}stats",
34
- }) %>
35
- )
36
- </script>
19
+ <span id="sr-last-dashboard-update-template" hidden="hidden"><%= t("LastDashboardUpdateTemplateLiteral") %></span>
20
+ <span id="sr-last-dashboard-update" class="sr-only" role="status"></span>
21
+
22
+ <canvas id="realtime-chart">
23
+ <%= to_json({
24
+ processedLabel: t('Processed'),
25
+ failedLabel: t('Failed'),
26
+ labels: Array.new(50, ""),
27
+ processed: Array.new(50),
28
+ failed: Array.new(50),
29
+ updateUrl: "#{root_path}stats",
30
+ }) %>
31
+ </canvas>
37
32
 
38
33
  <!-- start with a space in the legend so the height doesn't change when we add content dynamically -->
39
34
  <div id="realtime-legend">&nbsp;</div>
40
- <script>
41
- realtimeChart.registerLegend(document.getElementById("realtime-legend"))
42
- </script>
43
35
  </div>
44
36
 
45
37
  <div class="row header">
@@ -55,18 +47,14 @@
55
47
  <a href="<%= root_path %>?days=180" class="history-graph <%= "active" if params[:days] == "180" %>"><%= t('SixMonths') %></a>
56
48
  </div>
57
49
 
58
- <canvas id="history-chart"></canvas>
59
- <script>
60
- window.historyChart = new DashboardChart(
61
- document.getElementById("history-chart"),
62
- <%= Sidekiq.dump_json({
63
- processedLabel: t('Processed'),
64
- failedLabel: t('Failed'),
65
- processed: @processed_history.to_a.reverse,
66
- failed: @failed_history.to_a.reverse,
67
- }) %>
68
- )
69
- </script>
50
+ <canvas id="history-chart">
51
+ <%= to_json({
52
+ processedLabel: t('Processed'),
53
+ failedLabel: t('Failed'),
54
+ processed: @processed_history.to_a.reverse,
55
+ failed: @failed_history.to_a.reverse,
56
+ }) %>
57
+ </canvas>
70
58
  </div>
71
59
 
72
60
  <br/>
@@ -113,3 +101,8 @@
113
101
  <% end %>
114
102
  </div>
115
103
  </div>
104
+
105
+ <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js" nonce="<%= csp_nonce %>"></script>
106
+ <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js" nonce="<%= csp_nonce %>"></script>
107
+ <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js" nonce="<%= csp_nonce %>"></script>
108
+ <script type="text/javascript" src="<%= root_path %>javascripts/dashboard-charts.js" nonce="<%= csp_nonce %>"></script>
@@ -1,7 +1,6 @@
1
- <div class="sm-col-3 pull-right" style="display: inline; margin: 25px 15px 0 0;">
2
- <%= t('Filter') %>:
3
- <form method="POST" action='<%= root_path %>filter/<%= which %>' style="display: inline-block">
4
- <%= csrf_tag %>
5
- <input class="search" type="search" name="substr" value="<%= h params[:substr] %>" placeholder="<%= t('AnyJobContent') %>"/>
1
+ <div>
2
+ <form method="get" class="form-inline" action='<%= root_path %><%= which %>'>
3
+ <label for="substr"><%= t('Filter') %></label>
4
+ <input class="search form-control" type="search" name="substr" value="<%= h params[:substr] %>" placeholder="<%= t('AnyJobContent') %>"/>
6
5
  </form>
7
6
  </div>
data/web/views/layout.erb CHANGED
@@ -5,20 +5,20 @@
5
5
  <meta charset="utf-8" />
6
6
  <meta name="viewport" content="width=device-width,initial-scale=1.0" />
7
7
 
8
- <link href="<%= root_path %>stylesheets/bootstrap.css" media="screen" rel="stylesheet" type="text/css" />
8
+ <link href="<%= root_path %>stylesheets/bootstrap.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
9
9
  <% if rtl? %>
10
- <link href="<%= root_path %>stylesheets/bootstrap-rtl.min.css" media="screen" rel="stylesheet" type="text/css"/>
10
+ <link href="<%= root_path %>stylesheets/bootstrap-rtl.min.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>"/>
11
11
  <% end %>
12
12
 
13
- <link href="<%= root_path %>stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" />
14
- <link href="<%= root_path %>stylesheets/application-dark.css" media="screen and (prefers-color-scheme: dark)" rel="stylesheet" type="text/css" />
13
+ <link href="<%= root_path %>stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
14
+ <link href="<%= root_path %>stylesheets/application-dark.css" media="screen and (prefers-color-scheme: dark)" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
15
15
  <% if rtl? %>
16
- <link href="<%= root_path %>stylesheets/application-rtl.css" media="screen" rel="stylesheet" type="text/css" />
16
+ <link href="<%= root_path %>stylesheets/application-rtl.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
17
17
  <% end %>
18
18
 
19
19
  <link rel="apple-touch-icon" href="<%= root_path %>images/apple-touch-icon.png">
20
20
  <link rel="shortcut icon" type="image/ico" href="<%= root_path %>images/favicon.ico" />
21
- <script type="text/javascript" src="<%= root_path %>javascripts/application.js"></script>
21
+ <script type="text/javascript" src="<%= root_path %>javascripts/application.js" nonce="<%= csp_nonce %>"></script>
22
22
  <meta name="google" content="notranslate" />
23
23
  <%= display_custom_head %>
24
24
  </head>
@@ -1,16 +1,28 @@
1
- <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js"></script>
2
- <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js"></script>
3
- <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js"></script>
4
- <script type="text/javascript" src="<%= root_path %>javascripts/metrics.js"></script>
1
+ <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js" nonce="<%= csp_nonce %>"></script>
2
+ <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js" nonce="<%= csp_nonce %>"></script>
3
+ <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js" nonce="<%= csp_nonce %>"></script>
5
4
 
6
5
  <div class="header-container">
7
6
  <div class="page-title-container">
8
7
  <h1><%= t('Metrics') %></h1>
9
-
10
8
  <a target="blank" href="https://github.com/sidekiq/sidekiq/wiki/Metrics"><span class="info-circle" title="Click to learn more about metrics">?</span></a>
11
9
  </div>
12
10
 
13
- <%= erb :_metrics_period_select, locals: { periods: @periods, period: @period, path: "#{root_path}metrics" } %>
11
+ <div>
12
+ <form id="metrics-form" class="form-inline" action="<%= root_path %>metrics" method="get">
13
+ <label for="substr"><%= t('Filter') %></label>
14
+ <input id="class-filter" class="form-control" type="text" name="substr" placeholder="<%= t('Name') %>" value="<%= h params[:substr] %>">
15
+ <select id="period-selector" class="form-control" name="period">
16
+ <% @periods.each_key do |code| %>
17
+ <% if code == @period %>
18
+ <option selected value="<%= code %>"><%= code %></option>
19
+ <% else %>
20
+ <option value="<%= code %>"><%= code %></option>
21
+ <% end %>
22
+ <% end %>
23
+ </select>
24
+ </form>
25
+ </div>
14
26
  </div>
15
27
 
16
28
  <%
@@ -21,22 +33,17 @@
21
33
  %>
22
34
 
23
35
  <% if job_results.any? %>
24
- <canvas id="job-metrics-overview-chart"></canvas>
25
-
26
- <script>
27
- window.jobMetricsChart = new JobMetricsOverviewChart(
28
- document.getElementById("job-metrics-overview-chart"),
29
- <%= Sidekiq.dump_json({
30
- series: job_results.map { |(kls, jr)| [kls, jr.dig("series", "s")] }.to_h,
31
- marks: @query_result.marks.map { |m| [m.bucket, m.label] },
32
- labels: @query_result.buckets,
33
- visibleKls: visible_kls,
34
- yLabel: t('TotalExecutionTime'),
35
- units: t('Seconds').downcase,
36
- markLabel: t('Deploy'),
37
- }) %>
38
- )
39
- </script>
36
+ <canvas id="job-metrics-overview-chart">
37
+ <%= to_json({
38
+ series: job_results.map { |(kls, jr)| [kls, jr.dig("series", "s")] }.to_h,
39
+ marks: @query_result.marks.map { |m| [m.bucket, m.label] },
40
+ labels: @query_result.buckets,
41
+ visibleKls: visible_kls,
42
+ yLabel: t('TotalExecutionTime'),
43
+ units: t('Seconds').downcase,
44
+ markLabel: t('Deploy'),
45
+ }) %>
46
+ </canvas>
40
47
  <% end %>
41
48
 
42
49
  <div class="table_container">
@@ -46,8 +53,8 @@
46
53
  <th><%= t('Name') %></th>
47
54
  <th><%= t('Success') %></th>
48
55
  <th><%= t('Failure') %></th>
49
- <th><%= t('TotalExecutionTime') %></th>
50
- <th><%= t('AvgExecutionTime') %></th>
56
+ <th><%= t('TotalExecutionTime') %> (<%= t('Seconds') %>)</th>
57
+ <th><%= t('AvgExecutionTime') %> (<%= t('Seconds') %>)</th>
51
58
  </tr>
52
59
  <% if job_results.any? %>
53
60
  <% job_results.each_with_index do |(kls, jr), i| %>
@@ -64,12 +71,11 @@
64
71
  />
65
72
  <code><a href="<%= root_path %>metrics/<%= kls %>?period=<%= @period %>"><%= kls %></a></code>
66
73
  </div>
67
- <script>jobMetricsChart.registerSwatch("<%= id %>")</script>
68
74
  </td>
69
- <td><%= jr.dig("totals", "p") - jr.dig("totals", "f") %></td>
70
- <td><%= jr.dig("totals", "f") %></td>
71
- <td><%= jr.dig("totals", "s").round(2) %> seconds</td>
72
- <td><%= jr.total_avg("s").round(2) %> seconds</td>
75
+ <td class="num"><%= number_with_delimiter(jr.dig("totals", "p") - jr.dig("totals", "f")) %></td>
76
+ <td class="num"><%= number_with_delimiter(jr.dig("totals", "f")) %></td>
77
+ <td class="num"><%= number_with_delimiter(jr.dig("totals", "s"), precision: 2) %></td>
78
+ <td class="num"><%= number_with_delimiter(jr.total_avg("s"), precision: 2) %></td>
73
79
  </tr>
74
80
  <% end %>
75
81
  <% else %>
@@ -79,4 +85,6 @@
79
85
  </table>
80
86
  </div>
81
87
 
82
- <p><small>Data from <%= @query_result.starts_at %> to <%= @query_result.ends_at %></small></p>
88
+ <!--p><small>Data from <%= @query_result.starts_at %> to <%= @query_result.ends_at %></small></p-->
89
+
90
+ <script type="text/javascript" src="<%= root_path %>javascripts/metrics.js" nonce="<%= csp_nonce %>"></script>
@@ -1,7 +1,6 @@
1
- <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js"></script>
2
- <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js"></script>
3
- <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js"></script>
4
- <script type="text/javascript" src="<%= root_path %>javascripts/metrics.js"></script>
1
+ <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js" nonce="<%= csp_nonce %>"></script>
2
+ <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js" nonce="<%= csp_nonce %>"></script>
3
+ <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js" nonce="<%= csp_nonce %>"></script>
5
4
 
6
5
  <%
7
6
  job_result = @query_result.job_results[@name]
@@ -24,40 +23,30 @@
24
23
  <%= erb :_metrics_period_select, locals: { periods: @periods, period: @period, path: "#{root_path}metrics/#{@name}" } %>
25
24
  </div>
26
25
 
27
- <canvas id="hist-totals-chart"></canvas>
28
-
29
- <script>
30
- window.histTotalsChart = new HistTotalsChart(
31
- document.getElementById("hist-totals-chart"),
32
- <%= Sidekiq.dump_json({
33
- series: hist_totals,
34
- labels: bucket_labels,
35
- xLabel: t('ExecutionTime'),
36
- yLabel: t('Jobs'),
37
- units: t('Jobs').downcase,
38
- }) %>
39
- )
40
- </script>
41
-
42
- <canvas id="hist-bubble-chart"></canvas>
43
-
44
- <script>
45
- window.histBubbleChart = new HistBubbleChart(
46
- document.getElementById("hist-bubble-chart"),
47
- <%= Sidekiq.dump_json({
48
- hist: job_result.hist,
49
- marks: @query_result.marks.map { |m| [m.bucket, m.label] },
50
- labels: @query_result.buckets,
51
- histIntervals: bucket_intervals,
52
- yLabel: t('ExecutionTime'),
53
- markLabel: t('Deploy'),
54
- yUnits: t('Seconds').downcase,
55
- zUnits: t('Jobs').downcase,
56
- }) %>
57
- )
58
- </script>
59
-
60
- <p><small>Data from <%= @query_result.starts_at %> to <%= @query_result.ends_at %></small></p>
26
+ <canvas id="hist-totals-chart">
27
+ <%= to_json({
28
+ series: hist_totals,
29
+ labels: bucket_labels,
30
+ xLabel: t('ExecutionTime'),
31
+ yLabel: t('Jobs'),
32
+ units: t('Jobs').downcase,
33
+ }) %>
34
+ </canvas>
35
+
36
+ <canvas id="hist-bubble-chart">
37
+ <%= to_json({
38
+ hist: job_result.hist,
39
+ marks: @query_result.marks.map { |m| [m.bucket, m.label] },
40
+ labels: @query_result.buckets,
41
+ histIntervals: bucket_intervals,
42
+ yLabel: t('ExecutionTime'),
43
+ markLabel: t('Deploy'),
44
+ yUnits: t('Seconds').downcase,
45
+ zUnits: t('Jobs').downcase,
46
+ }) %>
47
+ </canvas>
48
+
49
+ <!--p><small>Data from <%= @query_result.starts_at %> to <%= @query_result.ends_at %></small></p-->
61
50
  <% else %>
62
51
  <h1>
63
52
  <a href="<%= root_path %>/metrics"><%= t('Metrics') %></a> /
@@ -66,3 +55,5 @@
66
55
 
67
56
  <div class="alert alert-success"><%= t('NoJobMetricsFound') %></div>
68
57
  <% end %>
58
+
59
+ <script type="text/javascript" src="<%= root_path %>javascripts/metrics.js" nonce="<%= csp_nonce %>"></script>
data/web/views/morgue.erb CHANGED
@@ -3,7 +3,7 @@
3
3
  <% if @dead.size > 0 && @total_size > @count %>
4
4
  <%= erb :_paging, locals: { url: "#{root_path}morgue" } %>
5
5
  <% end %>
6
- <%= filtering('dead') %>
6
+ <%= filtering('morgue') %>
7
7
  </div>
8
8
 
9
9
  <% if @dead.size > 0 %>
@@ -40,7 +40,7 @@
40
40
  </td>
41
41
  <td>
42
42
  <%= entry.display_class %>
43
- <%= display_tags(entry, "dead") %>
43
+ <%= display_tags(entry, "morgue") %>
44
44
  </td>
45
45
  <td>
46
46
  <div class="args"><%= display_args(entry.display_args) %></div>
data/web/views/queue.erb CHANGED
@@ -15,7 +15,7 @@
15
15
  <th><%= t('Job') %></th>
16
16
  <th><%= t('Arguments') %></th>
17
17
  <th><%= t('Context') %></th>
18
- <th></th>
18
+ <th><%= t('Actions') %></th>
19
19
  </thead>
20
20
  <% @jobs.each_with_index do |job, index| %>
21
21
  <tr title="<%= job.jid %>">
data/web/views/queues.erb CHANGED
@@ -18,8 +18,12 @@
18
18
  <span class="label label-danger"><%= t('Paused') %></span>
19
19
  <% end %>
20
20
  </td>
21
- <td><%= number_with_delimiter(queue.size) %> </td>
22
- <td><% queue_latency = queue.latency %><%= number_with_delimiter(queue_latency.round(2)) %><%= (queue_latency < 60) ? '' : " (#{relative_time(Time.at(Time.now.to_f - queue_latency))})" %> </td>
21
+ <td class="num"><%= number_with_delimiter(queue.size) %> </td>
22
+ <td class="num">
23
+ <% queue_latency = queue.latency %>
24
+ <%= (queue_latency < 60) ? '' : " (#{relative_time(Time.at(Time.now.to_f - queue_latency))})" %>
25
+ <%= number_with_delimiter(queue_latency, precision: 2) %>
26
+ </td>
23
27
  <td class="delete-confirm">
24
28
  <form action="<%=root_path %>queues/<%= CGI.escape(queue.name) %>" method="post">
25
29
  <%= csrf_tag %>
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.6
4
+ version: 7.3.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Perham
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2023-10-09 00:00:00.000000000 Z
10
+ date: 2025-02-14 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: redis-client
@@ -16,14 +15,14 @@ dependencies:
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: 0.14.0
18
+ version: 0.22.2
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - ">="
25
24
  - !ruby/object:Gem::Version
26
- version: 0.14.0
25
+ version: 0.22.2
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: connection_pool
29
28
  requirement: !ruby/object:Gem::Requirement
@@ -53,19 +52,33 @@ dependencies:
53
52
  - !ruby/object:Gem::Version
54
53
  version: 2.2.4
55
54
  - !ruby/object:Gem::Dependency
56
- name: concurrent-ruby
55
+ name: logger
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
- - - "<"
58
+ - - ">="
60
59
  - !ruby/object:Gem::Version
61
- version: '2'
60
+ version: '0'
62
61
  type: :runtime
63
62
  prerelease: false
64
63
  version_requirements: !ruby/object:Gem::Requirement
65
64
  requirements:
66
- - - "<"
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: base64
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
67
80
  - !ruby/object:Gem::Version
68
- version: '2'
81
+ version: '0'
69
82
  description: Simple, efficient background processing for Ruby.
70
83
  email:
71
84
  - info@contribsys.com
@@ -78,9 +91,11 @@ files:
78
91
  - Changes.md
79
92
  - LICENSE.txt
80
93
  - README.md
94
+ - bin/multi_queue_bench
81
95
  - bin/sidekiq
82
96
  - bin/sidekiqload
83
97
  - bin/sidekiqmon
98
+ - lib/active_job/queue_adapters/sidekiq_adapter.rb
84
99
  - lib/generators/sidekiq/job_generator.rb
85
100
  - lib/generators/sidekiq/templates/job.rb.erb
86
101
  - lib/generators/sidekiq/templates/job_spec.rb.erb
@@ -95,7 +110,13 @@ files:
95
110
  - lib/sidekiq/deploy.rb
96
111
  - lib/sidekiq/embedded.rb
97
112
  - lib/sidekiq/fetch.rb
113
+ - lib/sidekiq/iterable_job.rb
98
114
  - lib/sidekiq/job.rb
115
+ - lib/sidekiq/job/interrupt_handler.rb
116
+ - lib/sidekiq/job/iterable.rb
117
+ - lib/sidekiq/job/iterable/active_record_enumerator.rb
118
+ - lib/sidekiq/job/iterable/csv_enumerator.rb
119
+ - lib/sidekiq/job/iterable/enumerators.rb
99
120
  - lib/sidekiq/job_logger.rb
100
121
  - lib/sidekiq/job_retry.rb
101
122
  - lib/sidekiq/job_util.rb
@@ -171,6 +192,7 @@ files:
171
192
  - web/locales/ru.yml
172
193
  - web/locales/sv.yml
173
194
  - web/locales/ta.yml
195
+ - web/locales/tr.yml
174
196
  - web/locales/uk.yml
175
197
  - web/locales/ur.yml
176
198
  - web/locales/vi.yml
@@ -208,7 +230,6 @@ metadata:
208
230
  changelog_uri: https://github.com/sidekiq/sidekiq/blob/main/Changes.md
209
231
  source_code_uri: https://github.com/sidekiq/sidekiq
210
232
  rubygems_mfa_required: 'true'
211
- post_install_message:
212
233
  rdoc_options: []
213
234
  require_paths:
214
235
  - lib
@@ -223,8 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
223
244
  - !ruby/object:Gem::Version
224
245
  version: '0'
225
246
  requirements: []
226
- rubygems_version: 3.4.20
227
- signing_key:
247
+ rubygems_version: 3.6.2
228
248
  specification_version: 4
229
249
  summary: Simple, efficient background processing for Ruby
230
250
  test_files: []