sidekiq 4.2.10 → 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.
- checksums.yaml +5 -5
- data/Changes.md +932 -7
- data/LICENSE.txt +9 -0
- data/README.md +49 -50
- data/bin/multi_queue_bench +271 -0
- data/bin/sidekiq +22 -3
- data/bin/sidekiqload +218 -116
- data/bin/sidekiqmon +11 -0
- data/lib/active_job/queue_adapters/sidekiq_adapter.rb +75 -0
- data/lib/generators/sidekiq/job_generator.rb +59 -0
- data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
- data/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
- data/lib/generators/sidekiq/templates/{worker_test.rb.erb → job_test.rb.erb} +1 -1
- data/lib/sidekiq/api.rb +710 -322
- data/lib/sidekiq/capsule.rb +132 -0
- data/lib/sidekiq/cli.rb +268 -248
- data/lib/sidekiq/client.rb +153 -101
- data/lib/sidekiq/component.rb +90 -0
- data/lib/sidekiq/config.rb +311 -0
- data/lib/sidekiq/deploy.rb +64 -0
- data/lib/sidekiq/embedded.rb +63 -0
- data/lib/sidekiq/fetch.rb +50 -42
- data/lib/sidekiq/iterable_job.rb +55 -0
- data/lib/sidekiq/job/interrupt_handler.rb +24 -0
- data/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
- data/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
- data/lib/sidekiq/job/iterable/enumerators.rb +135 -0
- data/lib/sidekiq/job/iterable.rb +294 -0
- data/lib/sidekiq/job.rb +385 -0
- data/lib/sidekiq/job_logger.rb +52 -0
- data/lib/sidekiq/job_retry.rb +305 -0
- data/lib/sidekiq/job_util.rb +109 -0
- data/lib/sidekiq/launcher.rb +208 -108
- data/lib/sidekiq/logger.rb +131 -0
- data/lib/sidekiq/manager.rb +43 -47
- data/lib/sidekiq/metrics/query.rb +158 -0
- data/lib/sidekiq/metrics/shared.rb +106 -0
- data/lib/sidekiq/metrics/tracking.rb +148 -0
- data/lib/sidekiq/middleware/chain.rb +113 -56
- data/lib/sidekiq/middleware/current_attributes.rb +128 -0
- data/lib/sidekiq/middleware/i18n.rb +9 -7
- data/lib/sidekiq/middleware/modules.rb +23 -0
- data/lib/sidekiq/monitor.rb +147 -0
- data/lib/sidekiq/paginator.rb +33 -15
- data/lib/sidekiq/processor.rb +188 -98
- data/lib/sidekiq/rails.rb +53 -92
- data/lib/sidekiq/redis_client_adapter.rb +114 -0
- data/lib/sidekiq/redis_connection.rb +86 -77
- data/lib/sidekiq/ring_buffer.rb +32 -0
- data/lib/sidekiq/scheduled.rb +140 -51
- data/lib/sidekiq/sd_notify.rb +149 -0
- data/lib/sidekiq/systemd.rb +26 -0
- data/lib/sidekiq/testing/inline.rb +6 -5
- data/lib/sidekiq/testing.rb +95 -85
- data/lib/sidekiq/transaction_aware_client.rb +59 -0
- data/lib/sidekiq/version.rb +7 -1
- data/lib/sidekiq/web/action.rb +40 -18
- data/lib/sidekiq/web/application.rb +189 -89
- data/lib/sidekiq/web/csrf_protection.rb +183 -0
- data/lib/sidekiq/web/helpers.rb +239 -101
- data/lib/sidekiq/web/router.rb +28 -21
- data/lib/sidekiq/web.rb +123 -110
- data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
- data/lib/sidekiq.rb +97 -185
- data/sidekiq.gemspec +26 -27
- data/web/assets/images/apple-touch-icon.png +0 -0
- data/web/assets/javascripts/application.js +157 -61
- data/web/assets/javascripts/base-charts.js +106 -0
- data/web/assets/javascripts/chart.min.js +13 -0
- data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
- data/web/assets/javascripts/dashboard-charts.js +194 -0
- data/web/assets/javascripts/dashboard.js +43 -280
- data/web/assets/javascripts/metrics.js +298 -0
- data/web/assets/stylesheets/application-dark.css +147 -0
- data/web/assets/stylesheets/application-rtl.css +163 -0
- data/web/assets/stylesheets/application.css +176 -196
- data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
- data/web/assets/stylesheets/bootstrap.css +2 -2
- data/web/locales/ar.yml +87 -0
- data/web/locales/cs.yml +62 -62
- data/web/locales/da.yml +60 -53
- data/web/locales/de.yml +65 -53
- data/web/locales/el.yml +43 -24
- data/web/locales/en.yml +88 -64
- data/web/locales/es.yml +70 -53
- data/web/locales/fa.yml +65 -64
- data/web/locales/fr.yml +82 -62
- data/web/locales/gd.yml +98 -0
- data/web/locales/he.yml +80 -0
- data/web/locales/hi.yml +59 -59
- data/web/locales/it.yml +85 -54
- data/web/locales/ja.yml +74 -62
- data/web/locales/ko.yml +52 -52
- data/web/locales/lt.yml +83 -0
- data/web/locales/nb.yml +61 -61
- data/web/locales/nl.yml +52 -52
- data/web/locales/pl.yml +45 -45
- data/web/locales/pt-br.yml +82 -55
- data/web/locales/pt.yml +51 -51
- data/web/locales/ru.yml +68 -63
- data/web/locales/sv.yml +53 -53
- data/web/locales/ta.yml +60 -60
- data/web/locales/tr.yml +100 -0
- data/web/locales/uk.yml +85 -61
- data/web/locales/ur.yml +80 -0
- data/web/locales/vi.yml +83 -0
- data/web/locales/zh-cn.yml +42 -16
- data/web/locales/zh-tw.yml +41 -8
- data/web/views/_footer.erb +20 -3
- data/web/views/_job_info.erb +21 -4
- data/web/views/_metrics_period_select.erb +12 -0
- data/web/views/_nav.erb +5 -19
- data/web/views/_paging.erb +3 -1
- data/web/views/_poll_link.erb +3 -6
- data/web/views/_summary.erb +7 -7
- data/web/views/busy.erb +85 -31
- data/web/views/dashboard.erb +53 -20
- data/web/views/dead.erb +3 -3
- data/web/views/filtering.erb +6 -0
- data/web/views/layout.erb +17 -6
- data/web/views/metrics.erb +90 -0
- data/web/views/metrics_for_job.erb +59 -0
- data/web/views/morgue.erb +15 -16
- data/web/views/queue.erb +35 -25
- data/web/views/queues.erb +20 -4
- data/web/views/retries.erb +19 -16
- data/web/views/retry.erb +3 -3
- data/web/views/scheduled.erb +19 -17
- metadata +103 -194
- data/.github/contributing.md +0 -32
- data/.github/issue_template.md +0 -9
- data/.gitignore +0 -12
- data/.travis.yml +0 -18
- data/3.0-Upgrade.md +0 -70
- data/4.0-Upgrade.md +0 -53
- data/COMM-LICENSE +0 -95
- data/Ent-Changes.md +0 -173
- data/Gemfile +0 -29
- data/LICENSE +0 -9
- data/Pro-2.0-Upgrade.md +0 -138
- data/Pro-3.0-Upgrade.md +0 -44
- data/Pro-Changes.md +0 -628
- data/Rakefile +0 -12
- data/bin/sidekiqctl +0 -99
- data/code_of_conduct.md +0 -50
- data/lib/generators/sidekiq/templates/worker_spec.rb.erb +0 -6
- data/lib/generators/sidekiq/worker_generator.rb +0 -49
- data/lib/sidekiq/core_ext.rb +0 -119
- data/lib/sidekiq/exception_handler.rb +0 -31
- data/lib/sidekiq/extensions/action_mailer.rb +0 -57
- data/lib/sidekiq/extensions/active_record.rb +0 -40
- data/lib/sidekiq/extensions/class_methods.rb +0 -40
- data/lib/sidekiq/extensions/generic_proxy.rb +0 -25
- data/lib/sidekiq/logging.rb +0 -106
- data/lib/sidekiq/middleware/server/active_record.rb +0 -13
- data/lib/sidekiq/middleware/server/logging.rb +0 -31
- data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -205
- data/lib/sidekiq/util.rb +0 -63
- data/lib/sidekiq/worker.rb +0 -121
data/web/views/_job_info.erb
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
<header>
|
|
1
|
+
<div class="header-container">
|
|
2
2
|
<h3><%= t('Job') %></h3>
|
|
3
|
-
</
|
|
3
|
+
</div>
|
|
4
4
|
|
|
5
5
|
<div class="table_container">
|
|
6
|
-
<table class="table table-bordered table-striped">
|
|
6
|
+
<table class="table table-bordered table-striped table-hover">
|
|
7
7
|
<tbody>
|
|
8
8
|
<tr>
|
|
9
9
|
<th><%= t('Queue') %></th>
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
<tr>
|
|
15
15
|
<th><%= t('Job') %></th>
|
|
16
16
|
<td>
|
|
17
|
-
|
|
17
|
+
<%= job.display_class %>
|
|
18
|
+
<%= display_tags(job) %>
|
|
18
19
|
</td>
|
|
19
20
|
</tr>
|
|
20
21
|
<tr>
|
|
@@ -32,6 +33,14 @@
|
|
|
32
33
|
<code><%= job.jid %></code>
|
|
33
34
|
</td>
|
|
34
35
|
</tr>
|
|
36
|
+
<% if job.bid %>
|
|
37
|
+
<tr>
|
|
38
|
+
<th>BID</th>
|
|
39
|
+
<td>
|
|
40
|
+
<a href="<%= root_path %>batches/<%= job.bid %>"><%= job.bid %></a>
|
|
41
|
+
</td>
|
|
42
|
+
</tr>
|
|
43
|
+
<% end %>
|
|
35
44
|
<tr>
|
|
36
45
|
<th><%= t('CreatedAt') %></th>
|
|
37
46
|
<td><%= relative_time(job.created_at) %></td>
|
|
@@ -83,6 +92,14 @@
|
|
|
83
92
|
<td><%= relative_time(job.at) if job['retry_count'] %></td>
|
|
84
93
|
</tr>
|
|
85
94
|
<% end %>
|
|
95
|
+
<% Sidekiq::Web.custom_job_info_rows.each do |helper| %>
|
|
96
|
+
<% helper.add_pair(job) do |name, value| %>
|
|
97
|
+
<tr>
|
|
98
|
+
<th><%= name %></th>
|
|
99
|
+
<td><%= value %></td>
|
|
100
|
+
</tr>
|
|
101
|
+
<% end %>
|
|
102
|
+
<% end %>
|
|
86
103
|
</tbody>
|
|
87
104
|
</table>
|
|
88
105
|
</div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<div>
|
|
2
|
+
<select class="form-control" data-metric-period="<%= path %>">
|
|
3
|
+
<% periods.each_key do |code| %>
|
|
4
|
+
|
|
5
|
+
<% if code == period %>
|
|
6
|
+
<option selected value="<%= code %>"><%= code %></option>
|
|
7
|
+
<% else %>
|
|
8
|
+
<option value="<%= code %>"><%= code %></option>
|
|
9
|
+
<% end %>
|
|
10
|
+
<% end %>
|
|
11
|
+
</select>
|
|
12
|
+
</div>
|
data/web/views/_nav.erb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<div class="navbar navbar-default navbar-fixed-top">
|
|
2
2
|
<div class="container-fluid">
|
|
3
3
|
<div class="navbar-header" data-navbar="static">
|
|
4
|
-
<button type="button" class="navbar-toggle collapsed" data-toggle="
|
|
4
|
+
<button type="button" class="navbar-toggle collapsed" data-toggle="navbar-menu" data-target="#navbar-menu">
|
|
5
5
|
<span class="icon-bar"></span>
|
|
6
6
|
<span class="icon-bar"></span>
|
|
7
7
|
<span class="icon-bar"></span>
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<div class="navbar-toggle collapsed navbar-livereload">
|
|
10
10
|
<%= erb :_poll_link %>
|
|
11
11
|
<% if Sidekiq::Web.app_url %>
|
|
12
|
-
<a class="btn btn-inverse" href="<%= Sidekiq::Web.app_url %>"
|
|
12
|
+
<a class="btn btn-inverse" href="<%= Sidekiq::Web.app_url %>"><%= t('BackToApp') %></a>
|
|
13
13
|
<% end %>
|
|
14
14
|
</div>
|
|
15
15
|
<a class="navbar-brand" href="<%= root_path %>">
|
|
@@ -32,28 +32,14 @@
|
|
|
32
32
|
<% end %>
|
|
33
33
|
<% end %>
|
|
34
34
|
|
|
35
|
-
<li class="dropdown" data-navbar="dropdown">
|
|
36
|
-
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
|
|
37
|
-
<%= t('Plugins') %> <span class="caret"></span>
|
|
38
|
-
</a>
|
|
39
|
-
<ul class="dropdown-menu" role="menu">
|
|
40
|
-
<% Sidekiq::Web.custom_tabs.each do |title, url| %>
|
|
41
|
-
<li>
|
|
42
|
-
<a href="<%= root_path %><%= url %>"><%= t(title) %></a>
|
|
43
|
-
</li>
|
|
44
|
-
<% end %>
|
|
45
|
-
</ul>
|
|
46
|
-
</li>
|
|
47
|
-
|
|
48
35
|
<% Sidekiq::Web.custom_tabs.each do |title, url| %>
|
|
49
36
|
<li class="<%= current_path.start_with?(url) ? 'active' : '' %>" data-navbar="custom-tab">
|
|
50
37
|
<a href="<%= root_path %><%= url %>"><%= t(title) %></a>
|
|
51
38
|
</li>
|
|
52
39
|
<% end %>
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
<div class="poll-wrapper pull-right">
|
|
40
|
+
|
|
41
|
+
<li class="navbar-livereload">
|
|
42
|
+
<div class="poll-wrapper">
|
|
57
43
|
<%= erb :_poll_link %>
|
|
58
44
|
<% if Sidekiq::Web.app_url %>
|
|
59
45
|
<a class="btn btn-inverse" href="<%= Sidekiq::Web.app_url %>"><%= t('BackToApp') %></a>
|
data/web/views/_paging.erb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
<div>
|
|
1
2
|
<% if @total_size > @count %>
|
|
2
|
-
<ul class="pagination pull-right">
|
|
3
|
+
<ul class="pagination pull-right flip">
|
|
3
4
|
<li class="<%= 'disabled' if @current_page == 1 %>">
|
|
4
5
|
<a href="<%= url %>?page=1">«</a>
|
|
5
6
|
</li>
|
|
@@ -21,3 +22,4 @@
|
|
|
21
22
|
</li>
|
|
22
23
|
</ul>
|
|
23
24
|
<% end %>
|
|
25
|
+
</div>
|
data/web/views/_poll_link.erb
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
<% if
|
|
2
|
-
|
|
3
|
-
<a
|
|
4
|
-
<% else %>
|
|
5
|
-
<a id="live-poll" class="btn btn-primary" href="<%= root_path + current_path %>?<%= qparams(poll: true) %>"><%= t('LivePoll') %></a>
|
|
6
|
-
<% end %>
|
|
1
|
+
<% if pollable? %>
|
|
2
|
+
<a class="live-poll-start live-poll btn btn-primary"><%= t('LivePoll') %></a>
|
|
3
|
+
<a class="live-poll-stop live-poll btn btn-primary active"><%= t('StopPolling') %></a>
|
|
7
4
|
<% end %>
|
data/web/views/_summary.erb
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
<ul class="list-unstyled summary row">
|
|
2
2
|
<li class="processed col-sm-1">
|
|
3
|
-
<span class="count"><%=
|
|
3
|
+
<span id="txtProcessed" class="count" data-nwp><%= stats.processed %></span>
|
|
4
4
|
<span class="desc"><%= t('Processed') %></span>
|
|
5
5
|
</li>
|
|
6
6
|
<li class="failed col-sm-1">
|
|
7
|
-
<span class="count"><%=
|
|
7
|
+
<span id="txtFailed" class="count" data-nwp><%= stats.failed %></span>
|
|
8
8
|
<span class="desc"><%= t('Failed') %></span>
|
|
9
9
|
</li>
|
|
10
10
|
<li class="busy col-sm-1">
|
|
11
11
|
<a href="<%= root_path %>busy">
|
|
12
|
-
<span class="count"><%=
|
|
12
|
+
<span id="txtBusy" class="count" data-nwp><%= workset.size %></span>
|
|
13
13
|
<span class="desc"><%= t('Busy') %></span>
|
|
14
14
|
</a>
|
|
15
15
|
</li>
|
|
16
16
|
<li class="enqueued col-sm-1">
|
|
17
17
|
<a href="<%= root_path %>queues">
|
|
18
|
-
<span class="count"><%=
|
|
18
|
+
<span id="txtEnqueued" class="count" data-nwp><%= stats.enqueued %></span>
|
|
19
19
|
<span class="desc"><%= t('Enqueued') %></span>
|
|
20
20
|
</a>
|
|
21
21
|
</li>
|
|
22
22
|
<li class="retries col-sm-1">
|
|
23
23
|
<a href="<%= root_path %>retries">
|
|
24
|
-
<span class="count"><%=
|
|
24
|
+
<span id="txtRetries" class="count" data-nwp><%= stats.retry_size %></span>
|
|
25
25
|
<span class="desc"><%= t('Retries') %></span>
|
|
26
26
|
</a>
|
|
27
27
|
</li>
|
|
28
28
|
<li class="scheduled col-sm-1">
|
|
29
29
|
<a href="<%= root_path %>scheduled">
|
|
30
|
-
<span class="count"><%=
|
|
30
|
+
<span id="txtScheduled" class="count" data-nwp><%= stats.scheduled_size %></span>
|
|
31
31
|
<span class="desc"><%= t('Scheduled') %></span>
|
|
32
32
|
</a>
|
|
33
33
|
</li>
|
|
34
34
|
<li class="dead col-sm-1">
|
|
35
35
|
<a href="<%= root_path %>morgue">
|
|
36
|
-
<span class="count"><%=
|
|
36
|
+
<span id="txtDead" class="count" data-nwp><%= stats.dead_size %></span>
|
|
37
37
|
<span class="desc"><%= t('Dead') %></span>
|
|
38
38
|
</a>
|
|
39
39
|
</li>
|
data/web/views/busy.erb
CHANGED
|
@@ -1,28 +1,57 @@
|
|
|
1
|
-
<div class="
|
|
2
|
-
<
|
|
3
|
-
|
|
1
|
+
<div class="header-container">
|
|
2
|
+
<h1><%= t('Status') %></h1>
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<div class="stats-wrapper">
|
|
6
|
+
<div class="stats-container">
|
|
7
|
+
<div class="stat">
|
|
8
|
+
<h3><%= s = processes.size; number_with_delimiter(s) %></h3>
|
|
9
|
+
<p><%= t('Processes') %></p>
|
|
10
|
+
</div>
|
|
11
|
+
<div class="stat">
|
|
12
|
+
<h3><%= x = processes.total_concurrency; number_with_delimiter(x) %></h3>
|
|
13
|
+
<p><%= t('Threads') %></p>
|
|
14
|
+
</div>
|
|
15
|
+
<div class="stat">
|
|
16
|
+
<h3><%= ws = workset.size; number_with_delimiter(ws) %></h3>
|
|
17
|
+
<p><%= t('Busy') %></p>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="stat">
|
|
20
|
+
<h3><%= x == 0 ? 0 : ((ws / x.to_f) * 100).round(0) %>%</h3>
|
|
21
|
+
<p><%= t('Utilization') %></p>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="stat">
|
|
24
|
+
<h3><%= format_memory(processes.total_rss) %></h3>
|
|
25
|
+
<p><%= t('RSS') %></p>
|
|
26
|
+
</div>
|
|
4
27
|
</div>
|
|
5
|
-
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
<div class="header-container">
|
|
31
|
+
<h1><%= t('Processes') %></h1>
|
|
32
|
+
<div>
|
|
6
33
|
<form method="POST" class="warning-messages">
|
|
7
34
|
<%= csrf_tag %>
|
|
8
|
-
<div class="btn-group pull-right">
|
|
9
|
-
<
|
|
10
|
-
<
|
|
35
|
+
<div class="btn-group pull-right flip">
|
|
36
|
+
<input class="btn btn-warn" type="submit" name="quiet" value="<%= t('QuietAll') %>" data-confirm="<%= t('AreYouSure') %>"/>
|
|
37
|
+
<input class="btn btn-danger" type="submit" name="stop" value="<%= t('StopAll') %>" data-confirm="<%= t('AreYouSure') %>"/>
|
|
11
38
|
</div>
|
|
12
39
|
</form>
|
|
13
40
|
</div>
|
|
14
41
|
</div>
|
|
15
42
|
|
|
16
43
|
<div class="table_container">
|
|
17
|
-
<table class="processes table table-hover table-bordered table-striped
|
|
44
|
+
<table class="processes table table-hover table-bordered table-striped">
|
|
18
45
|
<thead>
|
|
19
46
|
<th><%= t('Name') %></th>
|
|
20
47
|
<th><%= t('Started') %></th>
|
|
21
|
-
<th><%= t('
|
|
22
|
-
<th><%= t('
|
|
48
|
+
<th class="col-sm-1"><%= t('RSS') %><a target="blank" href="https://github.com/sidekiq/sidekiq/wiki/Memory#rss"><span class="info-circle" title="Click to learn more about RSS">?</span></a></th>
|
|
49
|
+
<th class="col-sm-1"><%= t('Threads') %></th>
|
|
50
|
+
<th class="col-sm-1"><%= t('Busy') %></th>
|
|
23
51
|
<th> </th>
|
|
24
52
|
</thead>
|
|
25
|
-
<% processes.
|
|
53
|
+
<% lead = processes.leader %>
|
|
54
|
+
<% sorted_processes.each do |process| %>
|
|
26
55
|
<tr>
|
|
27
56
|
<td class="box">
|
|
28
57
|
<%= "#{process['hostname']}:#{process['pid']}" %>
|
|
@@ -30,41 +59,63 @@
|
|
|
30
59
|
<% process.labels.each do |label| %>
|
|
31
60
|
<span class="label label-info"><%= label %></span>
|
|
32
61
|
<% end %>
|
|
62
|
+
<% if process.embedded? %>
|
|
63
|
+
<span class="label label-default">embedded</span>
|
|
64
|
+
<% end %>
|
|
33
65
|
<% if process.stopping? %>
|
|
34
|
-
<span class="label label-danger">
|
|
66
|
+
<span class="label label-danger">quiet</span>
|
|
67
|
+
<% end %>
|
|
68
|
+
<% if process.identity == lead %>
|
|
69
|
+
<span class="label label-warning">leader</span>
|
|
35
70
|
<% end %>
|
|
36
71
|
<br>
|
|
37
72
|
<b><%= "#{t('Queues')}: " %></b>
|
|
38
|
-
|
|
73
|
+
<% if process.weights %>
|
|
74
|
+
<%= busy_weights(process.weights) %>
|
|
75
|
+
<% else %>
|
|
76
|
+
<%= process.queues.sort.join(", ") %>
|
|
77
|
+
<% end %>
|
|
78
|
+
<% if process.version != Sidekiq::VERSION %>
|
|
79
|
+
<br>
|
|
80
|
+
<b><%= "#{t('Version')}: " %></b>
|
|
81
|
+
<% if process.version %>
|
|
82
|
+
<%= process.version %>
|
|
83
|
+
<% else %>
|
|
84
|
+
<%= t('Unknown') %>
|
|
85
|
+
<% end %>
|
|
86
|
+
<% end %>
|
|
39
87
|
</td>
|
|
40
88
|
<td><%= relative_time(Time.at(process['started_at'])) %></td>
|
|
41
|
-
<td><%= process['
|
|
42
|
-
<td><%= process['
|
|
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>
|
|
43
92
|
<td>
|
|
44
|
-
|
|
93
|
+
<% unless process.embedded? %>
|
|
45
94
|
<form method="POST">
|
|
46
95
|
<%= csrf_tag %>
|
|
47
96
|
<input type="hidden" name="identity" value="<%= process['identity'] %>"/>
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
97
|
+
|
|
98
|
+
<div class="btn-group pull-right flip">
|
|
99
|
+
<% unless process.stopping? %><button class="btn btn-xs btn-warn" type="submit" name="quiet" value="1"><%= t('Quiet') %></button><% end %>
|
|
100
|
+
<button class="btn btn-xs btn-danger" type="submit" name="stop" value="1"><%= t('Stop') %></button>
|
|
101
|
+
</div>
|
|
52
102
|
</form>
|
|
53
|
-
|
|
103
|
+
<% end %>
|
|
54
104
|
</td>
|
|
55
105
|
</tr>
|
|
56
106
|
<% end %>
|
|
57
107
|
</table>
|
|
58
108
|
</div>
|
|
59
109
|
|
|
60
|
-
<div class="
|
|
61
|
-
<
|
|
62
|
-
|
|
63
|
-
|
|
110
|
+
<div class="header-container">
|
|
111
|
+
<h1><%= t('Jobs') %></h1>
|
|
112
|
+
<% if @workset.size > 0 && @total_size > @count %>
|
|
113
|
+
<%= erb :_paging, locals: { url: "#{root_path}busy" } %>
|
|
114
|
+
<% end %>
|
|
64
115
|
</div>
|
|
65
116
|
|
|
66
117
|
<div class="table_container">
|
|
67
|
-
<table class="workers table table-hover table-bordered table-striped
|
|
118
|
+
<table class="workers table table-hover table-bordered table-striped">
|
|
68
119
|
<thead>
|
|
69
120
|
<th><%= t('Process') %></th>
|
|
70
121
|
<th><%= t('TID') %></th>
|
|
@@ -74,20 +125,23 @@
|
|
|
74
125
|
<th><%= t('Arguments') %></th>
|
|
75
126
|
<th><%= t('Started') %></th>
|
|
76
127
|
</thead>
|
|
77
|
-
<%
|
|
78
|
-
<% job =
|
|
128
|
+
<% @workset.each do |process, thread, work| %>
|
|
129
|
+
<% job = work.job %>
|
|
79
130
|
<tr>
|
|
80
131
|
<td><%= process %></td>
|
|
81
132
|
<td><%= thread %></td>
|
|
82
133
|
<td><%= job.jid %></td>
|
|
83
134
|
<td>
|
|
84
|
-
<a href="<%= root_path %>queues/<%=
|
|
135
|
+
<a href="<%= root_path %>queues/<%= work.queue %>"><%= work.queue %></a>
|
|
136
|
+
</td>
|
|
137
|
+
<td>
|
|
138
|
+
<%= job.display_class %>
|
|
139
|
+
<%= display_tags(job, nil) %>
|
|
85
140
|
</td>
|
|
86
|
-
<td><%= job.display_class %></td>
|
|
87
141
|
<td>
|
|
88
142
|
<div class="args"><%= display_args(job.display_args) %></div>
|
|
89
143
|
</td>
|
|
90
|
-
<td><%= relative_time(
|
|
144
|
+
<td><%= relative_time(work.run_at) %></td>
|
|
91
145
|
</tr>
|
|
92
146
|
<% end %>
|
|
93
147
|
</table>
|
data/web/views/dashboard.erb
CHANGED
|
@@ -1,75 +1,108 @@
|
|
|
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') %>
|
|
5
|
-
<span class="beacon">
|
|
5
|
+
<span id="beacon" class="beacon">
|
|
6
6
|
<span class="ring"></span>
|
|
7
7
|
<span class="dot"></span>
|
|
8
8
|
</span>
|
|
9
9
|
</h3>
|
|
10
|
-
<div class="interval-slider">
|
|
10
|
+
<div class="interval-slider ltr">
|
|
11
11
|
<span class="interval-slider-label"><%= t('PollingInterval') %>:</span>
|
|
12
|
-
<span class="current-interval">5
|
|
12
|
+
<span id="sldr-text" class="current-interval">5 s</span>
|
|
13
13
|
<br/>
|
|
14
|
-
<input 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"/>
|
|
15
15
|
</div>
|
|
16
16
|
</div>
|
|
17
17
|
|
|
18
18
|
<div class="row chart">
|
|
19
|
-
<
|
|
20
|
-
<
|
|
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>
|
|
32
|
+
|
|
33
|
+
<!-- start with a space in the legend so the height doesn't change when we add content dynamically -->
|
|
34
|
+
<div id="realtime-legend"> </div>
|
|
21
35
|
</div>
|
|
22
36
|
|
|
23
|
-
<div class="row
|
|
24
|
-
|
|
25
|
-
|
|
37
|
+
<div class="row header">
|
|
38
|
+
<div class="col-sm-4 pull-left flip">
|
|
39
|
+
<h3><%= t('History') %></h3>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="row chart">
|
|
43
|
+
<div>
|
|
26
44
|
<a href="<%= root_path %>?days=7" class="history-graph <%= "active" if params[:days] == "7" %>"><%= t('OneWeek') %></a>
|
|
27
45
|
<a href="<%= root_path %>" class="history-graph <%= "active" if params[:days].nil? || params[:days] == "30" %>"><%= t('OneMonth') %></a>
|
|
28
46
|
<a href="<%= root_path %>?days=90" class="history-graph <%= "active" if params[:days] == "90" %>"><%= t('ThreeMonths') %></a>
|
|
29
47
|
<a href="<%= root_path %>?days=180" class="history-graph <%= "active" if params[:days] == "180" %>"><%= t('SixMonths') %></a>
|
|
30
|
-
</
|
|
48
|
+
</div>
|
|
31
49
|
|
|
32
|
-
<
|
|
33
|
-
|
|
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>
|
|
34
58
|
</div>
|
|
35
59
|
|
|
36
60
|
<br/>
|
|
37
|
-
<
|
|
38
|
-
<div class="
|
|
61
|
+
<div class="row header">
|
|
62
|
+
<div class="col-sm-4 pull-left flip">
|
|
63
|
+
<h3>Redis</h3>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="stats-wrapper">
|
|
39
67
|
<div class="stats-container">
|
|
40
68
|
<% if @redis_info.fetch("redis_version", nil) %>
|
|
41
69
|
<div class="stat">
|
|
42
|
-
<h3
|
|
70
|
+
<h3 id="redis_version"><%= @redis_info.fetch("redis_version") %></h3>
|
|
43
71
|
<p><%= t('Version') %></p>
|
|
44
72
|
</div>
|
|
45
73
|
<% end %>
|
|
46
74
|
|
|
47
75
|
<% if @redis_info.fetch("uptime_in_days", nil) %>
|
|
48
76
|
<div class="stat">
|
|
49
|
-
<h3
|
|
77
|
+
<h3 id="uptime_in_days"><%= @redis_info.fetch("uptime_in_days") %></h3>
|
|
50
78
|
<p><%= t('Uptime') %></p>
|
|
51
79
|
</div>
|
|
52
80
|
<% end %>
|
|
53
81
|
|
|
54
82
|
<% if @redis_info.fetch("connected_clients", nil) %>
|
|
55
83
|
<div class="stat">
|
|
56
|
-
<h3
|
|
84
|
+
<h3 id="connected_clients"><%= @redis_info.fetch("connected_clients") %></h3>
|
|
57
85
|
<p><%= t('Connections') %></p>
|
|
58
86
|
</div>
|
|
59
87
|
<% end %>
|
|
60
88
|
|
|
61
89
|
<% if @redis_info.fetch("used_memory_human", nil) %>
|
|
62
90
|
<div class="stat">
|
|
63
|
-
<h3
|
|
91
|
+
<h3 id="used_memory_human"><%= @redis_info.fetch("used_memory_human") %></h3>
|
|
64
92
|
<p><%= t('MemoryUsage') %></p>
|
|
65
93
|
</div>
|
|
66
94
|
<% end %>
|
|
67
95
|
|
|
68
96
|
<% if @redis_info.fetch("used_memory_peak_human", nil) %>
|
|
69
97
|
<div class="stat">
|
|
70
|
-
<h3
|
|
98
|
+
<h3 id="used_memory_peak_human"><%= @redis_info.fetch("used_memory_peak_human") %></h3>
|
|
71
99
|
<p><%= t('PeakMemoryUsage') %></p>
|
|
72
100
|
</div>
|
|
73
101
|
<% end %>
|
|
74
102
|
</div>
|
|
75
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>
|
data/web/views/dead.erb
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
<h3><%= t('Error') %></h3>
|
|
4
4
|
<div class="table_container">
|
|
5
|
-
<table class="error table table-bordered table-striped">
|
|
5
|
+
<table class="error table table-bordered table-striped table-hover">
|
|
6
6
|
<tbody>
|
|
7
7
|
<tr>
|
|
8
8
|
<th><%= t('ErrorClass') %></th>
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
<th><%= t('ErrorMessage') %></th>
|
|
15
15
|
<td><%= h(@dead['error_message']) %></td>
|
|
16
16
|
</tr>
|
|
17
|
-
<% if
|
|
17
|
+
<% if @dead.error_backtrace %>
|
|
18
18
|
<tr>
|
|
19
19
|
<th><%= t('ErrorBacktrace') %></th>
|
|
20
20
|
<td>
|
|
21
|
-
<code><%= @dead
|
|
21
|
+
<code><%= @dead.error_backtrace.join("<br/>") %></code>
|
|
22
22
|
</td>
|
|
23
23
|
</tr>
|
|
24
24
|
<% end %>
|
|
@@ -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
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
|
-
<html>
|
|
2
|
+
<html dir="<%= text_direction %>">
|
|
3
3
|
<head>
|
|
4
4
|
<title><%= environment_title_prefix %><%= Sidekiq::NAME %></title>
|
|
5
|
-
<meta charset="
|
|
5
|
+
<meta charset="utf-8" />
|
|
6
6
|
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
|
7
|
-
|
|
8
|
-
<link href="<%= root_path %>stylesheets/
|
|
7
|
+
|
|
8
|
+
<link href="<%= root_path %>stylesheets/bootstrap.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
|
|
9
|
+
<% if rtl? %>
|
|
10
|
+
<link href="<%= root_path %>stylesheets/bootstrap-rtl.min.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>"/>
|
|
11
|
+
<% end %>
|
|
12
|
+
|
|
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
|
+
<% if rtl? %>
|
|
16
|
+
<link href="<%= root_path %>stylesheets/application-rtl.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
|
|
17
|
+
<% end %>
|
|
18
|
+
|
|
19
|
+
<link rel="apple-touch-icon" href="<%= root_path %>images/apple-touch-icon.png">
|
|
9
20
|
<link rel="shortcut icon" type="image/ico" href="<%= root_path %>images/favicon.ico" />
|
|
10
|
-
<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>
|
|
11
22
|
<meta name="google" content="notranslate" />
|
|
12
23
|
<%= display_custom_head %>
|
|
13
24
|
</head>
|
|
14
|
-
<body class="admin" data-
|
|
25
|
+
<body class="admin" data-locale="<%= locale %>">
|
|
15
26
|
<%= erb :_nav %>
|
|
16
27
|
<div id="page">
|
|
17
28
|
<div class="container">
|