sidekiq 7.0.9 → 7.3.10

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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +263 -0
  3. data/README.md +5 -5
  4. data/bin/multi_queue_bench +271 -0
  5. data/bin/sidekiqload +41 -14
  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 +170 -52
  9. data/lib/sidekiq/capsule.rb +8 -3
  10. data/lib/sidekiq/cli.rb +6 -2
  11. data/lib/sidekiq/client.rb +58 -22
  12. data/lib/sidekiq/component.rb +23 -1
  13. data/lib/sidekiq/config.rb +52 -11
  14. data/lib/sidekiq/deploy.rb +4 -2
  15. data/lib/sidekiq/embedded.rb +2 -0
  16. data/lib/sidekiq/fetch.rb +2 -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 +15 -8
  24. data/lib/sidekiq/job_logger.rb +7 -6
  25. data/lib/sidekiq/job_retry.rb +30 -8
  26. data/lib/sidekiq/job_util.rb +6 -2
  27. data/lib/sidekiq/launcher.rb +8 -6
  28. data/lib/sidekiq/logger.rb +1 -1
  29. data/lib/sidekiq/metrics/query.rb +6 -1
  30. data/lib/sidekiq/metrics/shared.rb +16 -5
  31. data/lib/sidekiq/metrics/tracking.rb +20 -8
  32. data/lib/sidekiq/middleware/current_attributes.rb +88 -16
  33. data/lib/sidekiq/middleware/i18n.rb +2 -0
  34. data/lib/sidekiq/middleware/modules.rb +2 -0
  35. data/lib/sidekiq/monitor.rb +2 -1
  36. data/lib/sidekiq/paginator.rb +8 -2
  37. data/lib/sidekiq/processor.rb +44 -33
  38. data/lib/sidekiq/rails.rb +28 -7
  39. data/lib/sidekiq/redis_client_adapter.rb +30 -31
  40. data/lib/sidekiq/redis_connection.rb +49 -9
  41. data/lib/sidekiq/ring_buffer.rb +3 -0
  42. data/lib/sidekiq/scheduled.rb +3 -3
  43. data/lib/sidekiq/systemd.rb +2 -0
  44. data/lib/sidekiq/testing.rb +32 -13
  45. data/lib/sidekiq/transaction_aware_client.rb +20 -5
  46. data/lib/sidekiq/version.rb +5 -1
  47. data/lib/sidekiq/web/action.rb +29 -7
  48. data/lib/sidekiq/web/application.rb +64 -25
  49. data/lib/sidekiq/web/csrf_protection.rb +9 -6
  50. data/lib/sidekiq/web/helpers.rb +95 -35
  51. data/lib/sidekiq/web/router.rb +5 -2
  52. data/lib/sidekiq/web.rb +67 -3
  53. data/lib/sidekiq.rb +5 -3
  54. data/sidekiq.gemspec +5 -13
  55. data/web/assets/javascripts/application.js +27 -0
  56. data/web/assets/javascripts/dashboard-charts.js +40 -12
  57. data/web/assets/javascripts/dashboard.js +14 -10
  58. data/web/assets/javascripts/metrics.js +34 -0
  59. data/web/assets/stylesheets/application-rtl.css +10 -0
  60. data/web/assets/stylesheets/application.css +38 -3
  61. data/web/locales/en.yml +5 -1
  62. data/web/locales/fr.yml +13 -0
  63. data/web/locales/gd.yml +0 -1
  64. data/web/locales/it.yml +32 -1
  65. data/web/locales/ja.yml +0 -1
  66. data/web/locales/pt-br.yml +20 -1
  67. data/web/locales/tr.yml +100 -0
  68. data/web/locales/uk.yml +24 -1
  69. data/web/locales/zh-cn.yml +0 -1
  70. data/web/locales/zh-tw.yml +0 -1
  71. data/web/views/_footer.erb +12 -1
  72. data/web/views/_job_info.erb +1 -1
  73. data/web/views/_metrics_period_select.erb +1 -1
  74. data/web/views/_summary.erb +7 -7
  75. data/web/views/busy.erb +7 -7
  76. data/web/views/dashboard.erb +29 -36
  77. data/web/views/filtering.erb +6 -0
  78. data/web/views/layout.erb +6 -6
  79. data/web/views/metrics.erb +38 -30
  80. data/web/views/metrics_for_job.erb +30 -39
  81. data/web/views/morgue.erb +2 -2
  82. data/web/views/queue.erb +1 -1
  83. data/web/views/queues.erb +6 -2
  84. metadata +52 -21
@@ -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>
@@ -0,0 +1,6 @@
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') %>"/>
5
+ </form>
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,11 +1,10 @@
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]
8
- hist_totals = job_result.hist.values.first.zip(*job_result.hist.values[1..-1]).map(&:sum)
7
+ hist_totals = job_result.hist.values.first.zip(*job_result.hist.values[1..-1]).map(&:sum).reverse
9
8
  bucket_labels = Sidekiq::Metrics::Histogram::LABELS
10
9
  bucket_intervals = Sidekiq::Metrics::Histogram::BUCKET_INTERVALS
11
10
  %>
@@ -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.0.9
4
+ version: 7.3.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Perham
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2023-04-18 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: redis-client
@@ -16,14 +15,20 @@ dependencies:
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: 0.11.0
18
+ version: 0.23.0
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '1'
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
23
25
  requirements:
24
26
  - - ">="
25
27
  - !ruby/object:Gem::Version
26
- version: 0.11.0
28
+ version: 0.23.0
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '1'
27
32
  - !ruby/object:Gem::Dependency
28
33
  name: connection_pool
29
34
  requirement: !ruby/object:Gem::Requirement
@@ -31,6 +36,9 @@ dependencies:
31
36
  - - ">="
32
37
  - !ruby/object:Gem::Version
33
38
  version: 2.3.0
39
+ - - "<"
40
+ - !ruby/object:Gem::Version
41
+ version: '3'
34
42
  type: :runtime
35
43
  prerelease: false
36
44
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,6 +46,9 @@ dependencies:
38
46
  - - ">="
39
47
  - !ruby/object:Gem::Version
40
48
  version: 2.3.0
49
+ - - "<"
50
+ - !ruby/object:Gem::Version
51
+ version: '3'
41
52
  - !ruby/object:Gem::Dependency
42
53
  name: rack
43
54
  requirement: !ruby/object:Gem::Requirement
@@ -45,6 +56,9 @@ dependencies:
45
56
  - - ">="
46
57
  - !ruby/object:Gem::Version
47
58
  version: 2.2.4
59
+ - - "<"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.3'
48
62
  type: :runtime
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
@@ -52,20 +66,37 @@ dependencies:
52
66
  - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: 2.2.4
69
+ - - "<"
70
+ - !ruby/object:Gem::Version
71
+ version: '3.3'
55
72
  - !ruby/object:Gem::Dependency
56
- name: concurrent-ruby
73
+ name: logger
57
74
  requirement: !ruby/object:Gem::Requirement
58
75
  requirements:
59
- - - "<"
76
+ - - ">="
60
77
  - !ruby/object:Gem::Version
61
- version: '2'
78
+ version: '0'
62
79
  type: :runtime
63
80
  prerelease: false
64
81
  version_requirements: !ruby/object:Gem::Requirement
65
82
  requirements:
66
- - - "<"
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ - !ruby/object:Gem::Dependency
87
+ name: base64
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ type: :runtime
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
67
98
  - !ruby/object:Gem::Version
68
- version: '2'
99
+ version: '0'
69
100
  description: Simple, efficient background processing for Ruby.
70
101
  email:
71
102
  - info@contribsys.com
@@ -78,9 +109,11 @@ files:
78
109
  - Changes.md
79
110
  - LICENSE.txt
80
111
  - README.md
112
+ - bin/multi_queue_bench
81
113
  - bin/sidekiq
82
114
  - bin/sidekiqload
83
115
  - bin/sidekiqmon
116
+ - lib/active_job/queue_adapters/sidekiq_adapter.rb
84
117
  - lib/generators/sidekiq/job_generator.rb
85
118
  - lib/generators/sidekiq/templates/job.rb.erb
86
119
  - lib/generators/sidekiq/templates/job_spec.rb.erb
@@ -95,7 +128,13 @@ files:
95
128
  - lib/sidekiq/deploy.rb
96
129
  - lib/sidekiq/embedded.rb
97
130
  - lib/sidekiq/fetch.rb
131
+ - lib/sidekiq/iterable_job.rb
98
132
  - lib/sidekiq/job.rb
133
+ - lib/sidekiq/job/interrupt_handler.rb
134
+ - lib/sidekiq/job/iterable.rb
135
+ - lib/sidekiq/job/iterable/active_record_enumerator.rb
136
+ - lib/sidekiq/job/iterable/csv_enumerator.rb
137
+ - lib/sidekiq/job/iterable/enumerators.rb
99
138
  - lib/sidekiq/job_logger.rb
100
139
  - lib/sidekiq/job_retry.rb
101
140
  - lib/sidekiq/job_util.rb
@@ -171,6 +210,7 @@ files:
171
210
  - web/locales/ru.yml
172
211
  - web/locales/sv.yml
173
212
  - web/locales/ta.yml
213
+ - web/locales/tr.yml
174
214
  - web/locales/uk.yml
175
215
  - web/locales/ur.yml
176
216
  - web/locales/vi.yml
@@ -187,6 +227,7 @@ files:
187
227
  - web/views/busy.erb
188
228
  - web/views/dashboard.erb
189
229
  - web/views/dead.erb
230
+ - web/views/filtering.erb
190
231
  - web/views/layout.erb
191
232
  - web/views/metrics.erb
192
233
  - web/views/metrics_for_job.erb
@@ -207,14 +248,6 @@ metadata:
207
248
  changelog_uri: https://github.com/sidekiq/sidekiq/blob/main/Changes.md
208
249
  source_code_uri: https://github.com/sidekiq/sidekiq
209
250
  rubygems_mfa_required: 'true'
210
- post_install_message: |2+
211
-
212
- Welcome to Sidekiq 7.0!
213
-
214
- 1. Use `gem 'sidekiq', '<7'` in your Gemfile if you don't want this new version.
215
- 2. Read the release notes at https://github.com/sidekiq/sidekiq/blob/main/docs/7.0-Upgrade.md
216
- 3. If you have problems, search for open/closed issues at https://github.com/sidekiq/sidekiq/issues/
217
-
218
251
  rdoc_options: []
219
252
  require_paths:
220
253
  - lib
@@ -229,9 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
229
262
  - !ruby/object:Gem::Version
230
263
  version: '0'
231
264
  requirements: []
232
- rubygems_version: 3.4.7
233
- signing_key:
265
+ rubygems_version: 3.6.9
234
266
  specification_version: 4
235
267
  summary: Simple, efficient background processing for Ruby
236
268
  test_files: []
237
- ...