sidekiq 4.2.2 → 6.3.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sidekiq might be problematic. Click here for more details.

Files changed (138) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +516 -0
  3. data/LICENSE +2 -2
  4. data/README.md +23 -36
  5. data/bin/sidekiq +26 -2
  6. data/bin/sidekiqload +28 -38
  7. data/bin/sidekiqmon +8 -0
  8. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +1 -1
  9. data/lib/generators/sidekiq/templates/worker_test.rb.erb +2 -2
  10. data/lib/generators/sidekiq/worker_generator.rb +21 -13
  11. data/lib/sidekiq/api.rb +401 -243
  12. data/lib/sidekiq/cli.rb +228 -212
  13. data/lib/sidekiq/client.rb +76 -53
  14. data/lib/sidekiq/delay.rb +41 -0
  15. data/lib/sidekiq/exception_handler.rb +12 -16
  16. data/lib/sidekiq/extensions/action_mailer.rb +13 -22
  17. data/lib/sidekiq/extensions/active_record.rb +13 -10
  18. data/lib/sidekiq/extensions/class_methods.rb +14 -11
  19. data/lib/sidekiq/extensions/generic_proxy.rb +12 -4
  20. data/lib/sidekiq/fetch.rb +39 -31
  21. data/lib/sidekiq/job.rb +13 -0
  22. data/lib/sidekiq/job_logger.rb +63 -0
  23. data/lib/sidekiq/job_retry.rb +259 -0
  24. data/lib/sidekiq/launcher.rb +170 -71
  25. data/lib/sidekiq/logger.rb +166 -0
  26. data/lib/sidekiq/manager.rb +17 -20
  27. data/lib/sidekiq/middleware/chain.rb +20 -8
  28. data/lib/sidekiq/middleware/current_attributes.rb +52 -0
  29. data/lib/sidekiq/middleware/i18n.rb +5 -7
  30. data/lib/sidekiq/monitor.rb +133 -0
  31. data/lib/sidekiq/paginator.rb +18 -14
  32. data/lib/sidekiq/processor.rb +169 -78
  33. data/lib/sidekiq/rails.rb +41 -36
  34. data/lib/sidekiq/redis_connection.rb +65 -20
  35. data/lib/sidekiq/scheduled.rb +85 -34
  36. data/lib/sidekiq/sd_notify.rb +149 -0
  37. data/lib/sidekiq/systemd.rb +24 -0
  38. data/lib/sidekiq/testing/inline.rb +2 -1
  39. data/lib/sidekiq/testing.rb +52 -26
  40. data/lib/sidekiq/util.rb +48 -15
  41. data/lib/sidekiq/version.rb +2 -1
  42. data/lib/sidekiq/web/action.rb +15 -17
  43. data/lib/sidekiq/web/application.rb +114 -92
  44. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  45. data/lib/sidekiq/web/helpers.rb +151 -83
  46. data/lib/sidekiq/web/router.rb +27 -19
  47. data/lib/sidekiq/web.rb +85 -76
  48. data/lib/sidekiq/worker.rb +233 -43
  49. data/lib/sidekiq.rb +88 -64
  50. data/sidekiq.gemspec +24 -22
  51. data/web/assets/images/apple-touch-icon.png +0 -0
  52. data/web/assets/javascripts/application.js +86 -59
  53. data/web/assets/javascripts/dashboard.js +81 -85
  54. data/web/assets/stylesheets/application-dark.css +147 -0
  55. data/web/assets/stylesheets/application-rtl.css +242 -0
  56. data/web/assets/stylesheets/application.css +319 -141
  57. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  58. data/web/assets/stylesheets/bootstrap.css +2 -2
  59. data/web/locales/ar.yml +87 -0
  60. data/web/locales/de.yml +14 -2
  61. data/web/locales/en.yml +8 -1
  62. data/web/locales/es.yml +22 -5
  63. data/web/locales/fa.yml +80 -0
  64. data/web/locales/fr.yml +10 -3
  65. data/web/locales/he.yml +79 -0
  66. data/web/locales/ja.yml +12 -4
  67. data/web/locales/lt.yml +83 -0
  68. data/web/locales/pl.yml +4 -4
  69. data/web/locales/ru.yml +4 -0
  70. data/web/locales/ur.yml +80 -0
  71. data/web/locales/vi.yml +83 -0
  72. data/web/views/_footer.erb +5 -2
  73. data/web/views/_job_info.erb +4 -3
  74. data/web/views/_nav.erb +4 -18
  75. data/web/views/_paging.erb +1 -1
  76. data/web/views/_poll_link.erb +2 -5
  77. data/web/views/_summary.erb +7 -7
  78. data/web/views/busy.erb +60 -22
  79. data/web/views/dashboard.erb +23 -15
  80. data/web/views/dead.erb +3 -3
  81. data/web/views/layout.erb +14 -3
  82. data/web/views/morgue.erb +19 -12
  83. data/web/views/queue.erb +24 -14
  84. data/web/views/queues.erb +14 -4
  85. data/web/views/retries.erb +22 -13
  86. data/web/views/retry.erb +4 -4
  87. data/web/views/scheduled.erb +7 -4
  88. metadata +44 -194
  89. data/.github/contributing.md +0 -32
  90. data/.github/issue_template.md +0 -4
  91. data/.gitignore +0 -12
  92. data/.travis.yml +0 -12
  93. data/3.0-Upgrade.md +0 -70
  94. data/4.0-Upgrade.md +0 -53
  95. data/COMM-LICENSE +0 -95
  96. data/Ent-Changes.md +0 -146
  97. data/Gemfile +0 -29
  98. data/Pro-2.0-Upgrade.md +0 -138
  99. data/Pro-3.0-Upgrade.md +0 -44
  100. data/Pro-Changes.md +0 -570
  101. data/Rakefile +0 -9
  102. data/bin/sidekiqctl +0 -99
  103. data/code_of_conduct.md +0 -50
  104. data/lib/sidekiq/core_ext.rb +0 -106
  105. data/lib/sidekiq/logging.rb +0 -106
  106. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  107. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  108. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -205
  109. data/test/config.yml +0 -9
  110. data/test/env_based_config.yml +0 -11
  111. data/test/fake_env.rb +0 -1
  112. data/test/fixtures/en.yml +0 -2
  113. data/test/helper.rb +0 -75
  114. data/test/test_actors.rb +0 -138
  115. data/test/test_api.rb +0 -528
  116. data/test/test_cli.rb +0 -418
  117. data/test/test_client.rb +0 -266
  118. data/test/test_exception_handler.rb +0 -56
  119. data/test/test_extensions.rb +0 -127
  120. data/test/test_fetch.rb +0 -50
  121. data/test/test_launcher.rb +0 -95
  122. data/test/test_logging.rb +0 -35
  123. data/test/test_manager.rb +0 -50
  124. data/test/test_middleware.rb +0 -158
  125. data/test/test_processor.rb +0 -201
  126. data/test/test_rails.rb +0 -22
  127. data/test/test_redis_connection.rb +0 -132
  128. data/test/test_retry.rb +0 -326
  129. data/test/test_retry_exhausted.rb +0 -149
  130. data/test/test_scheduled.rb +0 -115
  131. data/test/test_scheduling.rb +0 -50
  132. data/test/test_sidekiq.rb +0 -107
  133. data/test/test_testing.rb +0 -143
  134. data/test/test_testing_fake.rb +0 -357
  135. data/test/test_testing_inline.rb +0 -94
  136. data/test/test_util.rb +0 -13
  137. data/test/test_web.rb +0 -666
  138. data/test/test_web_helpers.rb +0 -54
@@ -0,0 +1,83 @@
1
+ # elements like %{queue} are variables and should not be translated
2
+ vi: # <---- change this to your locale code
3
+ Dashboard: Bảng điều khiển
4
+ Status: Trạng thái
5
+ Time: Thời gian
6
+ Namespace: Không gian tên
7
+ Realtime: Thời gian thực
8
+ History: Lịch sử
9
+ Busy: Bận rộn
10
+ Processed: Đã xử lí
11
+ Failed: Đã thất bại
12
+ Scheduled: Đã lên lịch
13
+ Retries: Số lần thử
14
+ Enqueued: Đã xếp hàng đợi
15
+ Worker: Máy xử lí
16
+ LivePoll: Thăm dò trực tiếp
17
+ StopPolling: Ngừng thăm dò
18
+ Queue: Hàng đợi
19
+ Class: Lớp
20
+ Job: Tác vụ
21
+ Arguments: Tham số
22
+ Extras: Thêm
23
+ Started: Đã bắt đầu
24
+ ShowAll: Hiện tất cả
25
+ CurrentMessagesInQueue: Số lượng công việc trong <span class='title'>%{queue}</span>
26
+ Delete: Xóa
27
+ AddToQueue: Thêm vào hàng đợi
28
+ AreYouSureDeleteJob: Bạn có chắc là muốn xóa tác vụ này?
29
+ AreYouSureDeleteQueue: Bạn có chắc là muốn xóa %{queue} này?
30
+ Queues: Các hàng đợi
31
+ Size: Kích thước
32
+ Actions: Những hành động
33
+ NextRetry: Lần thử lại tiếp theo
34
+ RetryCount: Số lần thử lại
35
+ RetryNow: Thử lại ngay bây giờ
36
+ Kill: Giết
37
+ LastRetry: Lần thử cuối
38
+ OriginallyFailed: Đã thất bại từ đầu
39
+ AreYouSure: Bạn chắc chứ?
40
+ DeleteAll: Xóa hết
41
+ RetryAll: Thử lại tất cả
42
+ KillAll: Giết hết
43
+ NoRetriesFound: Không có lần thử nào được tìm thấy
44
+ Error: Lỗi
45
+ ErrorClass: Lớp lỗi
46
+ ErrorMessage: Tin nhắn lỗi
47
+ ErrorBacktrace: Dấu vết của lỗi
48
+ GoBack: ← Trở lại
49
+ NoScheduledFound: Không có tác vụ đã lên lịch nào được tìm thấy
50
+ When: Khi nào
51
+ ScheduledJobs: Những Tác Vụ Được Hẹn
52
+ idle: Đang chờ
53
+ active: Đang hoạt động
54
+ Version: Phiên bản
55
+ Connections: Các kết nối
56
+ MemoryUsage: Lượng bộ nhớ sử dụng
57
+ PeakMemoryUsage: Lượng bộ nhớ sử dụng đỉnh điểm
58
+ Uptime: Thời gian hệ thống đã online (days)
59
+ OneWeek: 1 tuần
60
+ OneMonth: 1 tháng
61
+ ThreeMonths: 3 tháng
62
+ SixMonths: 6 tháng
63
+ Failures: Các thất bại
64
+ DeadJobs: Những tác vụ đã chết
65
+ NoDeadJobsFound: Không có tác vụ đã chết nào được tìm thấy
66
+ Dead: Chết
67
+ Processes: Tiến trình xử lí
68
+ Thread: Luồng xử lí
69
+ Threads: Những luồng xử lí
70
+ Jobs: Các tác vụ
71
+ Paused: Đã tạm dừng
72
+ Stop: Dừng Lại
73
+ Quiet: Im lặng
74
+ StopAll: Dừng lại tất cả
75
+ QuietAll: Làm cho tất cả im lặng
76
+ PollingInterval: Khoảng thời gian giữa các lần thăm dò
77
+ Plugins: Hệ thống đính kèm
78
+ NotYetEnqueued: Chưa được bỏ vào hàng đợi
79
+ CreatedAt: Được tạo vào lúc
80
+ BackToApp: Trở về ứng dụng
81
+ Latency: Độ trễ
82
+ Pause: Tạm dừng
83
+ Unpause: Hủy tạm dừng
@@ -1,4 +1,4 @@
1
- <div class="navbar navbar-fixed-bottom navbar-inverse">
1
+ <div class="navbar navbar-fixed-bottom navbar-inverse ltr">
2
2
  <div class="navbar-inner">
3
3
  <div class="container text-center">
4
4
  <ul class="nav">
@@ -9,7 +9,10 @@
9
9
  <p class="navbar-text redis-url" title="<%= redis_connection_and_namespace %>"><%= redis_connection_and_namespace %></p>
10
10
  </li>
11
11
  <li>
12
- <p class="navbar-text"><%= Time.now.utc.strftime('%H:%M:%S UTC') %></p>
12
+ <p id="serverUtcTime" class="navbar-text server-utc-time"><%= server_utc_time %></p>
13
+ </li>
14
+ <li>
15
+ <p class="navbar-text"><a style="color: gray;" href="https://github.com/mperham/sidekiq/wiki">docs</a></p>
13
16
  </li>
14
17
  </ul>
15
18
  </div>
@@ -3,7 +3,7 @@
3
3
  </header>
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
- <code><%= job.display_class %></code>
17
+ <%= job.display_class %>
18
+ <%= display_tags(job) %>
18
19
  </td>
19
20
  </tr>
20
21
  <tr>
@@ -80,7 +81,7 @@
80
81
  <% if type == :dead %>
81
82
  <tr>
82
83
  <th><%= t('LastRetry') %></th>
83
- <td><%= relative_time(job.at) %></td>
84
+ <td><%= relative_time(job.at) if job['retry_count'] %></td>
84
85
  </tr>
85
86
  <% end %>
86
87
  </tbody>
data/web/views/_nav.erb CHANGED
@@ -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 %>">Back to App</a>
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
- </ul>
54
- <ul class="nav navbar-nav navbar-right navbar-livereload" data-navbar="static">
55
- <li>
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>
@@ -1,5 +1,5 @@
1
1
  <% if @total_size > @count %>
2
- <ul class="pagination pull-right">
2
+ <ul class="pagination pull-right flip">
3
3
  <li class="<%= 'disabled' if @current_page == 1 %>">
4
4
  <a href="<%= url %>?page=1">&laquo;</a>
5
5
  </li>
@@ -1,7 +1,4 @@
1
1
  <% if current_path != '' %>
2
- <% if params[:poll] %>
3
- <a id="live-poll" class="btn btn-primary active" href="<%= root_path + current_path %>"><%= t('StopPolling') %></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 %>
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 %>
@@ -1,39 +1,39 @@
1
1
  <ul class="list-unstyled summary row">
2
2
  <li class="processed col-sm-1">
3
- <span class="count"><%= number_with_delimiter(stats.processed) %></span>
3
+ <span id="txtProcessed" class="count"><%= number_with_delimiter(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"><%= number_with_delimiter(stats.failed) %></span>
7
+ <span id="txtFailed" class="count"><%= number_with_delimiter(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"><%= number_with_delimiter(workers.size) %></span>
12
+ <span id="txtBusy" class="count"><%= number_with_delimiter(workers.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"><%= number_with_delimiter(stats.enqueued) %></span>
18
+ <span id="txtEnqueued" class="count"><%= number_with_delimiter(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"><%= number_with_delimiter(stats.retry_size) %></span>
24
+ <span id="txtRetries" class="count"><%= number_with_delimiter(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"><%= number_with_delimiter(stats.scheduled_size) %></span>
30
+ <span id="txtScheduled" class="count"><%= number_with_delimiter(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"><%= number_with_delimiter(stats.dead_size) %></span>
36
+ <span id="txtDead" class="count"><%= number_with_delimiter(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,27 +1,59 @@
1
1
  <div class="row header">
2
- <div class="col-sm-8 pull-left">
2
+ <div class="col-sm-4 pull-left flip">
3
+ <h3><%= t('Status') %></h3>
4
+ </div>
5
+ </div>
6
+
7
+ <div class="stats-wrapper">
8
+ <div class="stats-container">
9
+ <div class="stat">
10
+ <h3><%= s = processes.size; number_with_delimiter(s) %></h3>
11
+ <p><%= t('Processes') %></p>
12
+ </div>
13
+ <div class="stat">
14
+ <h3><%= x = processes.total_concurrency; number_with_delimiter(x) %></h3>
15
+ <p><%= t('Threads') %></p>
16
+ </div>
17
+ <div class="stat">
18
+ <h3><%= ws = workers.size; number_with_delimiter(ws) %></h3>
19
+ <p><%= t('Busy') %></p>
20
+ </div>
21
+ <div class="stat">
22
+ <h3><%= x == 0 ? 0 : ((ws / x.to_f) * 100).round(0) %>%</h3>
23
+ <p><%= t('Utilization') %></p>
24
+ </div>
25
+ <div class="stat">
26
+ <h3><%= format_memory(processes.total_rss) %></h3>
27
+ <p><%= t('RSS') %></p>
28
+ </div>
29
+ </div>
30
+ </div>
31
+
32
+ <div class="row header">
33
+ <div class="col-sm-4 pull-left flip">
3
34
  <h3><%= t('Processes') %></h3>
4
35
  </div>
5
- <div class="col-sm-4 pull-right">
36
+ <div class="col-sm-3 pull-right flip">
6
37
  <form method="POST" class="warning-messages">
7
38
  <%= csrf_tag %>
8
- <div class="btn-group pull-right">
39
+ <div class="btn-group pull-right flip">
9
40
  <button class="btn btn-warn" type="submit" name="quiet" value="1" data-confirm="<%= t('AreYouSure') %>"><%= t('QuietAll') %></button>
10
41
  <button class="btn btn-danger" type="submit" name="stop" value="1" data-confirm="<%= t('AreYouSure') %>"><%= t('StopAll') %></button>
11
42
  </div>
12
43
  </form>
13
44
  </div>
14
45
  </div>
15
-
16
46
  <div class="table_container">
17
- <table class="processes table table-hover table-bordered table-striped table-white">
47
+ <table class="processes table table-hover table-bordered table-striped">
18
48
  <thead>
19
49
  <th><%= t('Name') %></th>
20
50
  <th><%= t('Started') %></th>
21
- <th><%= t('Threads') %></th>
22
- <th><%= t('Busy') %></th>
51
+ <th class="col-sm-1"><%= t('RSS') %><a href="https://github.com/mperham/sidekiq/wiki/Memory#rss"><span class="info-circle" title="Click to learn more about RSS">?</span></a></th>
52
+ <th class="col-sm-1"><%= t('Threads') %></th>
53
+ <th class="col-sm-1"><%= t('Busy') %></th>
23
54
  <th>&nbsp;</th>
24
55
  </thead>
56
+ <% lead = processes.leader %>
25
57
  <% processes.each do |process| %>
26
58
  <tr>
27
59
  <td class="box">
@@ -31,26 +63,29 @@
31
63
  <span class="label label-info"><%= label %></span>
32
64
  <% end %>
33
65
  <% if process.stopping? %>
34
- <span class="label label-danger">Quiet</span>
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
- <%= process['queues'] * ", " %>
73
+ <%= process.queues.join(", ") %>
39
74
  </td>
40
75
  <td><%= relative_time(Time.at(process['started_at'])) %></td>
76
+ <td><%= format_memory(process['rss'].to_i) %></td>
41
77
  <td><%= process['concurrency'] %></td>
42
78
  <td><%= process['busy'] %></td>
43
79
  <td>
44
- <div class="btn-group pull-right">
45
- <form method="POST">
46
- <%= csrf_tag %>
47
- <input type="hidden" name="identity" value="<%= process['identity'] %>"/>
48
- <% unless process.stopping? %>
49
- <button class="btn btn-warn" type="submit" name="quiet" value="1"><%= t('Quiet') %></button>
50
- <% end %>
51
- <button class="btn btn-danger" type="submit" name="stop" value="1"><%= t('Stop') %></button>
52
- </form>
53
- </div>
80
+ <form method="POST">
81
+ <%= csrf_tag %>
82
+ <input type="hidden" name="identity" value="<%= process['identity'] %>"/>
83
+
84
+ <div class="btn-group pull-right flip">
85
+ <% unless process.stopping? %><button class="btn btn-xs btn-warn" type="submit" name="quiet" value="1"><%= t('Quiet') %></button><% end %>
86
+ <button class="btn btn-xs btn-danger" type="submit" name="stop" value="1"><%= t('Stop') %></button>
87
+ </div>
88
+ </form>
54
89
  </td>
55
90
  </tr>
56
91
  <% end %>
@@ -64,7 +99,7 @@
64
99
  </div>
65
100
 
66
101
  <div class="table_container">
67
- <table class="workers table table-hover table-bordered table-striped table-white">
102
+ <table class="workers table table-hover table-bordered table-striped">
68
103
  <thead>
69
104
  <th><%= t('Process') %></th>
70
105
  <th><%= t('TID') %></th>
@@ -75,7 +110,7 @@
75
110
  <th><%= t('Started') %></th>
76
111
  </thead>
77
112
  <% workers.each do |process, thread, msg| %>
78
- <% job = Sidekiq::Job.new(msg['payload']) %>
113
+ <% job = Sidekiq::JobRecord.new(msg['payload']) %>
79
114
  <tr>
80
115
  <td><%= process %></td>
81
116
  <td><%= thread %></td>
@@ -83,7 +118,10 @@
83
118
  <td>
84
119
  <a href="<%= root_path %>queues/<%= msg['queue'] %>"><%= msg['queue'] %></a>
85
120
  </td>
86
- <td><%= job.display_class %></td>
121
+ <td>
122
+ <%= job.display_class %>
123
+ <%= display_tags(job, nil) %>
124
+ </td>
87
125
  <td>
88
126
  <div class="args"><%= display_args(job.display_args) %></div>
89
127
  </td>
@@ -2,16 +2,16 @@
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">2 sec</span>
12
+ <span id="sldr-text" class="current-interval">5 sec</span>
13
13
  <br/>
14
- <input type="range" min="2000" max="20000" step="1000" value="2000"/>
14
+ <input id="sldr" type="range" min="2000" max="20000" step="1000" value="5000"/>
15
15
  </div>
16
16
  </div>
17
17
 
@@ -20,54 +20,62 @@
20
20
  <div id="realtime-legend"></div>
21
21
  </div>
22
22
 
23
- <div class="row chart">
24
- <h5>
25
- <span class="history-heading"><%= t('History') %></span>
23
+ <div class="row header">
24
+ <div class="col-sm-4 pull-left flip">
25
+ <h3><%= t('History') %></h3>
26
+ </div>
27
+ </div>
28
+ <div class="row chart">
29
+ <div>
26
30
  <a href="<%= root_path %>?days=7" class="history-graph <%= "active" if params[:days] == "7" %>"><%= t('OneWeek') %></a>
27
31
  <a href="<%= root_path %>" class="history-graph <%= "active" if params[:days].nil? || params[:days] == "30" %>"><%= t('OneMonth') %></a>
28
32
  <a href="<%= root_path %>?days=90" class="history-graph <%= "active" if params[:days] == "90" %>"><%= t('ThreeMonths') %></a>
29
33
  <a href="<%= root_path %>?days=180" class="history-graph <%= "active" if params[:days] == "180" %>"><%= t('SixMonths') %></a>
30
- </h5>
34
+ </div>
31
35
 
32
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>
33
37
  <div id="history-legend"></div>
34
38
  </div>
35
39
 
36
40
  <br/>
37
- <h5>Redis</h5>
38
- <div class="redis-wrapper">
41
+ <div class="row header">
42
+ <div class="col-sm-4 pull-left flip">
43
+ <h3>Redis</h3>
44
+ </div>
45
+ </div>
46
+ <div class="stats-wrapper">
39
47
  <div class="stats-container">
40
48
  <% if @redis_info.fetch("redis_version", nil) %>
41
49
  <div class="stat">
42
- <h3 class="redis_version"><%= @redis_info.fetch("redis_version") %></h3>
50
+ <h3 id="redis_version"><%= @redis_info.fetch("redis_version") %></h3>
43
51
  <p><%= t('Version') %></p>
44
52
  </div>
45
53
  <% end %>
46
54
 
47
55
  <% if @redis_info.fetch("uptime_in_days", nil) %>
48
56
  <div class="stat">
49
- <h3 class="uptime_in_days"><%= @redis_info.fetch("uptime_in_days") %></h3>
57
+ <h3 id="uptime_in_days"><%= @redis_info.fetch("uptime_in_days") %></h3>
50
58
  <p><%= t('Uptime') %></p>
51
59
  </div>
52
60
  <% end %>
53
61
 
54
62
  <% if @redis_info.fetch("connected_clients", nil) %>
55
63
  <div class="stat">
56
- <h3 class="connected_clients"><%= @redis_info.fetch("connected_clients") %></h3>
64
+ <h3 id="connected_clients"><%= @redis_info.fetch("connected_clients") %></h3>
57
65
  <p><%= t('Connections') %></p>
58
66
  </div>
59
67
  <% end %>
60
68
 
61
69
  <% if @redis_info.fetch("used_memory_human", nil) %>
62
70
  <div class="stat">
63
- <h3 class="used_memory_human"><%= @redis_info.fetch("used_memory_human") %></h3>
71
+ <h3 id="used_memory_human"><%= @redis_info.fetch("used_memory_human") %></h3>
64
72
  <p><%= t('MemoryUsage') %></p>
65
73
  </div>
66
74
  <% end %>
67
75
 
68
76
  <% if @redis_info.fetch("used_memory_peak_human", nil) %>
69
77
  <div class="stat">
70
- <h3 class="used_memory_peak_human"><%= @redis_info.fetch("used_memory_peak_human") %></h3>
78
+ <h3 id="used_memory_peak_human"><%= @redis_info.fetch("used_memory_peak_human") %></h3>
71
79
  <p><%= t('PeakMemoryUsage') %></p>
72
80
  </div>
73
81
  <% end %>
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 !@dead['error_backtrace'].nil? %>
17
+ <% if @dead.error_backtrace %>
18
18
  <tr>
19
19
  <th><%= t('ErrorBacktrace') %></th>
20
20
  <td>
21
- <code><%= @dead['error_backtrace'].join("<br/>") %></code>
21
+ <code><%= @dead.error_backtrace.join("<br/>") %></code>
22
22
  </td>
23
23
  </tr>
24
24
  <% end %>
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="utf8" />
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" />
9
+ <% if rtl? %>
10
+ <link href="<%= root_path %>stylesheets/bootstrap-rtl.min.css" media="screen" rel="stylesheet" type="text/css"/>
11
+ <% end %>
12
+
8
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" />
15
+ <% if rtl? %>
16
+ <link href="<%= root_path %>stylesheets/application-rtl.css" media="screen" rel="stylesheet" type="text/css" />
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
21
  <script type="text/javascript" src="<%= root_path %>javascripts/application.js"></script>
11
22
  <meta name="google" content="notranslate" />
12
23
  <%= display_custom_head %>
13
24
  </head>
14
- <body class="admin" data-poll-path="<%= poll_path %>" data-locale="<%= locale %>">
25
+ <body class="admin" data-locale="<%= locale %>">
15
26
  <%= erb :_nav %>
16
27
  <div id="page">
17
28
  <div class="container">
data/web/views/morgue.erb CHANGED
@@ -14,7 +14,7 @@
14
14
  <form action="<%= root_path %>morgue" method="post">
15
15
  <%= csrf_tag %>
16
16
  <div class="table_container">
17
- <table class="table table-striped table-bordered table-white">
17
+ <table class="table table-striped table-bordered table-hover">
18
18
  <thead>
19
19
  <tr>
20
20
  <th class="table-checkbox checkbox-column">
@@ -42,29 +42,36 @@
42
42
  <td>
43
43
  <a href="<%= root_path %>queues/<%= entry.queue %>"><%= entry.queue %></a>
44
44
  </td>
45
- <td><%= entry.display_class %></td>
45
+ <td>
46
+ <%= entry.display_class %>
47
+ <%= display_tags(entry, "dead") %>
48
+ </td>
46
49
  <td>
47
50
  <div class="args"><%= display_args(entry.display_args) %></div>
48
51
  </td>
49
52
  <td>
53
+ <% if entry.error? %>
50
54
  <div><%= h truncate("#{entry['error_class']}: #{entry['error_message']}", 200) %></div>
55
+ <% end %>
51
56
  </td>
52
57
  </tr>
53
58
  <% end %>
54
59
  </table>
55
60
  </div>
56
- <input class="btn btn-primary btn-xs pull-left" type="submit" name="retry" value="<%= t('RetryNow') %>" />
57
- <input class="btn btn-danger btn-xs pull-left" type="submit" name="delete" value="<%= t('Delete') %>" />
61
+ <input class="btn btn-primary pull-left flip" type="submit" name="retry" value="<%= t('RetryNow') %>" />
62
+ <input class="btn btn-danger pull-left flip" type="submit" name="delete" value="<%= t('Delete') %>" />
58
63
  </form>
59
64
 
60
- <form action="<%= root_path %>morgue/all/delete" method="post">
61
- <%= csrf_tag %>
62
- <input class="btn btn-danger btn-xs pull-right" type="submit" name="delete" value="<%= t('DeleteAll') %>" data-confirm="<%= t('AreYouSure') %>" />
63
- </form>
64
- <form action="<%= root_path %>morgue/all/retry" method="post">
65
- <%= csrf_tag %>
66
- <input class="btn btn-danger btn-xs pull-right" type="submit" name="retry" value="<%= t('RetryAll') %>" data-confirm="<%= t('AreYouSure') %>" />
67
- </form>
65
+ <% unfiltered? do %>
66
+ <form action="<%= root_path %>morgue/all/delete" method="post">
67
+ <%= csrf_tag %>
68
+ <input class="btn btn-danger pull-right flip" type="submit" name="delete" value="<%= t('DeleteAll') %>" data-confirm="<%= t('AreYouSure') %>" />
69
+ </form>
70
+ <form action="<%= root_path %>morgue/all/retry" method="post">
71
+ <%= csrf_tag %>
72
+ <input class="btn btn-danger pull-right flip" type="submit" name="retry" value="<%= t('RetryAll') %>" data-confirm="<%= t('AreYouSure') %>" />
73
+ </form>
74
+ <% end %>
68
75
 
69
76
  <% else %>
70
77
  <div class="alert alert-success"><%= t('NoDeadJobsFound') %></div>