sidekiq 5.2.7 → 8.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +845 -8
  3. data/LICENSE.txt +9 -0
  4. data/README.md +54 -54
  5. data/bin/multi_queue_bench +271 -0
  6. data/bin/sidekiq +22 -3
  7. data/bin/sidekiqload +219 -112
  8. data/bin/sidekiqmon +11 -0
  9. data/bin/webload +69 -0
  10. data/lib/active_job/queue_adapters/sidekiq_adapter.rb +120 -0
  11. data/lib/generators/sidekiq/job_generator.rb +59 -0
  12. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  13. data/lib/generators/sidekiq/templates/{worker_spec.rb.erb → job_spec.rb.erb} +1 -1
  14. data/lib/generators/sidekiq/templates/{worker_test.rb.erb → job_test.rb.erb} +1 -1
  15. data/lib/sidekiq/api.rb +757 -373
  16. data/lib/sidekiq/capsule.rb +132 -0
  17. data/lib/sidekiq/cli.rb +210 -233
  18. data/lib/sidekiq/client.rb +145 -103
  19. data/lib/sidekiq/component.rb +128 -0
  20. data/lib/sidekiq/config.rb +315 -0
  21. data/lib/sidekiq/deploy.rb +64 -0
  22. data/lib/sidekiq/embedded.rb +64 -0
  23. data/lib/sidekiq/fetch.rb +49 -42
  24. data/lib/sidekiq/iterable_job.rb +56 -0
  25. data/lib/sidekiq/job/interrupt_handler.rb +24 -0
  26. data/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
  27. data/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
  28. data/lib/sidekiq/job/iterable/enumerators.rb +135 -0
  29. data/lib/sidekiq/job/iterable.rb +306 -0
  30. data/lib/sidekiq/job.rb +385 -0
  31. data/lib/sidekiq/job_logger.rb +34 -7
  32. data/lib/sidekiq/job_retry.rb +164 -109
  33. data/lib/sidekiq/job_util.rb +113 -0
  34. data/lib/sidekiq/launcher.rb +208 -107
  35. data/lib/sidekiq/logger.rb +80 -0
  36. data/lib/sidekiq/manager.rb +42 -46
  37. data/lib/sidekiq/metrics/query.rb +184 -0
  38. data/lib/sidekiq/metrics/shared.rb +109 -0
  39. data/lib/sidekiq/metrics/tracking.rb +150 -0
  40. data/lib/sidekiq/middleware/chain.rb +113 -56
  41. data/lib/sidekiq/middleware/current_attributes.rb +119 -0
  42. data/lib/sidekiq/middleware/i18n.rb +7 -7
  43. data/lib/sidekiq/middleware/modules.rb +23 -0
  44. data/lib/sidekiq/monitor.rb +147 -0
  45. data/lib/sidekiq/paginator.rb +41 -16
  46. data/lib/sidekiq/processor.rb +146 -127
  47. data/lib/sidekiq/profiler.rb +72 -0
  48. data/lib/sidekiq/rails.rb +46 -43
  49. data/lib/sidekiq/redis_client_adapter.rb +113 -0
  50. data/lib/sidekiq/redis_connection.rb +79 -108
  51. data/lib/sidekiq/ring_buffer.rb +31 -0
  52. data/lib/sidekiq/scheduled.rb +112 -50
  53. data/lib/sidekiq/sd_notify.rb +149 -0
  54. data/lib/sidekiq/systemd.rb +26 -0
  55. data/lib/sidekiq/testing/inline.rb +6 -5
  56. data/lib/sidekiq/testing.rb +91 -90
  57. data/lib/sidekiq/transaction_aware_client.rb +51 -0
  58. data/lib/sidekiq/version.rb +7 -1
  59. data/lib/sidekiq/web/action.rb +125 -60
  60. data/lib/sidekiq/web/application.rb +363 -259
  61. data/lib/sidekiq/web/config.rb +120 -0
  62. data/lib/sidekiq/web/csrf_protection.rb +183 -0
  63. data/lib/sidekiq/web/helpers.rb +241 -120
  64. data/lib/sidekiq/web/router.rb +62 -71
  65. data/lib/sidekiq/web.rb +69 -161
  66. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  67. data/lib/sidekiq.rb +94 -182
  68. data/sidekiq.gemspec +26 -16
  69. data/web/assets/images/apple-touch-icon.png +0 -0
  70. data/web/assets/javascripts/application.js +150 -61
  71. data/web/assets/javascripts/base-charts.js +120 -0
  72. data/web/assets/javascripts/chart.min.js +13 -0
  73. data/web/assets/javascripts/chartjs-adapter-date-fns.min.js +7 -0
  74. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  75. data/web/assets/javascripts/dashboard-charts.js +194 -0
  76. data/web/assets/javascripts/dashboard.js +41 -293
  77. data/web/assets/javascripts/metrics.js +280 -0
  78. data/web/assets/stylesheets/style.css +766 -0
  79. data/web/locales/ar.yml +72 -65
  80. data/web/locales/cs.yml +63 -62
  81. data/web/locales/da.yml +61 -53
  82. data/web/locales/de.yml +66 -53
  83. data/web/locales/el.yml +44 -24
  84. data/web/locales/en.yml +94 -66
  85. data/web/locales/es.yml +92 -54
  86. data/web/locales/fa.yml +66 -65
  87. data/web/locales/fr.yml +83 -62
  88. data/web/locales/gd.yml +99 -0
  89. data/web/locales/he.yml +66 -64
  90. data/web/locales/hi.yml +60 -59
  91. data/web/locales/it.yml +93 -54
  92. data/web/locales/ja.yml +75 -64
  93. data/web/locales/ko.yml +53 -52
  94. data/web/locales/lt.yml +84 -0
  95. data/web/locales/nb.yml +62 -61
  96. data/web/locales/nl.yml +53 -52
  97. data/web/locales/pl.yml +46 -45
  98. data/web/locales/{pt-br.yml → pt-BR.yml} +84 -56
  99. data/web/locales/pt.yml +52 -51
  100. data/web/locales/ru.yml +69 -63
  101. data/web/locales/sv.yml +54 -53
  102. data/web/locales/ta.yml +61 -60
  103. data/web/locales/tr.yml +101 -0
  104. data/web/locales/uk.yml +86 -61
  105. data/web/locales/ur.yml +65 -64
  106. data/web/locales/vi.yml +84 -0
  107. data/web/locales/zh-CN.yml +106 -0
  108. data/web/locales/{zh-tw.yml → zh-TW.yml} +43 -9
  109. data/web/views/_footer.erb +31 -19
  110. data/web/views/_job_info.erb +94 -75
  111. data/web/views/_metrics_period_select.erb +15 -0
  112. data/web/views/_nav.erb +14 -21
  113. data/web/views/_paging.erb +23 -19
  114. data/web/views/_poll_link.erb +3 -6
  115. data/web/views/_summary.erb +23 -23
  116. data/web/views/busy.erb +139 -87
  117. data/web/views/dashboard.erb +82 -53
  118. data/web/views/dead.erb +31 -27
  119. data/web/views/filtering.erb +6 -0
  120. data/web/views/layout.erb +15 -29
  121. data/web/views/metrics.erb +84 -0
  122. data/web/views/metrics_for_job.erb +58 -0
  123. data/web/views/morgue.erb +60 -70
  124. data/web/views/profiles.erb +43 -0
  125. data/web/views/queue.erb +50 -39
  126. data/web/views/queues.erb +45 -29
  127. data/web/views/retries.erb +65 -75
  128. data/web/views/retry.erb +32 -27
  129. data/web/views/scheduled.erb +58 -52
  130. data/web/views/scheduled_job_info.erb +1 -1
  131. metadata +96 -76
  132. data/.circleci/config.yml +0 -61
  133. data/.github/contributing.md +0 -32
  134. data/.github/issue_template.md +0 -11
  135. data/.gitignore +0 -15
  136. data/.travis.yml +0 -11
  137. data/3.0-Upgrade.md +0 -70
  138. data/4.0-Upgrade.md +0 -53
  139. data/5.0-Upgrade.md +0 -56
  140. data/COMM-LICENSE +0 -97
  141. data/Ent-Changes.md +0 -238
  142. data/Gemfile +0 -23
  143. data/LICENSE +0 -9
  144. data/Pro-2.0-Upgrade.md +0 -138
  145. data/Pro-3.0-Upgrade.md +0 -44
  146. data/Pro-4.0-Upgrade.md +0 -35
  147. data/Pro-Changes.md +0 -759
  148. data/Rakefile +0 -9
  149. data/bin/sidekiqctl +0 -20
  150. data/code_of_conduct.md +0 -50
  151. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  152. data/lib/sidekiq/core_ext.rb +0 -1
  153. data/lib/sidekiq/ctl.rb +0 -221
  154. data/lib/sidekiq/delay.rb +0 -42
  155. data/lib/sidekiq/exception_handler.rb +0 -29
  156. data/lib/sidekiq/extensions/action_mailer.rb +0 -57
  157. data/lib/sidekiq/extensions/active_record.rb +0 -40
  158. data/lib/sidekiq/extensions/class_methods.rb +0 -40
  159. data/lib/sidekiq/extensions/generic_proxy.rb +0 -31
  160. data/lib/sidekiq/logging.rb +0 -122
  161. data/lib/sidekiq/middleware/server/active_record.rb +0 -23
  162. data/lib/sidekiq/util.rb +0 -66
  163. data/lib/sidekiq/worker.rb +0 -220
  164. data/web/assets/stylesheets/application-rtl.css +0 -246
  165. data/web/assets/stylesheets/application.css +0 -1144
  166. data/web/assets/stylesheets/bootstrap-rtl.min.css +0 -9
  167. data/web/assets/stylesheets/bootstrap.css +0 -5
  168. data/web/locales/zh-cn.yml +0 -68
  169. data/web/views/_status.erb +0 -4
@@ -0,0 +1,106 @@
1
+ # elements like %{queue} are variables and should not be translated
2
+ zh-CN: # <---- change this to your locale code
3
+ LanguageName: 中文
4
+ Actions: 操作
5
+ AddToQueue: 添加至队列
6
+ AreYouSure: 你确定?
7
+ AreYouSureDeleteJob: 你确定要删除这个任务么?
8
+ AreYouSureDeleteQueue: 你确定要删除 %{queue} 队列吗?这将删除当前队列中的所有任务,当新的任务添加到该队列时,它会重新出现。
9
+ Arguments: 参数
10
+ BackToApp: 返回首页
11
+ Busy: 执行中
12
+ Class: 类别
13
+ Connections: 连接
14
+ CreatedAt: 创建时间
15
+ CurrentMessagesInQueue: 目前在 <span class='title'>%{queue}</span> 队列中的任务
16
+ Dashboard: 信息板
17
+ Dead: 已停滞
18
+ DeadJobs: 已停滞任务
19
+ Delete: 删除
20
+ DeleteAll: 全部删除
21
+ Deploy: 部署
22
+ Enqueued: 已进入队列
23
+ Error: 错误
24
+ ErrorBacktrace: 错误细节
25
+ ErrorClass: 错误类别
26
+ ErrorMessage: 错误信息
27
+ ExecutionTime: 执行时间
28
+ Extras: 附加信息
29
+ Failed: 失败
30
+ Failures: 失败记录
31
+ Failure: 失败
32
+ GoBack: ← 返回
33
+ History: 历史记录
34
+ Job: 任务
35
+ Jobs: 任务
36
+ Kill: 终止
37
+ KillAll: 全部终止
38
+ LastRetry: 上次重试
39
+ Latency: 延迟
40
+ LivePoll: 实时轮询
41
+ MemoryUsage: 内存占用
42
+ Name: 名称
43
+ Namespace: 命名空间
44
+ NextRetry: 下次重试
45
+ NoDeadJobsFound: 没有发现已停滞任务
46
+ NoRetriesFound: 没有发现可重试任务
47
+ NoScheduledFound: 没有发现计划任务
48
+ NotYetEnqueued: 尚未进入队列
49
+ OneMonth: 1个月
50
+ OneWeek: 1周
51
+ OriginallyFailed: 首次失败
52
+ Pause: 暂停
53
+ Paused: 已暂停
54
+ PeakMemoryUsage: 内存占用峰值
55
+ Plugins: 插件
56
+ PollingInterval: 轮询周期
57
+ Process: 进程
58
+ Processed: 已处理
59
+ Processes: 进程
60
+ Queue: 队列
61
+ Queues: 队列
62
+ Quiet: 暂停
63
+ QuietAll: 全部暂停
64
+ Realtime: 实时
65
+ Retries: 重试
66
+ RetryAll: 全部重试
67
+ RetryCount: 重试次数
68
+ RetryNow: 立即重试
69
+ Scheduled: 已计划
70
+ ScheduledJobs: 计划任务
71
+ Seconds: 秒
72
+ ShowAll: 显示全部
73
+ SixMonths: 6个月
74
+ Size: 大小
75
+ Started: 已启动
76
+ Status: 状态
77
+ Stop: 强制暂停
78
+ StopAll: 全部强制暂停
79
+ StopPolling: 停止轮询
80
+ Success: 成功
81
+ Summary: 概览
82
+ Thread: 线程
83
+ Threads: 线程
84
+ ThreeMonths: 3个月
85
+ Time: 时间
86
+ Unpause: 取消暂停
87
+ Uptime: 运行时间(天)
88
+ Utilization: 利用率
89
+ Version: 版本
90
+ When: 当
91
+ Worker: 线程
92
+ active: 活动中
93
+ idle: 闲置
94
+ Metrics: 指标
95
+ NoDataFound: 无数据
96
+ TotalExecutionTime: 总执行时间
97
+ AvgExecutionTime: 平均执行时间
98
+ Context: 上下文
99
+ NoJobMetricsFound: 无任务相关指标数据
100
+ Filter: 过滤
101
+ AnyJobContent: 任何任务内容
102
+ Profiles: 性能分析
103
+ Data: 数据
104
+ View: 查看
105
+ Token: 标记
106
+ ElapsedTime: 已用时间
@@ -1,5 +1,6 @@
1
1
  # elements like %{queue} are variables and should not be translated
2
- zh-tw: # <---- change this to your locale code
2
+ zh-TW: # <---- change this to your locale code
3
+ LanguageName: 臺灣話
3
4
  Dashboard: 資訊主頁
4
5
  Status: 狀態
5
6
  Time: 時間
@@ -7,6 +8,7 @@ zh-tw: # <---- change this to your locale code
7
8
  Realtime: 即時
8
9
  History: 歷史資料
9
10
  Busy: 忙碌
11
+ Utilization: 使用率
10
12
  Processed: 已處理
11
13
  Failed: 已失敗
12
14
  Scheduled: 已排程
@@ -25,26 +27,29 @@ zh-tw: # <---- change this to your locale code
25
27
  CurrentMessagesInQueue: 目前在<span class='title'>%{queue}</span>的工作
26
28
  Delete: 刪除
27
29
  AddToQueue: 增加至佇列
28
- AreYouSureDeleteJob: 你確定要刪除這個工作嗎?
29
- AreYouSureDeleteQueue: 你確定要刪除%{queue}這個佇列?
30
+ AreYouSureDeleteJob: 確定要刪除這個工作嗎?
31
+ AreYouSureDeleteQueue: 確定要刪除%{queue}佇列?這會刪除佇列裡的所有工作,佇列將會在有新工作時重新出現。
30
32
  Queues: 佇列
31
33
  Size: 容量
32
34
  Actions: 動作
33
35
  NextRetry: 下次重試
34
36
  RetryCount: 重試次數
35
37
  RetryNow: 馬上重試
38
+ Kill: 取消
36
39
  LastRetry: 最後一次重試
37
40
  OriginallyFailed: 原本已失敗
38
41
  AreYouSure: 你確定?
39
- DeleteAll: 刪除全部
40
- RetryAll: 重試全部
41
- NoRetriesFound: 沒有發現可重試
42
+ DeleteAll: 全部刪除
43
+ RetryAll: 全部重試
44
+ KillAll: 全部取消
45
+ NoRetriesFound: 找無可重試的工作
42
46
  Error: 錯誤
47
+ ErrorBacktrace: 錯誤的回調追踨
43
48
  ErrorClass: 錯誤類別
44
49
  ErrorMessage: 錯誤訊息
45
- ErrorBacktrace: 錯誤的回調追踨
50
+ ErrorBacktrace: 詳細錯誤訊息
46
51
  GoBack: ← 返回
47
- NoScheduledFound: 沒有發現已排程的工作
52
+ NoScheduledFound: 找無已排程的工作
48
53
  When: 當
49
54
  ScheduledJobs: 已排程的工作
50
55
  idle: 閒置
@@ -59,10 +64,39 @@ zh-tw: # <---- change this to your locale code
59
64
  ThreeMonths: 三個月
60
65
  SixMonths: 六個月
61
66
  Failures: 失敗
62
- DeadJobs: 停滯工作
67
+ GoBack: ← 返回
68
+ History: 歷史資料
69
+ Job: 工作
70
+ Jobs: 工作
71
+ LastRetry: 最後一次重試
72
+ LivePoll: 即時輪詢
73
+ MemoryUsage: 記憶體使用量
74
+ Namespace: 命名空間
75
+ NextRetry: 下次重試
63
76
  NoDeadJobsFound: 沒有發現任何停滯的工作
64
77
  Dead: 停滯
78
+ Process: 程序
65
79
  Processes: 處理中
80
+ Name: 名稱
66
81
  Thread: 執行緒
67
82
  Threads: 執行緒
68
83
  Jobs: 工作
84
+ Paused: 已暫停
85
+ Stop: 強制暫停
86
+ Quiet: 暫停
87
+ StopAll: 全部強制暫停
88
+ QuietAll: 全部暫停
89
+ PollingInterval: 輪詢週期
90
+ Plugins: 套件
91
+ NotYetEnqueued: 尚未進入佇列
92
+ CreatedAt: 建立時間
93
+ BackToApp: 回首頁
94
+ Latency: 延時
95
+ Pause: 暫停
96
+ Unpause: 取消暫停
97
+ Metrics: 計量
98
+ NoDataFound: 找無資料
99
+ TotalExecutionTime: 總執行時間
100
+ AvgExecutionTime: 平均執行時間
101
+ Context: 上下文
102
+ NoJobMetricsFound: 找無工作相關計量資料
@@ -1,20 +1,32 @@
1
- <div class="navbar navbar-fixed-bottom navbar-inverse ltr">
2
- <div class="navbar-inner">
3
- <div class="container text-center">
4
- <ul class="nav">
5
- <li>
6
- <p class="navbar-text product-version"><%= product_version %></p>
7
- </li>
8
- <li>
9
- <p class="navbar-text redis-url" title="<%= redis_connection_and_namespace %>"><%= redis_connection_and_namespace %></p>
10
- </li>
11
- <li>
12
- <p 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>
16
- </li>
17
- </ul>
18
- </div>
1
+ <footer>
2
+ <div class="container">
3
+ <ul class="nav">
4
+ <li>
5
+ <p><b><%= product_version %></b></p>
6
+ </li>
7
+ <li>
8
+ <p title="<%= redis_url %>"><%= redis_url %></p>
9
+ </li>
10
+ <li>
11
+ <p id="serverUtcTime"><%= server_utc_time %></p>
12
+ </li>
13
+ <li>
14
+ <p><a rel=help href="https://github.com/sidekiq/sidekiq/wiki">docs</a></p>
15
+ </li>
16
+ <li>
17
+ <form id="locale-form" action="<%= root_path %>change_locale" method="post">
18
+ <%= csrf_tag %>
19
+ <select id="locale-select" aria-label="<%= t("Language") %>" class="form-control" name="locale">
20
+ <% available_locales.each do |locale_option| %>
21
+ <% if locale_option == locale %>
22
+ <option selected value="<%= locale_option %>"><%= language_name(locale_option) %></option>
23
+ <% else %>
24
+ <option value="<%= locale_option %>"><%= language_name(locale_option) %></option>
25
+ <% end %>
26
+ <% end %>
27
+ </select>
28
+ </form>
29
+ </li>
30
+ </ul>
19
31
  </div>
20
- </div>
32
+ </footer>
@@ -1,88 +1,107 @@
1
- <header>
2
- <h3><%= t('Job') %></h3>
3
- </header>
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">
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
- <code><%= job.display_class %></code>
18
- </td>
19
- </tr>
20
- <tr>
21
- <th><%= t('Arguments') %></th>
22
- <td>
23
- <code class="code-wrap">
24
- <!-- We don't want to truncate any job arguments when viewing a single job's status page -->
25
- <div class="args-extended"><%= display_args(job.display_args, nil) %></div>
26
- </code>
27
- </td>
28
- </tr>
29
- <tr>
30
- <th>JID</th>
31
- <td>
32
- <code><%= job.jid %></code>
33
- </td>
34
- </tr>
35
- <tr>
36
- <th><%= t('CreatedAt') %></th>
37
- <td><%= relative_time(job.created_at) %></td>
38
- </tr>
39
- <tr>
40
- <th><%= t('Enqueued') %></th>
41
- <td><%= (enqueued_at = job.enqueued_at) ? relative_time(enqueued_at) : t('NotYetEnqueued') %></td>
42
- </tr>
43
- <% unless retry_extra_items(job).empty? %>
6
+ <div class="table_container">
7
+ <table>
8
+ <tbody>
44
9
  <tr>
45
- <th><%= t('Extras') %></th>
10
+ <th><%= t('Queue') %></th>
46
11
  <td>
47
- <code>
48
- <%= 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>
49
28
  </code>
50
29
  </td>
51
30
  </tr>
52
- <% end %>
53
- <% if type == :retry %>
54
- <% 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? %>
55
54
  <tr>
56
- <th><%= t('RetryCount') %></th>
57
- <td><%= job['retry_count'] %></td>
55
+ <th><%= t('Extras') %></th>
56
+ <td>
57
+ <code>
58
+ <%= retry_extra_items(job).inspect %>
59
+ </code>
60
+ </td>
58
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(job.retried_at) %></td>
72
+ </tr>
73
+ <% else %>
74
+ <tr>
75
+ <th><%= t('OriginallyFailed') %></th>
76
+ <td><%= relative_time(job.failed_at) %></td>
77
+ </tr>
78
+ <% end %>
59
79
  <tr>
60
- <th><%= t('LastRetry') %></th>
61
- <td><%= relative_time(Time.at(job['retried_at'])) %></td>
80
+ <th><%= t('NextRetry') %></th>
81
+ <td><%= relative_time(job.at) %></td>
62
82
  </tr>
63
- <% else %>
83
+ <% end %>
84
+ <% if type == :scheduled %>
64
85
  <tr>
65
- <th><%= t('OriginallyFailed') %></th>
66
- <td><%= relative_time(Time.at(job['failed_at'])) %></td>
86
+ <th><%= t('Scheduled') %></th>
87
+ <td><%= relative_time(job.at) %></td>
67
88
  </tr>
68
89
  <% end %>
69
- <tr>
70
- <th><%= t('NextRetry') %></th>
71
- <td><%= relative_time(job.at) %></td>
72
- </tr>
73
- <% end %>
74
- <% if type == :scheduled %>
75
- <tr>
76
- <th><%= t('Scheduled') %></th>
77
- <td><%= relative_time(job.at) %></td>
78
- </tr>
79
- <% end %>
80
- <% if type == :dead %>
81
- <tr>
82
- <th><%= t('LastRetry') %></th>
83
- <td><%= relative_time(job.at) if job['retry_count'] %></td>
84
- </tr>
85
- <% end %>
86
- </tbody>
87
- </table>
88
- </div>
90
+ <% if type == :dead %>
91
+ <tr>
92
+ <th><%= t('LastRetry') %></th>
93
+ <td><%= relative_time(job.at) if job['retry_count'] %></td>
94
+ </tr>
95
+ <% end %>
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>
@@ -0,0 +1,15 @@
1
+ <div class="filter">
2
+ <form id="metrics-form" class="form-inline" action="<%= path %>" method="get">
3
+ <label for="substr"><%= t('Filter') %></label>
4
+ <input id="class-filter" class="form-control" type="text" name="substr" placeholder="<%= t('Name') %>" value="<%= h url_params("substr") %>">
5
+ <select id="period-selector" class="form-control" name="period">
6
+ <% periods.each_key do |code| %>
7
+ <% if code == period %>
8
+ <option selected value="<%= code %>"><%= code %></option>
9
+ <% else %>
10
+ <option value="<%= code %>"><%= code %></option>
11
+ <% end %>
12
+ <% end %>
13
+ </select>
14
+ </form>
15
+ </div>
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="collapse" 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" role="navigation" 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,23 +1,27 @@
1
+
1
2
  <% if @total_size > @count %>
2
- <ul class="pagination pull-right flip">
3
- <li class="<%= 'disabled' if @current_page == 1 %>">
4
- <a href="<%= url %>?page=1">&laquo;</a>
5
- </li>
6
- <% if @current_page > 1 %>
7
- <li>
8
- <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>
9
7
  </li>
10
- <% end %>
11
- <li class="disabled">
12
- <a href="<%= url %>?<%= qparams(page: @current_page) %>"><%= @current_page %></a>
13
- </li>
14
- <% if @total_size > @current_page * @count %>
15
- <li>
16
- <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>
17
15
  </li>
18
- <% end %>
19
- <li class="<%= 'disabled' if @total_size <= @current_page * @count %>">
20
- <a href="<%= url %>?<%= qparams(page: (@total_size.to_f / @count).ceil) %>">&raquo;</a>
21
- </li>
22
- </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>
23
26
  <% end %>
27
+
@@ -1,7 +1,4 @@
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 %>
1
+ <% if pollable? %>
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>
7
4
  <% end %>
@@ -1,40 +1,40 @@
1
- <ul class="list-unstyled summary row">
2
- <li class="processed col-sm-1">
3
- <span class="count"><%= number_with_delimiter(stats.processed) %></span>
1
+ <div class="cards-container">
2
+ <article>
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">
7
- <span class="count"><%= number_with_delimiter(stats.failed) %></span>
5
+ </article>
6
+ <article>
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
- <span class="count"><%= number_with_delimiter(workers.size) %></span>
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
- <span class="count"><%= number_with_delimiter(stats.enqueued) %></span>
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
- <span class="count"><%= number_with_delimiter(stats.retry_size) %></span>
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
- <span class="count"><%= number_with_delimiter(stats.scheduled_size) %></span>
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
- <span class="count"><%= number_with_delimiter(stats.dead_size) %></span>
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>