sidekiq 7.3.9 → 8.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +21 -4
  3. data/README.md +16 -13
  4. data/bin/sidekiqload +10 -10
  5. data/bin/webload +69 -0
  6. data/lib/active_job/queue_adapters/sidekiq_adapter.rb +5 -5
  7. data/lib/sidekiq/api.rb +108 -36
  8. data/lib/sidekiq/capsule.rb +1 -1
  9. data/lib/sidekiq/cli.rb +15 -19
  10. data/lib/sidekiq/client.rb +13 -16
  11. data/lib/sidekiq/component.rb +30 -2
  12. data/lib/sidekiq/config.rb +18 -15
  13. data/lib/sidekiq/embedded.rb +1 -0
  14. data/lib/sidekiq/job/iterable.rb +2 -4
  15. data/lib/sidekiq/job_retry.rb +2 -2
  16. data/lib/sidekiq/job_util.rb +5 -1
  17. data/lib/sidekiq/launcher.rb +1 -1
  18. data/lib/sidekiq/logger.rb +6 -10
  19. data/lib/sidekiq/manager.rb +0 -1
  20. data/lib/sidekiq/metrics/query.rb +1 -3
  21. data/lib/sidekiq/middleware/current_attributes.rb +5 -17
  22. data/lib/sidekiq/paginator.rb +8 -1
  23. data/lib/sidekiq/processor.rb +21 -14
  24. data/lib/sidekiq/profiler.rb +59 -0
  25. data/lib/sidekiq/redis_client_adapter.rb +0 -1
  26. data/lib/sidekiq/testing.rb +2 -2
  27. data/lib/sidekiq/version.rb +2 -2
  28. data/lib/sidekiq/web/action.rb +101 -85
  29. data/lib/sidekiq/web/application.rb +339 -333
  30. data/lib/sidekiq/web/config.rb +116 -0
  31. data/lib/sidekiq/web/helpers.rb +40 -15
  32. data/lib/sidekiq/web/router.rb +60 -76
  33. data/lib/sidekiq/web.rb +51 -156
  34. data/sidekiq.gemspec +5 -4
  35. data/web/assets/javascripts/application.js +6 -13
  36. data/web/assets/javascripts/base-charts.js +30 -18
  37. data/web/assets/javascripts/metrics.js +1 -1
  38. data/web/assets/stylesheets/style.css +750 -0
  39. data/web/locales/ar.yml +1 -0
  40. data/web/locales/cs.yml +1 -0
  41. data/web/locales/da.yml +1 -0
  42. data/web/locales/de.yml +1 -0
  43. data/web/locales/el.yml +1 -0
  44. data/web/locales/en.yml +6 -0
  45. data/web/locales/es.yml +24 -2
  46. data/web/locales/fa.yml +1 -0
  47. data/web/locales/fr.yml +1 -0
  48. data/web/locales/gd.yml +1 -0
  49. data/web/locales/he.yml +1 -0
  50. data/web/locales/hi.yml +1 -0
  51. data/web/locales/it.yml +1 -0
  52. data/web/locales/ja.yml +1 -0
  53. data/web/locales/ko.yml +1 -0
  54. data/web/locales/lt.yml +1 -0
  55. data/web/locales/nb.yml +1 -0
  56. data/web/locales/nl.yml +1 -0
  57. data/web/locales/pl.yml +1 -0
  58. data/web/locales/{pt-br.yml → pt-BR.yml} +2 -1
  59. data/web/locales/pt.yml +1 -0
  60. data/web/locales/ru.yml +1 -0
  61. data/web/locales/sv.yml +1 -0
  62. data/web/locales/ta.yml +1 -0
  63. data/web/locales/tr.yml +1 -0
  64. data/web/locales/uk.yml +1 -0
  65. data/web/locales/ur.yml +1 -0
  66. data/web/locales/vi.yml +1 -0
  67. data/web/locales/{zh-cn.yml → zh-CN.yml} +85 -73
  68. data/web/locales/{zh-tw.yml → zh-TW.yml} +2 -1
  69. data/web/views/_footer.erb +31 -33
  70. data/web/views/_job_info.erb +91 -89
  71. data/web/views/_metrics_period_select.erb +1 -1
  72. data/web/views/_nav.erb +14 -21
  73. data/web/views/_paging.erb +23 -21
  74. data/web/views/_poll_link.erb +2 -2
  75. data/web/views/_summary.erb +16 -16
  76. data/web/views/busy.erb +124 -122
  77. data/web/views/dashboard.erb +61 -66
  78. data/web/views/dead.erb +31 -27
  79. data/web/views/filtering.erb +3 -3
  80. data/web/views/layout.erb +5 -21
  81. data/web/views/metrics.erb +83 -80
  82. data/web/views/metrics_for_job.erb +39 -42
  83. data/web/views/morgue.erb +61 -70
  84. data/web/views/profiles.erb +43 -0
  85. data/web/views/queue.erb +54 -52
  86. data/web/views/queues.erb +43 -41
  87. data/web/views/retries.erb +66 -75
  88. data/web/views/retry.erb +32 -27
  89. data/web/views/scheduled.erb +58 -54
  90. data/web/views/scheduled_job_info.erb +1 -1
  91. metadata +31 -18
  92. data/web/assets/stylesheets/application-dark.css +0 -147
  93. data/web/assets/stylesheets/application-rtl.css +0 -163
  94. data/web/assets/stylesheets/application.css +0 -759
  95. data/web/assets/stylesheets/bootstrap-rtl.min.css +0 -9
  96. data/web/assets/stylesheets/bootstrap.css +0 -5
  97. data/web/views/_status.erb +0 -4
@@ -1,105 +1,107 @@
1
- <div class="header-container">
2
- <h3><%= t('Job') %></h3>
3
- </div>
1
+ <section>
2
+ <header>
3
+ <h1><%= t('Job') %></h1>
4
+ </header>
4
5
 
5
- <div class="table_container">
6
- <table class="table table-bordered table-striped table-hover">
7
- <tbody>
8
- <tr>
9
- <th><%= t('Queue') %></th>
10
- <td>
11
- <a href="<%= root_path %>queues/<%= job.queue %>"><%= job.queue %></a>
12
- </td>
13
- </tr>
14
- <tr>
15
- <th><%= t('Job') %></th>
16
- <td>
17
- <%= job.display_class %>
18
- <%= display_tags(job) %>
19
- </td>
20
- </tr>
21
- <tr>
22
- <th><%= t('Arguments') %></th>
23
- <td>
24
- <code class="code-wrap">
25
- <!-- We don't want to truncate any job arguments when viewing a single job's status page -->
26
- <div class="args-extended"><%= display_args(job.display_args, nil) %></div>
27
- </code>
28
- </td>
29
- </tr>
30
- <tr>
31
- <th>JID</th>
32
- <td>
33
- <code><%= job.jid %></code>
34
- </td>
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 %>
44
- <tr>
45
- <th><%= t('CreatedAt') %></th>
46
- <td><%= relative_time(job.created_at) %></td>
47
- </tr>
48
- <tr>
49
- <th><%= t('Enqueued') %></th>
50
- <td><%= (enqueued_at = job.enqueued_at) ? relative_time(enqueued_at) : t('NotYetEnqueued') %></td>
51
- </tr>
52
- <% unless retry_extra_items(job).empty? %>
6
+ <div class="table_container">
7
+ <table>
8
+ <tbody>
53
9
  <tr>
54
- <th><%= t('Extras') %></th>
10
+ <th><%= t('Queue') %></th>
55
11
  <td>
56
- <code>
57
- <%= retry_extra_items(job).inspect %>
12
+ <a href="<%= root_path %>queues/<%= job.queue %>"><%= job.queue %></a>
13
+ </td>
14
+ </tr>
15
+ <tr>
16
+ <th><%= t('Job') %></th>
17
+ <td>
18
+ <%= job.display_class %>
19
+ <%= display_tags(job) %>
20
+ </td>
21
+ </tr>
22
+ <tr>
23
+ <th><%= t('Arguments') %></th>
24
+ <td>
25
+ <code class="code-wrap">
26
+ <!-- We don't want to truncate any job arguments when viewing a single job's status page -->
27
+ <div class="args-extended"><%= display_args(job.display_args, nil) %></div>
58
28
  </code>
59
29
  </td>
60
30
  </tr>
61
- <% end %>
62
- <% if type == :retry %>
63
- <% if job['retry_count'] && job['retry_count'] > 0 %>
31
+ <tr>
32
+ <th>JID</th>
33
+ <td>
34
+ <code><%= job.jid %></code>
35
+ </td>
36
+ </tr>
37
+ <% if job.bid %>
38
+ <tr>
39
+ <th>BID</th>
40
+ <td>
41
+ <a href="<%= root_path %>batches/<%= job.bid %>"><%= job.bid %></a>
42
+ </td>
43
+ </tr>
44
+ <% end %>
45
+ <tr>
46
+ <th><%= t('CreatedAt') %></th>
47
+ <td><%= relative_time(job.created_at) %></td>
48
+ </tr>
49
+ <tr>
50
+ <th><%= t('Enqueued') %></th>
51
+ <td><%= (enqueued_at = job.enqueued_at) ? relative_time(enqueued_at) : t('NotYetEnqueued') %></td>
52
+ </tr>
53
+ <% unless retry_extra_items(job).empty? %>
64
54
  <tr>
65
- <th><%= t('RetryCount') %></th>
66
- <td><%= job['retry_count'] %></td>
55
+ <th><%= t('Extras') %></th>
56
+ <td>
57
+ <code>
58
+ <%= retry_extra_items(job).inspect %>
59
+ </code>
60
+ </td>
67
61
  </tr>
62
+ <% end %>
63
+ <% if type == :retry %>
64
+ <% if job['retry_count'] && job['retry_count'] > 0 %>
65
+ <tr>
66
+ <th><%= t('RetryCount') %></th>
67
+ <td><%= job['retry_count'] %></td>
68
+ </tr>
69
+ <tr>
70
+ <th><%= t('LastRetry') %></th>
71
+ <td><%= relative_time(Time.at(job['retried_at'])) %></td>
72
+ </tr>
73
+ <% else %>
74
+ <tr>
75
+ <th><%= t('OriginallyFailed') %></th>
76
+ <td><%= relative_time(Time.at(job['failed_at'])) %></td>
77
+ </tr>
78
+ <% end %>
68
79
  <tr>
69
- <th><%= t('LastRetry') %></th>
70
- <td><%= relative_time(Time.at(job['retried_at'])) %></td>
80
+ <th><%= t('NextRetry') %></th>
81
+ <td><%= relative_time(job.at) %></td>
71
82
  </tr>
72
- <% else %>
83
+ <% end %>
84
+ <% if type == :scheduled %>
73
85
  <tr>
74
- <th><%= t('OriginallyFailed') %></th>
75
- <td><%= relative_time(Time.at(job['failed_at'])) %></td>
86
+ <th><%= t('Scheduled') %></th>
87
+ <td><%= relative_time(job.at) %></td>
76
88
  </tr>
77
89
  <% end %>
78
- <tr>
79
- <th><%= t('NextRetry') %></th>
80
- <td><%= relative_time(job.at) %></td>
81
- </tr>
82
- <% end %>
83
- <% if type == :scheduled %>
84
- <tr>
85
- <th><%= t('Scheduled') %></th>
86
- <td><%= relative_time(job.at) %></td>
87
- </tr>
88
- <% end %>
89
- <% if type == :dead %>
90
- <tr>
91
- <th><%= t('LastRetry') %></th>
92
- <td><%= relative_time(job.at) if job['retry_count'] %></td>
93
- </tr>
94
- <% end %>
95
- <% Sidekiq::Web.custom_job_info_rows.each do |helper| %>
96
- <% helper.add_pair(job) do |name, value| %>
90
+ <% if type == :dead %>
97
91
  <tr>
98
- <th><%= name %></th>
99
- <td><%= value %></td>
92
+ <th><%= t('LastRetry') %></th>
93
+ <td><%= relative_time(job.at) if job['retry_count'] %></td>
100
94
  </tr>
101
95
  <% end %>
102
- <% end %>
103
- </tbody>
104
- </table>
105
- </div>
96
+ <% config.custom_job_info_rows&.each do |helper| %>
97
+ <% helper.add_pair(job) do |name, value| %>
98
+ <tr>
99
+ <th><%= name %></th>
100
+ <td><%= value %></td>
101
+ </tr>
102
+ <% end %>
103
+ <% end %>
104
+ </tbody>
105
+ </table>
106
+ </div>
107
+ </section>
@@ -1,4 +1,4 @@
1
- <div>
1
+ <div class="filter">
2
2
  <select class="form-control" data-metric-period="<%= path %>">
3
3
  <% periods.each_key do |code| %>
4
4
 
data/web/views/_nav.erb CHANGED
@@ -1,52 +1,45 @@
1
- <div class="navbar navbar-default navbar-fixed-top">
2
- <div class="container-fluid">
1
+ <header>
2
+ <div class="container">
3
3
  <div class="navbar-header" data-navbar="static">
4
- <button type="button" class="navbar-toggle collapsed" data-toggle="navbar-menu" data-target="#navbar-menu">
4
+ <button type="button" class="btn navbar-toggle" 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>
8
8
  </button>
9
- <div class="navbar-toggle collapsed navbar-livereload">
9
+ <div class="navbar-livereload">
10
10
  <%= erb :_poll_link %>
11
- <% if Sidekiq::Web.app_url %>
12
- <a class="btn btn-inverse" href="<%= Sidekiq::Web.app_url %>"><%= t('BackToApp') %></a>
11
+ <% if config.app_url %>
12
+ <a class="btn btn-inverse" href="<%= config.app_url %>"><%= t('BackToApp') %></a>
13
13
  <% end %>
14
14
  </div>
15
15
  <a class="navbar-brand" href="<%= root_path %>">
16
16
  <%= Sidekiq::NAME %>
17
- <%= erb :_status %>
18
17
  </a>
19
18
  </div>
20
19
 
21
- <div class="collapse navbar-collapse" id="navbar-menu">
22
- <ul class="nav navbar-nav" data-navbar="static">
23
- <% Sidekiq::Web.default_tabs.each do |title, url| %>
20
+ <div class="navbar-collapse" id="navbar-menu">
21
+ <ul class="nav" data-navbar="static">
22
+ <% config.tabs.each do |title, url| %>
24
23
  <% if url == '' %>
25
24
  <li class="<%= current_path == url ? 'active' : '' %>">
26
- <a href="<%= root_path %><%= url %>"><%= t(title) %></a>
25
+ <a href="<%= root_path %><%= url %>"><%= t(title) %></a>
27
26
  </li>
28
27
  <% else %>
29
28
  <li class="<%= current_path.start_with?(url) ? 'active' : '' %>">
30
- <a href="<%= root_path %><%= url %>"><%= t(title) %></a>
29
+ <a href="<%= root_path %><%= url %>"><%= t(title) %></a>
31
30
  </li>
32
31
  <% end %>
33
32
  <% end %>
34
33
 
35
- <% Sidekiq::Web.custom_tabs.each do |title, url| %>
36
- <li class="<%= current_path.start_with?(url) ? 'active' : '' %>" data-navbar="custom-tab">
37
- <a href="<%= root_path %><%= url %>"><%= t(title) %></a>
38
- </li>
39
- <% end %>
40
-
41
34
  <li class="navbar-livereload">
42
35
  <div class="poll-wrapper">
43
36
  <%= erb :_poll_link %>
44
- <% if Sidekiq::Web.app_url %>
45
- <a class="btn btn-inverse" href="<%= Sidekiq::Web.app_url %>"><%= t('BackToApp') %></a>
37
+ <% if config.app_url %>
38
+ <a class="btn btn-inverse" href="<%= config.app_url %>"><%= t('BackToApp') %></a>
46
39
  <% end %>
47
40
  </div>
48
41
  </li>
49
42
  </ul>
50
43
  </div>
51
44
  </div>
52
- </div>
45
+ </header>
@@ -1,25 +1,27 @@
1
- <div>
1
+
2
2
  <% if @total_size > @count %>
3
- <ul class="pagination pull-right flip">
4
- <li class="<%= 'disabled' if @current_page == 1 %>">
5
- <a href="<%= url %>?page=1">&laquo;</a>
6
- </li>
7
- <% if @current_page > 1 %>
8
- <li>
9
- <a href="<%= url %>?<%= qparams(page: @current_page - 1) %>"><%= @current_page - 1 %></a>
3
+ <div>
4
+ <ul class="pagination pull-right">
5
+ <li class="<%= 'disabled' if @current_page == 1 %>">
6
+ <a href="<%= url %>?page=1">&laquo;</a>
10
7
  </li>
11
- <% end %>
12
- <li class="disabled">
13
- <a href="<%= url %>?<%= qparams(page: @current_page) %>"><%= @current_page %></a>
14
- </li>
15
- <% if @total_size > @current_page * @count %>
16
- <li>
17
- <a href="<%= url %>?<%= qparams(page: @current_page + 1) %>"><%= @current_page + 1 %></a>
8
+ <% if @current_page > 1 %>
9
+ <li>
10
+ <a href="<%= url %>?<%= qparams(page: @current_page - 1) %>"><%= @current_page - 1 %></a>
11
+ </li>
12
+ <% end %>
13
+ <li class="disabled">
14
+ <a href="<%= url %>?<%= qparams(page: @current_page) %>"><%= @current_page %></a>
18
15
  </li>
19
- <% end %>
20
- <li class="<%= 'disabled' if @total_size <= @current_page * @count %>">
21
- <a href="<%= url %>?<%= qparams(page: (@total_size.to_f / @count).ceil) %>">&raquo;</a>
22
- </li>
23
- </ul>
16
+ <% if @total_size > @current_page * @count %>
17
+ <li>
18
+ <a href="<%= url %>?<%= qparams(page: @current_page + 1) %>"><%= @current_page + 1 %></a>
19
+ </li>
20
+ <% end %>
21
+ <li class="<%= 'disabled' if @total_size <= @current_page * @count %>">
22
+ <a href="<%= url %>?<%= qparams(page: (@total_size.to_f / @count).ceil) %>">&raquo;</a>
23
+ </li>
24
+ </ul>
25
+ </div>
24
26
  <% end %>
25
- </div>
27
+
@@ -1,4 +1,4 @@
1
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>
2
+ <a class="btn live-poll live-poll-start btn-primary"><%= t('LivePoll') %></a>
3
+ <a class="btn live-poll live-poll-stop btn-danger"><%= t('StopPolling') %></a>
4
4
  <% end %>
@@ -1,40 +1,40 @@
1
- <ul class="list-unstyled summary row">
2
- <li class="processed col-sm-1">
1
+ <div class="cards-container">
2
+ <article>
3
3
  <span id="txtProcessed" class="count" data-nwp><%= stats.processed %></span>
4
4
  <span class="desc"><%= t('Processed') %></span>
5
- </li>
6
- <li class="failed col-sm-1">
5
+ </article>
6
+ <article>
7
7
  <span id="txtFailed" class="count" data-nwp><%= stats.failed %></span>
8
8
  <span class="desc"><%= t('Failed') %></span>
9
- </li>
10
- <li class="busy col-sm-1">
9
+ </article>
10
+ <article>
11
11
  <a href="<%= root_path %>busy">
12
12
  <span id="txtBusy" class="count" data-nwp><%= workset.size %></span>
13
13
  <span class="desc"><%= t('Busy') %></span>
14
14
  </a>
15
- </li>
16
- <li class="enqueued col-sm-1">
15
+ </article>
16
+ <article>
17
17
  <a href="<%= root_path %>queues">
18
18
  <span id="txtEnqueued" class="count" data-nwp><%= stats.enqueued %></span>
19
19
  <span class="desc"><%= t('Enqueued') %></span>
20
20
  </a>
21
- </li>
22
- <li class="retries col-sm-1">
21
+ </article>
22
+ <article>
23
23
  <a href="<%= root_path %>retries">
24
24
  <span id="txtRetries" class="count" data-nwp><%= stats.retry_size %></span>
25
25
  <span class="desc"><%= t('Retries') %></span>
26
26
  </a>
27
- </li>
28
- <li class="scheduled col-sm-1">
27
+ </article>
28
+ <article>
29
29
  <a href="<%= root_path %>scheduled">
30
30
  <span id="txtScheduled" class="count" data-nwp><%= stats.scheduled_size %></span>
31
31
  <span class="desc"><%= t('Scheduled') %></span>
32
32
  </a>
33
- </li>
34
- <li class="dead col-sm-1">
33
+ </article>
34
+ <article>
35
35
  <a href="<%= root_path %>morgue">
36
36
  <span id="txtDead" class="count" data-nwp><%= stats.dead_size %></span>
37
37
  <span class="desc"><%= t('Dead') %></span>
38
38
  </a>
39
- </li>
40
- </ul>
39
+ </article>
40
+ </div>