sidekiq 6.5.1 → 7.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +376 -12
  3. data/README.md +43 -35
  4. data/bin/multi_queue_bench +271 -0
  5. data/bin/sidekiq +3 -8
  6. data/bin/sidekiqload +213 -118
  7. data/bin/sidekiqmon +3 -0
  8. data/lib/active_job/queue_adapters/sidekiq_adapter.rb +88 -0
  9. data/lib/generators/sidekiq/job_generator.rb +2 -0
  10. data/lib/sidekiq/api.rb +378 -173
  11. data/lib/sidekiq/capsule.rb +132 -0
  12. data/lib/sidekiq/cli.rb +61 -63
  13. data/lib/sidekiq/client.rb +89 -40
  14. data/lib/sidekiq/component.rb +6 -2
  15. data/lib/sidekiq/config.rb +305 -0
  16. data/lib/sidekiq/deploy.rb +64 -0
  17. data/lib/sidekiq/embedded.rb +63 -0
  18. data/lib/sidekiq/fetch.rb +11 -14
  19. data/lib/sidekiq/iterable_job.rb +55 -0
  20. data/lib/sidekiq/job/interrupt_handler.rb +24 -0
  21. data/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
  22. data/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
  23. data/lib/sidekiq/job/iterable/enumerators.rb +135 -0
  24. data/lib/sidekiq/job/iterable.rb +294 -0
  25. data/lib/sidekiq/job.rb +382 -10
  26. data/lib/sidekiq/job_logger.rb +8 -7
  27. data/lib/sidekiq/job_retry.rb +89 -46
  28. data/lib/sidekiq/job_util.rb +53 -15
  29. data/lib/sidekiq/launcher.rb +77 -69
  30. data/lib/sidekiq/logger.rb +2 -27
  31. data/lib/sidekiq/manager.rb +9 -11
  32. data/lib/sidekiq/metrics/query.rb +158 -0
  33. data/lib/sidekiq/metrics/shared.rb +106 -0
  34. data/lib/sidekiq/metrics/tracking.rb +148 -0
  35. data/lib/sidekiq/middleware/chain.rb +84 -48
  36. data/lib/sidekiq/middleware/current_attributes.rb +87 -20
  37. data/lib/sidekiq/middleware/modules.rb +2 -0
  38. data/lib/sidekiq/monitor.rb +19 -5
  39. data/lib/sidekiq/paginator.rb +11 -3
  40. data/lib/sidekiq/processor.rb +67 -56
  41. data/lib/sidekiq/rails.rb +22 -16
  42. data/lib/sidekiq/redis_client_adapter.rb +31 -71
  43. data/lib/sidekiq/redis_connection.rb +44 -117
  44. data/lib/sidekiq/ring_buffer.rb +2 -0
  45. data/lib/sidekiq/scheduled.rb +62 -35
  46. data/lib/sidekiq/systemd.rb +2 -0
  47. data/lib/sidekiq/testing.rb +37 -46
  48. data/lib/sidekiq/transaction_aware_client.rb +11 -5
  49. data/lib/sidekiq/version.rb +6 -1
  50. data/lib/sidekiq/web/action.rb +15 -5
  51. data/lib/sidekiq/web/application.rb +94 -24
  52. data/lib/sidekiq/web/csrf_protection.rb +10 -7
  53. data/lib/sidekiq/web/helpers.rb +118 -45
  54. data/lib/sidekiq/web/router.rb +5 -2
  55. data/lib/sidekiq/web.rb +67 -15
  56. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  57. data/lib/sidekiq.rb +78 -266
  58. data/sidekiq.gemspec +12 -10
  59. data/web/assets/javascripts/application.js +46 -1
  60. data/web/assets/javascripts/base-charts.js +106 -0
  61. data/web/assets/javascripts/chart.min.js +13 -0
  62. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  63. data/web/assets/javascripts/dashboard-charts.js +192 -0
  64. data/web/assets/javascripts/dashboard.js +11 -250
  65. data/web/assets/javascripts/metrics.js +298 -0
  66. data/web/assets/stylesheets/application-dark.css +4 -0
  67. data/web/assets/stylesheets/application-rtl.css +10 -89
  68. data/web/assets/stylesheets/application.css +98 -295
  69. data/web/locales/ar.yml +70 -70
  70. data/web/locales/cs.yml +62 -62
  71. data/web/locales/da.yml +60 -53
  72. data/web/locales/de.yml +65 -65
  73. data/web/locales/el.yml +43 -24
  74. data/web/locales/en.yml +83 -69
  75. data/web/locales/es.yml +68 -68
  76. data/web/locales/fa.yml +65 -65
  77. data/web/locales/fr.yml +80 -67
  78. data/web/locales/gd.yml +98 -0
  79. data/web/locales/he.yml +65 -64
  80. data/web/locales/hi.yml +59 -59
  81. data/web/locales/it.yml +85 -54
  82. data/web/locales/ja.yml +72 -68
  83. data/web/locales/ko.yml +52 -52
  84. data/web/locales/lt.yml +66 -66
  85. data/web/locales/nb.yml +61 -61
  86. data/web/locales/nl.yml +52 -52
  87. data/web/locales/pl.yml +45 -45
  88. data/web/locales/pt-br.yml +78 -69
  89. data/web/locales/pt.yml +51 -51
  90. data/web/locales/ru.yml +67 -66
  91. data/web/locales/sv.yml +53 -53
  92. data/web/locales/ta.yml +60 -60
  93. data/web/locales/tr.yml +100 -0
  94. data/web/locales/uk.yml +85 -61
  95. data/web/locales/ur.yml +64 -64
  96. data/web/locales/vi.yml +67 -67
  97. data/web/locales/zh-cn.yml +42 -16
  98. data/web/locales/zh-tw.yml +41 -8
  99. data/web/views/_footer.erb +17 -2
  100. data/web/views/_job_info.erb +18 -2
  101. data/web/views/_metrics_period_select.erb +12 -0
  102. data/web/views/_nav.erb +1 -1
  103. data/web/views/_paging.erb +2 -0
  104. data/web/views/_poll_link.erb +1 -1
  105. data/web/views/_summary.erb +7 -7
  106. data/web/views/busy.erb +49 -33
  107. data/web/views/dashboard.erb +28 -6
  108. data/web/views/filtering.erb +6 -0
  109. data/web/views/layout.erb +6 -6
  110. data/web/views/metrics.erb +90 -0
  111. data/web/views/metrics_for_job.erb +59 -0
  112. data/web/views/morgue.erb +5 -9
  113. data/web/views/queue.erb +15 -15
  114. data/web/views/queues.erb +9 -3
  115. data/web/views/retries.erb +5 -9
  116. data/web/views/scheduled.erb +12 -13
  117. metadata +61 -26
  118. data/lib/sidekiq/.DS_Store +0 -0
  119. data/lib/sidekiq/delay.rb +0 -43
  120. data/lib/sidekiq/extensions/action_mailer.rb +0 -48
  121. data/lib/sidekiq/extensions/active_record.rb +0 -43
  122. data/lib/sidekiq/extensions/class_methods.rb +0 -43
  123. data/lib/sidekiq/extensions/generic_proxy.rb +0 -33
  124. data/lib/sidekiq/worker.rb +0 -367
  125. /data/{LICENSE → LICENSE.txt} +0 -0
@@ -1,4 +1,4 @@
1
- <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>
2
2
  <div class= "dashboard clearfix">
3
3
  <h3 >
4
4
  <%= t('Dashboard') %>
@@ -9,15 +9,26 @@
9
9
  </h3>
10
10
  <div class="interval-slider ltr">
11
11
  <span class="interval-slider-label"><%= t('PollingInterval') %>:</span>
12
- <span id="sldr-text" class="current-interval">5 sec</span>
12
+ <span id="sldr-text" class="current-interval">5 s</span>
13
13
  <br/>
14
14
  <input id="sldr" type="range" min="2000" max="20000" step="1000" value="5000"/>
15
15
  </div>
16
16
  </div>
17
17
 
18
18
  <div class="row chart">
19
- <div id="realtime" data-processed-label="<%= t('Processed') %>" data-failed-label="<%= t('Failed') %>"></div>
20
- <div id="realtime-legend"></div>
19
+ <canvas id="realtime-chart">
20
+ <%= to_json({
21
+ processedLabel: t('Processed'),
22
+ failedLabel: t('Failed'),
23
+ labels: Array.new(50, ""),
24
+ processed: Array.new(50),
25
+ failed: Array.new(50),
26
+ updateUrl: "#{root_path}stats",
27
+ }) %>
28
+ </canvas>
29
+
30
+ <!-- start with a space in the legend so the height doesn't change when we add content dynamically -->
31
+ <div id="realtime-legend">&nbsp;</div>
21
32
  </div>
22
33
 
23
34
  <div class="row header">
@@ -33,8 +44,14 @@
33
44
  <a href="<%= root_path %>?days=180" class="history-graph <%= "active" if params[:days] == "180" %>"><%= t('SixMonths') %></a>
34
45
  </div>
35
46
 
36
- <div id="history" data-processed-label="<%= t('Processed') %>" data-failed-label="<%= t('Failed') %>" data-processed="<%= h Sidekiq.dump_json(@processed_history) %>" data-failed="<%= h Sidekiq.dump_json(@failed_history) %>" data-update-url="<%= root_path %>stats"></div>
37
- <div id="history-legend"></div>
47
+ <canvas id="history-chart">
48
+ <%= to_json({
49
+ processedLabel: t('Processed'),
50
+ failedLabel: t('Failed'),
51
+ processed: @processed_history.to_a.reverse,
52
+ failed: @failed_history.to_a.reverse,
53
+ }) %>
54
+ </canvas>
38
55
  </div>
39
56
 
40
57
  <br/>
@@ -81,3 +98,8 @@
81
98
  <% end %>
82
99
  </div>
83
100
  </div>
101
+
102
+ <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js" nonce="<%= csp_nonce %>"></script>
103
+ <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js" nonce="<%= csp_nonce %>"></script>
104
+ <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js" nonce="<%= csp_nonce %>"></script>
105
+ <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>
@@ -0,0 +1,90 @@
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>
4
+
5
+ <div class="header-container">
6
+ <div class="page-title-container">
7
+ <h1><%= t('Metrics') %></h1>
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>
9
+ </div>
10
+
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>
26
+ </div>
27
+
28
+ <%
29
+ table_limit = 20
30
+ chart_limit = 5
31
+ job_results = @query_result.job_results.sort_by { |(kls, jr)| jr.totals["s"] }.reverse.first(table_limit)
32
+ visible_kls = job_results.first(chart_limit).map(&:first)
33
+ %>
34
+
35
+ <% if job_results.any? %>
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>
47
+ <% end %>
48
+
49
+ <div class="table_container">
50
+ <table class="table table-bordered table-striped table-hover">
51
+ <tbody>
52
+ <tr>
53
+ <th><%= t('Name') %></th>
54
+ <th><%= t('Success') %></th>
55
+ <th><%= t('Failure') %></th>
56
+ <th><%= t('TotalExecutionTime') %> (<%= t('Seconds') %>)</th>
57
+ <th><%= t('AvgExecutionTime') %> (<%= t('Seconds') %>)</th>
58
+ </tr>
59
+ <% if job_results.any? %>
60
+ <% job_results.each_with_index do |(kls, jr), i| %>
61
+ <tr>
62
+ <td>
63
+ <div class="metrics-swatch-wrapper">
64
+ <% id = "metrics-swatch-#{kls}" %>
65
+ <input
66
+ type="checkbox"
67
+ id="<%= id %>"
68
+ class="metrics-swatch"
69
+ value="<%= kls %>"
70
+ <%= visible_kls.include?(kls) ? 'checked' : '' %>
71
+ />
72
+ <code><a href="<%= root_path %>metrics/<%= kls %>?period=<%= @period %>"><%= kls %></a></code>
73
+ </div>
74
+ </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>
79
+ </tr>
80
+ <% end %>
81
+ <% else %>
82
+ <tr><td colspan=5><%= t("NoDataFound") %></td></tr>
83
+ <% end %>
84
+ </tbody>
85
+ </table>
86
+ </div>
87
+
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>
@@ -0,0 +1,59 @@
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>
4
+
5
+ <%
6
+ job_result = @query_result.job_results[@name]
7
+ hist_totals = job_result.hist.values.first.zip(*job_result.hist.values[1..-1]).map(&:sum).reverse
8
+ bucket_labels = Sidekiq::Metrics::Histogram::LABELS
9
+ bucket_intervals = Sidekiq::Metrics::Histogram::BUCKET_INTERVALS
10
+ %>
11
+
12
+ <% if job_result.totals["s"] > 0 %>
13
+ <div class="header-container">
14
+ <div class="page-title-container">
15
+ <h1>
16
+ <a href="<%= root_path %>metrics?period=<%= @period %>"><%= t('Metrics') %></a> /
17
+ <%= h @name %>
18
+ </h1>
19
+
20
+ <a target="blank" href="https://github.com/sidekiq/sidekiq/wiki/Metrics"><span class="info-circle" title="Click to learn more about metrics">?</span></a>
21
+ </div>
22
+
23
+ <%= erb :_metrics_period_select, locals: { periods: @periods, period: @period, path: "#{root_path}metrics/#{@name}" } %>
24
+ </div>
25
+
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-->
50
+ <% else %>
51
+ <h1>
52
+ <a href="<%= root_path %>/metrics"><%= t('Metrics') %></a> /
53
+ <%= h @name %>
54
+ </h1>
55
+
56
+ <div class="alert alert-success"><%= t('NoJobMetricsFound') %></div>
57
+ <% end %>
58
+
59
+ <script type="text/javascript" src="<%= root_path %>javascripts/metrics.js" nonce="<%= csp_nonce %>"></script>
data/web/views/morgue.erb CHANGED
@@ -1,14 +1,10 @@
1
- <header class="row">
2
- <div class="col-sm-5">
3
- <h3><%= t('DeadJobs') %></h3>
4
- </div>
1
+ <div class="header-container">
2
+ <h1><%= t('DeadJobs') %></h1>
5
3
  <% if @dead.size > 0 && @total_size > @count %>
6
- <div class="col-sm-4">
7
- <%= erb :_paging, locals: { url: "#{root_path}morgue" } %>
8
- </div>
4
+ <%= erb :_paging, locals: { url: "#{root_path}morgue" } %>
9
5
  <% end %>
10
6
  <%= filtering('dead') %>
11
- </header>
7
+ </div>
12
8
 
13
9
  <% if @dead.size > 0 %>
14
10
  <form action="<%= root_path %>morgue" method="post">
@@ -33,7 +29,7 @@
33
29
  <tr>
34
30
  <td class="table-checkbox">
35
31
  <label>
36
- <input type='checkbox' name='key[]' value='<%= job_params(entry.item, entry.score) %>' />
32
+ <input type='checkbox' name='key[]' value='<%= job_params(entry.item, entry.score) %>' class='shift_clickable' />
37
33
  </label>
38
34
  </td>
39
35
  <td>
data/web/views/queue.erb CHANGED
@@ -1,23 +1,20 @@
1
- <header class="row">
2
- <div class="col-sm-5">
3
- <h3>
4
- <%= t('CurrentMessagesInQueue', :queue => h(@name)) %>
5
- <% if @queue.paused? %>
6
- <span class="label label-danger"><%= t('Paused') %></span>
7
- <% end %>
8
- <span class="badge badge-secondary"><%= number_with_delimiter(@total_size) %></span>
9
- </h3>
10
- </div>
11
- <div class="col-sm-4 pull-right flip">
12
- <%= erb :_paging, locals: { url: "#{root_path}queues/#{CGI.escape(@name)}" } %>
13
- </div>
14
- </header>
1
+ <div class="header-container">
2
+ <h1><%= t('CurrentMessagesInQueue', :queue => h(@name)) %>
3
+ <% if @queue.paused? %>
4
+ <span class="label label-danger"><%= t('Paused') %></span>
5
+ <% end %>
6
+ <span class="badge badge-secondary"><%= number_with_delimiter(@total_size) %></span>
7
+ </h1>
8
+ <%= erb :_paging, locals: { url: "#{root_path}queues/#{CGI.escape(@name)}" } %>
9
+ </div>
10
+
15
11
  <div class="table_container">
16
12
  <table class="queue table table-hover table-bordered table-striped">
17
13
  <thead>
18
14
  <th><a href="<%= url %>?direction=<%= params[:direction] == 'asc' ? 'desc' : 'asc' %>"># <%= sort_direction_label %></a></th>
19
15
  <th><%= t('Job') %></th>
20
16
  <th><%= t('Arguments') %></th>
17
+ <th><%= t('Context') %></th>
21
18
  <th></th>
22
19
  </thead>
23
20
  <% @jobs.each_with_index do |job, index| %>
@@ -35,12 +32,15 @@
35
32
  <% a = job.display_args %>
36
33
  <% if a.inspect.size > 100 %>
37
34
  <span id="job_<%= index %>"><%= h(a.inspect[0..100]) + "... " %></span>
38
- <button data-toggle="job_<%= index %>" class="btn btn-default btn-xs"><%= t('ShowAll') %></button>
35
+ <button data-toggle="job_<%= index %>_full" class="btn btn-default btn-xs"><%= t('ShowAll') %></button>
39
36
  <div class="toggle" id="job_<%= index %>_full"><%= display_args(a) %></div>
40
37
  <% else %>
41
38
  <%= display_args(job.display_args) %>
42
39
  <% end %>
43
40
  </td>
41
+ <td>
42
+ <%= h(job["cattr"].inspect) if job["cattr"]&.any? %>
43
+ </td>
44
44
  <td>
45
45
  <form action="<%= root_path %>queues/<%= CGI.escape(@name) %>/delete" method="post">
46
46
  <%= csrf_tag %>
data/web/views/queues.erb CHANGED
@@ -1,4 +1,6 @@
1
- <h3><%= t('Queues') %></h3>
1
+ <div class="header-container">
2
+ <h1><%= t('Queues') %></h1>
3
+ </div>
2
4
 
3
5
  <div class="table_container">
4
6
  <table class="queues table table-hover table-bordered table-striped">
@@ -16,8 +18,12 @@
16
18
  <span class="label label-danger"><%= t('Paused') %></span>
17
19
  <% end %>
18
20
  </td>
19
- <td><%= number_with_delimiter(queue.size) %> </td>
20
- <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>
21
27
  <td class="delete-confirm">
22
28
  <form action="<%=root_path %>queues/<%= CGI.escape(queue.name) %>" method="post">
23
29
  <%= csrf_tag %>
@@ -1,14 +1,10 @@
1
- <header class="row">
2
- <div class="col-sm-5">
3
- <h3><%= t('Retries') %></h3>
4
- </div>
1
+ <div class="header-container">
2
+ <h1><%= t('Retries') %></h1>
5
3
  <% if @retries.size > 0 && @total_size > @count %>
6
- <div class="col-sm-4">
7
- <%= erb :_paging, locals: { url: "#{root_path}retries" } %>
8
- </div>
4
+ <%= erb :_paging, locals: { url: "#{root_path}retries" } %>
9
5
  <% end %>
10
6
  <%= filtering('retries') %>
11
- </header>
7
+ </div>
12
8
 
13
9
  <% if @retries.size > 0 %>
14
10
  <form action="<%= root_path %>retries" method="post">
@@ -34,7 +30,7 @@
34
30
  <tr>
35
31
  <td class="table-checkbox">
36
32
  <label>
37
- <input type='checkbox' name='key[]' value='<%= job_params(entry.item, entry.score) %>' />
33
+ <input type='checkbox' name='key[]' value='<%= job_params(entry.item, entry.score) %>' class='shift_clickable' />
38
34
  </label>
39
35
  </td>
40
36
  <td>
@@ -1,25 +1,22 @@
1
- <header class="row">
2
- <div class="col-sm-5">
3
- <h3><%= t('ScheduledJobs') %></h3>
4
- </div>
1
+ <div class="header-container">
2
+ <h1><%= t('ScheduledJobs') %></h1>
5
3
  <% if @scheduled.size > 0 && @total_size > @count %>
6
- <div class="col-sm-4">
7
- <%= erb :_paging, locals: { url: "#{root_path}scheduled" } %>
8
- </div>
4
+ <%= erb :_paging, locals: { url: "#{root_path}scheduled" } %>
9
5
  <% end %>
10
6
  <%= filtering('scheduled') %>
11
- </header>
7
+ </div>
12
8
 
13
9
  <% if @scheduled.size > 0 %>
14
-
15
10
  <form action="<%= root_path %>scheduled" method="post">
16
11
  <%= csrf_tag %>
17
12
  <div class="table_container">
18
13
  <table class="table table-striped table-bordered table-hover">
19
14
  <thead>
20
15
  <tr>
21
- <th class="checkbox-column">
22
- <input type="checkbox" class="check_all" />
16
+ <th class="table-checkbox checkbox-column">
17
+ <label>
18
+ <input type="checkbox" class="check_all" />
19
+ </label>
23
20
  </th>
24
21
  <th><%= t('When') %></th>
25
22
  <th><%= t('Queue') %></th>
@@ -29,8 +26,10 @@
29
26
  </thead>
30
27
  <% @scheduled.each do |entry| %>
31
28
  <tr>
32
- <td>
33
- <input type='checkbox' name='key[]' value='<%= job_params(entry.item, entry.score) %>' />
29
+ <td class="table-checkbox">
30
+ <label>
31
+ <input type='checkbox' name='key[]' value='<%= job_params(entry.item, entry.score) %>' class='shift_clickable' />
32
+ </label>
34
33
  </td>
35
34
  <td>
36
35
  <a href="<%= root_path %>scheduled/<%= job_params(entry.item, entry.score) %>"><%= relative_time(entry.at) %></a>
metadata CHANGED
@@ -1,60 +1,74 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.5.1
4
+ version: 7.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Perham
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-15 00:00:00.000000000 Z
11
+ date: 2024-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: redis
14
+ name: redis-client
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.2.0
19
+ version: 0.22.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 4.2.0
26
+ version: 0.22.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: connection_pool
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 2.2.2
33
+ version: 2.3.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 2.2.2
40
+ version: 2.3.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rack
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '2.0'
47
+ version: 2.2.4
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 2.2.4
55
+ - !ruby/object:Gem::Dependency
56
+ name: logger
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
- version: '2.0'
68
+ version: '0'
55
69
  description: Simple, efficient background processing for Ruby.
56
70
  email:
57
- - mperham@gmail.com
71
+ - info@contribsys.com
58
72
  executables:
59
73
  - sidekiq
60
74
  - sidekiqmon
@@ -62,34 +76,43 @@ extensions: []
62
76
  extra_rdoc_files: []
63
77
  files:
64
78
  - Changes.md
65
- - LICENSE
79
+ - LICENSE.txt
66
80
  - README.md
81
+ - bin/multi_queue_bench
67
82
  - bin/sidekiq
68
83
  - bin/sidekiqload
69
84
  - bin/sidekiqmon
85
+ - lib/active_job/queue_adapters/sidekiq_adapter.rb
70
86
  - lib/generators/sidekiq/job_generator.rb
71
87
  - lib/generators/sidekiq/templates/job.rb.erb
72
88
  - lib/generators/sidekiq/templates/job_spec.rb.erb
73
89
  - lib/generators/sidekiq/templates/job_test.rb.erb
74
90
  - lib/sidekiq.rb
75
- - lib/sidekiq/.DS_Store
76
91
  - lib/sidekiq/api.rb
92
+ - lib/sidekiq/capsule.rb
77
93
  - lib/sidekiq/cli.rb
78
94
  - lib/sidekiq/client.rb
79
95
  - lib/sidekiq/component.rb
80
- - lib/sidekiq/delay.rb
81
- - lib/sidekiq/extensions/action_mailer.rb
82
- - lib/sidekiq/extensions/active_record.rb
83
- - lib/sidekiq/extensions/class_methods.rb
84
- - lib/sidekiq/extensions/generic_proxy.rb
96
+ - lib/sidekiq/config.rb
97
+ - lib/sidekiq/deploy.rb
98
+ - lib/sidekiq/embedded.rb
85
99
  - lib/sidekiq/fetch.rb
100
+ - lib/sidekiq/iterable_job.rb
86
101
  - lib/sidekiq/job.rb
102
+ - lib/sidekiq/job/interrupt_handler.rb
103
+ - lib/sidekiq/job/iterable.rb
104
+ - lib/sidekiq/job/iterable/active_record_enumerator.rb
105
+ - lib/sidekiq/job/iterable/csv_enumerator.rb
106
+ - lib/sidekiq/job/iterable/enumerators.rb
87
107
  - lib/sidekiq/job_logger.rb
88
108
  - lib/sidekiq/job_retry.rb
89
109
  - lib/sidekiq/job_util.rb
90
110
  - lib/sidekiq/launcher.rb
91
111
  - lib/sidekiq/logger.rb
92
112
  - lib/sidekiq/manager.rb
113
+ - lib/sidekiq/metrics/query.rb
114
+ - lib/sidekiq/metrics/shared.rb
115
+ - lib/sidekiq/metrics/tracking.rb
93
116
  - lib/sidekiq/middleware/chain.rb
94
117
  - lib/sidekiq/middleware/current_attributes.rb
95
118
  - lib/sidekiq/middleware/i18n.rb
@@ -114,14 +137,19 @@ files:
114
137
  - lib/sidekiq/web/csrf_protection.rb
115
138
  - lib/sidekiq/web/helpers.rb
116
139
  - lib/sidekiq/web/router.rb
117
- - lib/sidekiq/worker.rb
140
+ - lib/sidekiq/worker_compatibility_alias.rb
118
141
  - sidekiq.gemspec
119
142
  - web/assets/images/apple-touch-icon.png
120
143
  - web/assets/images/favicon.ico
121
144
  - web/assets/images/logo.png
122
145
  - web/assets/images/status.png
123
146
  - web/assets/javascripts/application.js
147
+ - web/assets/javascripts/base-charts.js
148
+ - web/assets/javascripts/chart.min.js
149
+ - web/assets/javascripts/chartjs-plugin-annotation.min.js
150
+ - web/assets/javascripts/dashboard-charts.js
124
151
  - web/assets/javascripts/dashboard.js
152
+ - web/assets/javascripts/metrics.js
125
153
  - web/assets/stylesheets/application-dark.css
126
154
  - web/assets/stylesheets/application-rtl.css
127
155
  - web/assets/stylesheets/application.css
@@ -136,6 +164,7 @@ files:
136
164
  - web/locales/es.yml
137
165
  - web/locales/fa.yml
138
166
  - web/locales/fr.yml
167
+ - web/locales/gd.yml
139
168
  - web/locales/he.yml
140
169
  - web/locales/hi.yml
141
170
  - web/locales/it.yml
@@ -150,6 +179,7 @@ files:
150
179
  - web/locales/ru.yml
151
180
  - web/locales/sv.yml
152
181
  - web/locales/ta.yml
182
+ - web/locales/tr.yml
153
183
  - web/locales/uk.yml
154
184
  - web/locales/ur.yml
155
185
  - web/locales/vi.yml
@@ -157,6 +187,7 @@ files:
157
187
  - web/locales/zh-tw.yml
158
188
  - web/views/_footer.erb
159
189
  - web/views/_job_info.erb
190
+ - web/views/_metrics_period_select.erb
160
191
  - web/views/_nav.erb
161
192
  - web/views/_paging.erb
162
193
  - web/views/_poll_link.erb
@@ -165,7 +196,10 @@ files:
165
196
  - web/views/busy.erb
166
197
  - web/views/dashboard.erb
167
198
  - web/views/dead.erb
199
+ - web/views/filtering.erb
168
200
  - web/views/layout.erb
201
+ - web/views/metrics.erb
202
+ - web/views/metrics_for_job.erb
169
203
  - web/views/morgue.erb
170
204
  - web/views/queue.erb
171
205
  - web/views/queues.erb
@@ -178,10 +212,11 @@ licenses:
178
212
  - LGPL-3.0
179
213
  metadata:
180
214
  homepage_uri: https://sidekiq.org
181
- bug_tracker_uri: https://github.com/mperham/sidekiq/issues
182
- documentation_uri: https://github.com/mperham/sidekiq/wiki
183
- changelog_uri: https://github.com/mperham/sidekiq/blob/main/Changes.md
184
- source_code_uri: https://github.com/mperham/sidekiq
215
+ bug_tracker_uri: https://github.com/sidekiq/sidekiq/issues
216
+ documentation_uri: https://github.com/sidekiq/sidekiq/wiki
217
+ changelog_uri: https://github.com/sidekiq/sidekiq/blob/main/Changes.md
218
+ source_code_uri: https://github.com/sidekiq/sidekiq
219
+ rubygems_mfa_required: 'true'
185
220
  post_install_message:
186
221
  rdoc_options: []
187
222
  require_paths:
@@ -190,14 +225,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
190
225
  requirements:
191
226
  - - ">="
192
227
  - !ruby/object:Gem::Version
193
- version: 2.5.0
228
+ version: 2.7.0
194
229
  required_rubygems_version: !ruby/object:Gem::Requirement
195
230
  requirements:
196
231
  - - ">="
197
232
  - !ruby/object:Gem::Version
198
233
  version: '0'
199
234
  requirements: []
200
- rubygems_version: 3.2.32
235
+ rubygems_version: 3.5.16
201
236
  signing_key:
202
237
  specification_version: 4
203
238
  summary: Simple, efficient background processing for Ruby
Binary file