sidekiq 0.10.0 → 7.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (234) hide show
  1. checksums.yaml +7 -0
  2. data/Changes.md +2047 -0
  3. data/LICENSE.txt +9 -0
  4. data/README.md +73 -27
  5. data/bin/sidekiq +25 -9
  6. data/bin/sidekiqload +247 -0
  7. data/bin/sidekiqmon +11 -0
  8. data/lib/generators/sidekiq/job_generator.rb +57 -0
  9. data/lib/generators/sidekiq/templates/job.rb.erb +9 -0
  10. data/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
  11. data/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
  12. data/lib/sidekiq/api.rb +1145 -0
  13. data/lib/sidekiq/capsule.rb +127 -0
  14. data/lib/sidekiq/cli.rb +348 -109
  15. data/lib/sidekiq/client.rb +241 -41
  16. data/lib/sidekiq/component.rb +68 -0
  17. data/lib/sidekiq/config.rb +287 -0
  18. data/lib/sidekiq/deploy.rb +62 -0
  19. data/lib/sidekiq/embedded.rb +61 -0
  20. data/lib/sidekiq/fetch.rb +88 -0
  21. data/lib/sidekiq/job.rb +374 -0
  22. data/lib/sidekiq/job_logger.rb +51 -0
  23. data/lib/sidekiq/job_retry.rb +300 -0
  24. data/lib/sidekiq/job_util.rb +107 -0
  25. data/lib/sidekiq/launcher.rb +271 -0
  26. data/lib/sidekiq/logger.rb +131 -0
  27. data/lib/sidekiq/manager.rb +96 -103
  28. data/lib/sidekiq/metrics/query.rb +153 -0
  29. data/lib/sidekiq/metrics/shared.rb +95 -0
  30. data/lib/sidekiq/metrics/tracking.rb +136 -0
  31. data/lib/sidekiq/middleware/chain.rb +149 -38
  32. data/lib/sidekiq/middleware/current_attributes.rb +95 -0
  33. data/lib/sidekiq/middleware/i18n.rb +42 -0
  34. data/lib/sidekiq/middleware/modules.rb +21 -0
  35. data/lib/sidekiq/monitor.rb +146 -0
  36. data/lib/sidekiq/paginator.rb +55 -0
  37. data/lib/sidekiq/processor.rb +246 -61
  38. data/lib/sidekiq/rails.rb +60 -13
  39. data/lib/sidekiq/redis_client_adapter.rb +95 -0
  40. data/lib/sidekiq/redis_connection.rb +68 -15
  41. data/lib/sidekiq/ring_buffer.rb +29 -0
  42. data/lib/sidekiq/scheduled.rb +236 -0
  43. data/lib/sidekiq/sd_notify.rb +149 -0
  44. data/lib/sidekiq/systemd.rb +24 -0
  45. data/lib/sidekiq/testing/inline.rb +30 -0
  46. data/lib/sidekiq/testing.rb +304 -10
  47. data/lib/sidekiq/transaction_aware_client.rb +44 -0
  48. data/lib/sidekiq/version.rb +4 -1
  49. data/lib/sidekiq/web/action.rb +93 -0
  50. data/lib/sidekiq/web/application.rb +447 -0
  51. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  52. data/lib/sidekiq/web/helpers.rb +370 -0
  53. data/lib/sidekiq/web/router.rb +104 -0
  54. data/lib/sidekiq/web.rb +143 -74
  55. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  56. data/lib/sidekiq.rb +120 -73
  57. data/sidekiq.gemspec +26 -23
  58. data/web/assets/images/apple-touch-icon.png +0 -0
  59. data/web/assets/images/favicon.ico +0 -0
  60. data/web/assets/images/logo.png +0 -0
  61. data/web/assets/images/status.png +0 -0
  62. data/web/assets/javascripts/application.js +162 -3
  63. data/web/assets/javascripts/base-charts.js +106 -0
  64. data/web/assets/javascripts/chart.min.js +13 -0
  65. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  66. data/web/assets/javascripts/dashboard-charts.js +168 -0
  67. data/web/assets/javascripts/dashboard.js +59 -0
  68. data/web/assets/javascripts/metrics.js +264 -0
  69. data/web/assets/stylesheets/application-dark.css +147 -0
  70. data/web/assets/stylesheets/application-rtl.css +153 -0
  71. data/web/assets/stylesheets/application.css +720 -7
  72. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  73. data/web/assets/stylesheets/bootstrap.css +5 -0
  74. data/web/locales/ar.yml +87 -0
  75. data/web/locales/cs.yml +78 -0
  76. data/web/locales/da.yml +75 -0
  77. data/web/locales/de.yml +81 -0
  78. data/web/locales/el.yml +87 -0
  79. data/web/locales/en.yml +101 -0
  80. data/web/locales/es.yml +86 -0
  81. data/web/locales/fa.yml +80 -0
  82. data/web/locales/fr.yml +99 -0
  83. data/web/locales/gd.yml +99 -0
  84. data/web/locales/he.yml +80 -0
  85. data/web/locales/hi.yml +75 -0
  86. data/web/locales/it.yml +69 -0
  87. data/web/locales/ja.yml +91 -0
  88. data/web/locales/ko.yml +68 -0
  89. data/web/locales/lt.yml +83 -0
  90. data/web/locales/nb.yml +77 -0
  91. data/web/locales/nl.yml +68 -0
  92. data/web/locales/pl.yml +59 -0
  93. data/web/locales/pt-br.yml +96 -0
  94. data/web/locales/pt.yml +67 -0
  95. data/web/locales/ru.yml +83 -0
  96. data/web/locales/sv.yml +68 -0
  97. data/web/locales/ta.yml +75 -0
  98. data/web/locales/uk.yml +77 -0
  99. data/web/locales/ur.yml +80 -0
  100. data/web/locales/vi.yml +83 -0
  101. data/web/locales/zh-cn.yml +95 -0
  102. data/web/locales/zh-tw.yml +102 -0
  103. data/web/views/_footer.erb +23 -0
  104. data/web/views/_job_info.erb +105 -0
  105. data/web/views/_metrics_period_select.erb +12 -0
  106. data/web/views/_nav.erb +52 -0
  107. data/web/views/_paging.erb +25 -0
  108. data/web/views/_poll_link.erb +4 -0
  109. data/web/views/_status.erb +4 -0
  110. data/web/views/_summary.erb +40 -0
  111. data/web/views/busy.erb +148 -0
  112. data/web/views/dashboard.erb +115 -0
  113. data/web/views/dead.erb +34 -0
  114. data/web/views/filtering.erb +7 -0
  115. data/web/views/layout.erb +42 -0
  116. data/web/views/metrics.erb +82 -0
  117. data/web/views/metrics_for_job.erb +68 -0
  118. data/web/views/morgue.erb +74 -0
  119. data/web/views/queue.erb +55 -0
  120. data/web/views/queues.erb +40 -0
  121. data/web/views/retries.erb +79 -0
  122. data/web/views/retry.erb +34 -0
  123. data/web/views/scheduled.erb +56 -0
  124. data/web/views/scheduled_job_info.erb +8 -0
  125. metadata +159 -237
  126. data/.gitignore +0 -6
  127. data/.rvmrc +0 -4
  128. data/COMM-LICENSE +0 -75
  129. data/Gemfile +0 -10
  130. data/LICENSE +0 -22
  131. data/Rakefile +0 -9
  132. data/TODO.md +0 -1
  133. data/bin/client +0 -7
  134. data/bin/sidekiqctl +0 -43
  135. data/config.ru +0 -8
  136. data/examples/chef/cookbooks/sidekiq/README.rdoc +0 -11
  137. data/examples/chef/cookbooks/sidekiq/recipes/default.rb +0 -55
  138. data/examples/chef/cookbooks/sidekiq/templates/default/monitrc.conf.erb +0 -8
  139. data/examples/chef/cookbooks/sidekiq/templates/default/sidekiq.erb +0 -219
  140. data/examples/chef/cookbooks/sidekiq/templates/default/sidekiq.yml.erb +0 -22
  141. data/examples/config.yml +0 -9
  142. data/examples/monitrc.conf +0 -6
  143. data/examples/por.rb +0 -27
  144. data/examples/scheduling.rb +0 -37
  145. data/examples/sinkiq.rb +0 -57
  146. data/examples/web-ui.png +0 -0
  147. data/lib/sidekiq/capistrano.rb +0 -32
  148. data/lib/sidekiq/extensions/action_mailer.rb +0 -26
  149. data/lib/sidekiq/extensions/active_record.rb +0 -27
  150. data/lib/sidekiq/extensions/generic_proxy.rb +0 -21
  151. data/lib/sidekiq/middleware/client/unique_jobs.rb +0 -32
  152. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  153. data/lib/sidekiq/middleware/server/exception_handler.rb +0 -38
  154. data/lib/sidekiq/middleware/server/failure_jobs.rb +0 -24
  155. data/lib/sidekiq/middleware/server/logging.rb +0 -27
  156. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -59
  157. data/lib/sidekiq/middleware/server/unique_jobs.rb +0 -15
  158. data/lib/sidekiq/retry.rb +0 -57
  159. data/lib/sidekiq/util.rb +0 -61
  160. data/lib/sidekiq/worker.rb +0 -37
  161. data/myapp/.gitignore +0 -15
  162. data/myapp/Capfile +0 -5
  163. data/myapp/Gemfile +0 -19
  164. data/myapp/Gemfile.lock +0 -143
  165. data/myapp/Rakefile +0 -7
  166. data/myapp/app/controllers/application_controller.rb +0 -3
  167. data/myapp/app/controllers/work_controller.rb +0 -38
  168. data/myapp/app/helpers/application_helper.rb +0 -2
  169. data/myapp/app/mailers/.gitkeep +0 -0
  170. data/myapp/app/mailers/user_mailer.rb +0 -9
  171. data/myapp/app/models/.gitkeep +0 -0
  172. data/myapp/app/models/post.rb +0 -5
  173. data/myapp/app/views/layouts/application.html.erb +0 -14
  174. data/myapp/app/views/user_mailer/greetings.html.erb +0 -3
  175. data/myapp/app/views/work/index.html.erb +0 -1
  176. data/myapp/app/workers/hard_worker.rb +0 -9
  177. data/myapp/config/application.rb +0 -59
  178. data/myapp/config/boot.rb +0 -6
  179. data/myapp/config/database.yml +0 -25
  180. data/myapp/config/deploy.rb +0 -15
  181. data/myapp/config/environment.rb +0 -5
  182. data/myapp/config/environments/development.rb +0 -38
  183. data/myapp/config/environments/production.rb +0 -67
  184. data/myapp/config/environments/test.rb +0 -37
  185. data/myapp/config/initializers/backtrace_silencers.rb +0 -7
  186. data/myapp/config/initializers/inflections.rb +0 -15
  187. data/myapp/config/initializers/mime_types.rb +0 -5
  188. data/myapp/config/initializers/secret_token.rb +0 -7
  189. data/myapp/config/initializers/session_store.rb +0 -8
  190. data/myapp/config/initializers/sidekiq.rb +0 -6
  191. data/myapp/config/initializers/wrap_parameters.rb +0 -14
  192. data/myapp/config/locales/en.yml +0 -5
  193. data/myapp/config/routes.rb +0 -10
  194. data/myapp/config.ru +0 -4
  195. data/myapp/db/migrate/20120123214055_create_posts.rb +0 -10
  196. data/myapp/db/seeds.rb +0 -7
  197. data/myapp/lib/assets/.gitkeep +0 -0
  198. data/myapp/lib/tasks/.gitkeep +0 -0
  199. data/myapp/log/.gitkeep +0 -0
  200. data/myapp/script/rails +0 -6
  201. data/test/config.yml +0 -9
  202. data/test/fake_env.rb +0 -0
  203. data/test/helper.rb +0 -15
  204. data/test/test_cli.rb +0 -168
  205. data/test/test_client.rb +0 -105
  206. data/test/test_extensions.rb +0 -68
  207. data/test/test_manager.rb +0 -43
  208. data/test/test_middleware.rb +0 -92
  209. data/test/test_processor.rb +0 -32
  210. data/test/test_retry.rb +0 -83
  211. data/test/test_stats.rb +0 -78
  212. data/test/test_testing.rb +0 -65
  213. data/test/test_web.rb +0 -61
  214. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  215. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  216. data/web/assets/javascripts/vendor/bootstrap/bootstrap-alert.js +0 -91
  217. data/web/assets/javascripts/vendor/bootstrap/bootstrap-button.js +0 -98
  218. data/web/assets/javascripts/vendor/bootstrap/bootstrap-carousel.js +0 -154
  219. data/web/assets/javascripts/vendor/bootstrap/bootstrap-collapse.js +0 -136
  220. data/web/assets/javascripts/vendor/bootstrap/bootstrap-dropdown.js +0 -92
  221. data/web/assets/javascripts/vendor/bootstrap/bootstrap-modal.js +0 -210
  222. data/web/assets/javascripts/vendor/bootstrap/bootstrap-popover.js +0 -95
  223. data/web/assets/javascripts/vendor/bootstrap/bootstrap-scrollspy.js +0 -125
  224. data/web/assets/javascripts/vendor/bootstrap/bootstrap-tab.js +0 -130
  225. data/web/assets/javascripts/vendor/bootstrap/bootstrap-tooltip.js +0 -270
  226. data/web/assets/javascripts/vendor/bootstrap/bootstrap-transition.js +0 -51
  227. data/web/assets/javascripts/vendor/bootstrap/bootstrap-typeahead.js +0 -271
  228. data/web/assets/javascripts/vendor/bootstrap.js +0 -12
  229. data/web/assets/javascripts/vendor/jquery.js +0 -9266
  230. data/web/assets/stylesheets/vendor/bootstrap-responsive.css +0 -567
  231. data/web/assets/stylesheets/vendor/bootstrap.css +0 -3365
  232. data/web/views/index.slim +0 -62
  233. data/web/views/layout.slim +0 -24
  234. data/web/views/queue.slim +0 -11
@@ -0,0 +1,102 @@
1
+ # elements like %{queue} are variables and should not be translated
2
+ zh-tw: # <---- change this to your locale code
3
+ Dashboard: 資訊主頁
4
+ Status: 狀態
5
+ Time: 時間
6
+ Namespace: 命名空間
7
+ Realtime: 即時
8
+ History: 歷史資料
9
+ Busy: 忙碌
10
+ Utilization: 使用率
11
+ Processed: 已處理
12
+ Failed: 已失敗
13
+ Scheduled: 已排程
14
+ Retries: 重試
15
+ Enqueued: 已佇列
16
+ Worker: 工人
17
+ LivePoll: 即時輪詢
18
+ StopPolling: 停止輪詢
19
+ Queue: 佇列
20
+ Class: 類別
21
+ Job: 工作
22
+ Arguments: 參數
23
+ Extras: 額外的
24
+ Started: 已開始
25
+ ShowAll: 顯示全部
26
+ CurrentMessagesInQueue: 目前在<span class='title'>%{queue}</span>的工作
27
+ Delete: 刪除
28
+ AddToQueue: 增加至佇列
29
+ AreYouSureDeleteJob: 確定要刪除這個工作嗎?
30
+ AreYouSureDeleteQueue: 確定要刪除%{queue}佇列?這會刪除佇列裡的所有工作,佇列將會在有新工作時重新出現。
31
+ Queues: 佇列
32
+ Size: 容量
33
+ Actions: 動作
34
+ NextRetry: 下次重試
35
+ RetryCount: 重試次數
36
+ RetryNow: 馬上重試
37
+ Kill: 取消
38
+ LastRetry: 最後一次重試
39
+ OriginallyFailed: 原本已失敗
40
+ AreYouSure: 你確定?
41
+ DeleteAll: 全部刪除
42
+ RetryAll: 全部重試
43
+ KillAll: 全部取消
44
+ NoRetriesFound: 找無可重試的工作
45
+ Error: 錯誤
46
+ ErrorBacktrace: 錯誤的回調追踨
47
+ ErrorClass: 錯誤類別
48
+ ErrorMessage: 錯誤訊息
49
+ ErrorBacktrace: 詳細錯誤訊息
50
+ GoBack: ← 返回
51
+ NoScheduledFound: 找無已排程的工作
52
+ When: 當
53
+ ScheduledJobs: 已排程的工作
54
+ idle: 閒置
55
+ active: 活動中
56
+ Version: 版本
57
+ Connections: 連線
58
+ MemoryUsage: 記憶體使用量
59
+ PeakMemoryUsage: 尖峰記憶體使用量
60
+ Uptime: 上線時間 (天數)
61
+ OneWeek: 一週
62
+ OneMonth: 一個月
63
+ ThreeMonths: 三個月
64
+ SixMonths: 六個月
65
+ Failures: 失敗
66
+ GoBack: ← 返回
67
+ History: 歷史資料
68
+ Job: 工作
69
+ Jobs: 工作
70
+ LastRetry: 最後一次重試
71
+ LivePoll: 即時輪詢
72
+ MemoryUsage: 記憶體使用量
73
+ Namespace: 命名空間
74
+ NextRetry: 下次重試
75
+ NoDeadJobsFound: 沒有發現任何停滯的工作
76
+ Dead: 停滯
77
+ Process: 程序
78
+ Processes: 處理中
79
+ Name: 名稱
80
+ Thread: 執行緒
81
+ Threads: 執行緒
82
+ Jobs: 工作
83
+ Paused: 已暫停
84
+ Stop: 強制暫停
85
+ Quiet: 暫停
86
+ StopAll: 全部強制暫停
87
+ QuietAll: 全部暫停
88
+ PollingInterval: 輪詢週期
89
+ Plugins: 套件
90
+ NotYetEnqueued: 尚未進入佇列
91
+ CreatedAt: 建立時間
92
+ BackToApp: 回首頁
93
+ Latency: 延時
94
+ Pause: 暫停
95
+ Unpause: 取消暫停
96
+ Metrics: 計量
97
+ NoDataFound: 找無資料
98
+ TotalExecutionTime: 總執行時間
99
+ AvgExecutionTime: 平均執行時間
100
+ Context: 上下文
101
+ Bucket: 桶
102
+ NoJobMetricsFound: 找無工作相關計量資料
@@ -0,0 +1,23 @@
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_url %>"><%= redis_url %></p>
10
+ </li>
11
+ <li>
12
+ <p id="serverUtcTime" class="navbar-text server-utc-time"><%= server_utc_time %></p>
13
+ </li>
14
+ <li>
15
+ <p class="navbar-text"><a rel=help href="https://github.com/sidekiq/sidekiq/wiki">docs</a></p>
16
+ </li>
17
+ <li>
18
+ <p class="navbar-text"><a rel=external href="https://github.com/sidekiq/sidekiq/tree/main/web/locales"><%= locale %></a></p>
19
+ </li>
20
+ </ul>
21
+ </div>
22
+ </div>
23
+ </div>
@@ -0,0 +1,105 @@
1
+ <div class="header-container">
2
+ <h3><%= t('Job') %></h3>
3
+ </div>
4
+
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? %>
53
+ <tr>
54
+ <th><%= t('Extras') %></th>
55
+ <td>
56
+ <code>
57
+ <%= retry_extra_items(job).inspect %>
58
+ </code>
59
+ </td>
60
+ </tr>
61
+ <% end %>
62
+ <% if type == :retry %>
63
+ <% if job['retry_count'] && job['retry_count'] > 0 %>
64
+ <tr>
65
+ <th><%= t('RetryCount') %></th>
66
+ <td><%= job['retry_count'] %></td>
67
+ </tr>
68
+ <tr>
69
+ <th><%= t('LastRetry') %></th>
70
+ <td><%= relative_time(Time.at(job['retried_at'])) %></td>
71
+ </tr>
72
+ <% else %>
73
+ <tr>
74
+ <th><%= t('OriginallyFailed') %></th>
75
+ <td><%= relative_time(Time.at(job['failed_at'])) %></td>
76
+ </tr>
77
+ <% 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| %>
97
+ <tr>
98
+ <th><%= name %></th>
99
+ <td><%= value %></td>
100
+ </tr>
101
+ <% end %>
102
+ <% end %>
103
+ </tbody>
104
+ </table>
105
+ </div>
@@ -0,0 +1,12 @@
1
+ <div>
2
+ <select class="form-control" onchange="window.location.href = '<%= path %>?period=' + event.target.value">
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>
@@ -0,0 +1,52 @@
1
+ <div class="navbar navbar-default navbar-fixed-top">
2
+ <div class="container-fluid">
3
+ <div class="navbar-header" data-navbar="static">
4
+ <button type="button" class="navbar-toggle collapsed" data-toggle="navbar-menu" data-target="#navbar-menu">
5
+ <span class="icon-bar"></span>
6
+ <span class="icon-bar"></span>
7
+ <span class="icon-bar"></span>
8
+ </button>
9
+ <div class="navbar-toggle collapsed navbar-livereload">
10
+ <%= erb :_poll_link %>
11
+ <% if Sidekiq::Web.app_url %>
12
+ <a class="btn btn-inverse" href="<%= Sidekiq::Web.app_url %>"><%= t('BackToApp') %></a>
13
+ <% end %>
14
+ </div>
15
+ <a class="navbar-brand" href="<%= root_path %>">
16
+ <%= Sidekiq::NAME %>
17
+ <%= erb :_status %>
18
+ </a>
19
+ </div>
20
+
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| %>
24
+ <% if url == '' %>
25
+ <li class="<%= current_path == url ? 'active' : '' %>">
26
+ <a href="<%= root_path %><%= url %>"><%= t(title) %></a>
27
+ </li>
28
+ <% else %>
29
+ <li class="<%= current_path.start_with?(url) ? 'active' : '' %>">
30
+ <a href="<%= root_path %><%= url %>"><%= t(title) %></a>
31
+ </li>
32
+ <% end %>
33
+ <% end %>
34
+
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
+ <li class="navbar-livereload">
42
+ <div class="poll-wrapper">
43
+ <%= erb :_poll_link %>
44
+ <% if Sidekiq::Web.app_url %>
45
+ <a class="btn btn-inverse" href="<%= Sidekiq::Web.app_url %>"><%= t('BackToApp') %></a>
46
+ <% end %>
47
+ </div>
48
+ </li>
49
+ </ul>
50
+ </div>
51
+ </div>
52
+ </div>
@@ -0,0 +1,25 @@
1
+ <div>
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>
10
+ </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>
18
+ </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>
24
+ <% end %>
25
+ </div>
@@ -0,0 +1,4 @@
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>
4
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <span class="status">
2
+ <i class="status-sprite status-<%= current_status %>"></i>
3
+ <%= t(current_status) %>
4
+ </span>
@@ -0,0 +1,40 @@
1
+ <ul class="list-unstyled summary row">
2
+ <li class="processed col-sm-1">
3
+ <span id="txtProcessed" class="count"><%= number_with_delimiter(stats.processed) %></span>
4
+ <span class="desc"><%= t('Processed') %></span>
5
+ </li>
6
+ <li class="failed col-sm-1">
7
+ <span id="txtFailed" class="count"><%= number_with_delimiter(stats.failed) %></span>
8
+ <span class="desc"><%= t('Failed') %></span>
9
+ </li>
10
+ <li class="busy col-sm-1">
11
+ <a href="<%= root_path %>busy">
12
+ <span id="txtBusy" class="count"><%= number_with_delimiter(workset.size) %></span>
13
+ <span class="desc"><%= t('Busy') %></span>
14
+ </a>
15
+ </li>
16
+ <li class="enqueued col-sm-1">
17
+ <a href="<%= root_path %>queues">
18
+ <span id="txtEnqueued" class="count"><%= number_with_delimiter(stats.enqueued) %></span>
19
+ <span class="desc"><%= t('Enqueued') %></span>
20
+ </a>
21
+ </li>
22
+ <li class="retries col-sm-1">
23
+ <a href="<%= root_path %>retries">
24
+ <span id="txtRetries" class="count"><%= number_with_delimiter(stats.retry_size) %></span>
25
+ <span class="desc"><%= t('Retries') %></span>
26
+ </a>
27
+ </li>
28
+ <li class="scheduled col-sm-1">
29
+ <a href="<%= root_path %>scheduled">
30
+ <span id="txtScheduled" class="count"><%= number_with_delimiter(stats.scheduled_size) %></span>
31
+ <span class="desc"><%= t('Scheduled') %></span>
32
+ </a>
33
+ </li>
34
+ <li class="dead col-sm-1">
35
+ <a href="<%= root_path %>morgue">
36
+ <span id="txtDead" class="count"><%= number_with_delimiter(stats.dead_size) %></span>
37
+ <span class="desc"><%= t('Dead') %></span>
38
+ </a>
39
+ </li>
40
+ </ul>
@@ -0,0 +1,148 @@
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>
27
+ </div>
28
+ </div>
29
+
30
+ <div class="header-container">
31
+ <h1><%= t('Processes') %></h1>
32
+ <div>
33
+ <form method="POST" class="warning-messages">
34
+ <%= csrf_tag %>
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') %>"/>
38
+ </div>
39
+ </form>
40
+ </div>
41
+ </div>
42
+
43
+ <div class="table_container">
44
+ <table class="processes table table-hover table-bordered table-striped">
45
+ <thead>
46
+ <th><%= t('Name') %></th>
47
+ <th><%= t('Started') %></th>
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>
51
+ <th>&nbsp;</th>
52
+ </thead>
53
+ <% lead = processes.leader %>
54
+ <% sorted_processes.each do |process| %>
55
+ <tr>
56
+ <td class="box">
57
+ <%= "#{process['hostname']}:#{process['pid']}" %>
58
+ <span class="label label-success"><%= process.tag %></span>
59
+ <% process.labels.each do |label| %>
60
+ <span class="label label-info"><%= label %></span>
61
+ <% end %>
62
+ <% if process.embedded? %>
63
+ <span class="label label-default">embedded</span>
64
+ <% end %>
65
+ <% if process.stopping? %>
66
+ <span class="label label-danger">quiet</span>
67
+ <% end %>
68
+ <% if process.identity == lead %>
69
+ <span class="label label-warning">leader</span>
70
+ <% end %>
71
+ <br>
72
+ <b><%= "#{t('Queues')}: " %></b>
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 %>
87
+ </td>
88
+ <td><%= relative_time(Time.at(process['started_at'])) %></td>
89
+ <td><%= format_memory(process['rss'].to_i) %></td>
90
+ <td><%= process['concurrency'] %></td>
91
+ <td><%= process['busy'] %></td>
92
+ <td>
93
+ <% unless process.embedded? %>
94
+ <form method="POST">
95
+ <%= csrf_tag %>
96
+ <input type="hidden" name="identity" value="<%= process['identity'] %>"/>
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>
102
+ </form>
103
+ <% end %>
104
+ </td>
105
+ </tr>
106
+ <% end %>
107
+ </table>
108
+ </div>
109
+
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 %>
115
+ </div>
116
+
117
+ <div class="table_container">
118
+ <table class="workers table table-hover table-bordered table-striped">
119
+ <thead>
120
+ <th><%= t('Process') %></th>
121
+ <th><%= t('TID') %></th>
122
+ <th><%= t('JID') %></th>
123
+ <th><%= t('Queue') %></th>
124
+ <th><%= t('Job') %></th>
125
+ <th><%= t('Arguments') %></th>
126
+ <th><%= t('Started') %></th>
127
+ </thead>
128
+ <% @workset.each do |process, thread, msg| %>
129
+ <% job = Sidekiq::JobRecord.new(msg['payload']) %>
130
+ <tr>
131
+ <td><%= process %></td>
132
+ <td><%= thread %></td>
133
+ <td><%= job.jid %></td>
134
+ <td>
135
+ <a href="<%= root_path %>queues/<%= msg['queue'] %>"><%= msg['queue'] %></a>
136
+ </td>
137
+ <td>
138
+ <%= job.display_class %>
139
+ <%= display_tags(job, nil) %>
140
+ </td>
141
+ <td>
142
+ <div class="args"><%= display_args(job.display_args) %></div>
143
+ </td>
144
+ <td><%= relative_time(Time.at(msg['run_at'])) %></td>
145
+ </tr>
146
+ <% end %>
147
+ </table>
148
+ </div>
@@ -0,0 +1,115 @@
1
+ <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js"></script>
2
+ <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js"></script>
3
+ <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js"></script>
4
+ <script type="text/javascript" src="<%= root_path %>javascripts/dashboard-charts.js"></script>
5
+ <script type="text/javascript" src="<%= root_path %>javascripts/dashboard.js"></script>
6
+ <div class= "dashboard clearfix">
7
+ <h3 >
8
+ <%= t('Dashboard') %>
9
+ <span id="beacon" class="beacon">
10
+ <span class="ring"></span>
11
+ <span class="dot"></span>
12
+ </span>
13
+ </h3>
14
+ <div class="interval-slider ltr">
15
+ <span class="interval-slider-label"><%= t('PollingInterval') %>:</span>
16
+ <span id="sldr-text" class="current-interval">5 sec</span>
17
+ <br/>
18
+ <input id="sldr" type="range" min="2000" max="20000" step="1000" value="5000"/>
19
+ </div>
20
+ </div>
21
+
22
+ <div class="row chart">
23
+ <canvas id="realtime-chart"></canvas>
24
+ <script>
25
+ window.realtimeChart = new RealtimeChart(
26
+ document.getElementById("realtime-chart"),
27
+ <%= Sidekiq.dump_json({
28
+ processedLabel: t('Processed'),
29
+ failedLabel: t('Failed'),
30
+ labels: Array.new(50, ""),
31
+ processed: Array.new(50),
32
+ failed: Array.new(50),
33
+ updateUrl: "#{root_path}stats",
34
+ }) %>
35
+ )
36
+ </script>
37
+
38
+ <!-- start with a space in the legend so the height doesn't change when we add content dynamically -->
39
+ <div id="realtime-legend">&nbsp;</div>
40
+ <script>
41
+ realtimeChart.registerLegend(document.getElementById("realtime-legend"))
42
+ </script>
43
+ </div>
44
+
45
+ <div class="row header">
46
+ <div class="col-sm-4 pull-left flip">
47
+ <h3><%= t('History') %></h3>
48
+ </div>
49
+ </div>
50
+ <div class="row chart">
51
+ <div>
52
+ <a href="<%= root_path %>?days=7" class="history-graph <%= "active" if params[:days] == "7" %>"><%= t('OneWeek') %></a>
53
+ <a href="<%= root_path %>" class="history-graph <%= "active" if params[:days].nil? || params[:days] == "30" %>"><%= t('OneMonth') %></a>
54
+ <a href="<%= root_path %>?days=90" class="history-graph <%= "active" if params[:days] == "90" %>"><%= t('ThreeMonths') %></a>
55
+ <a href="<%= root_path %>?days=180" class="history-graph <%= "active" if params[:days] == "180" %>"><%= t('SixMonths') %></a>
56
+ </div>
57
+
58
+ <canvas id="history-chart"></canvas>
59
+ <script>
60
+ window.historyChart = new DashboardChart(
61
+ document.getElementById("history-chart"),
62
+ <%= Sidekiq.dump_json({
63
+ processedLabel: t('Processed'),
64
+ failedLabel: t('Failed'),
65
+ processed: @processed_history.to_a.reverse,
66
+ failed: @failed_history.to_a.reverse,
67
+ }) %>
68
+ )
69
+ </script>
70
+ </div>
71
+
72
+ <br/>
73
+ <div class="row header">
74
+ <div class="col-sm-4 pull-left flip">
75
+ <h3>Redis</h3>
76
+ </div>
77
+ </div>
78
+ <div class="stats-wrapper">
79
+ <div class="stats-container">
80
+ <% if @redis_info.fetch("redis_version", nil) %>
81
+ <div class="stat">
82
+ <h3 id="redis_version"><%= @redis_info.fetch("redis_version") %></h3>
83
+ <p><%= t('Version') %></p>
84
+ </div>
85
+ <% end %>
86
+
87
+ <% if @redis_info.fetch("uptime_in_days", nil) %>
88
+ <div class="stat">
89
+ <h3 id="uptime_in_days"><%= @redis_info.fetch("uptime_in_days") %></h3>
90
+ <p><%= t('Uptime') %></p>
91
+ </div>
92
+ <% end %>
93
+
94
+ <% if @redis_info.fetch("connected_clients", nil) %>
95
+ <div class="stat">
96
+ <h3 id="connected_clients"><%= @redis_info.fetch("connected_clients") %></h3>
97
+ <p><%= t('Connections') %></p>
98
+ </div>
99
+ <% end %>
100
+
101
+ <% if @redis_info.fetch("used_memory_human", nil) %>
102
+ <div class="stat">
103
+ <h3 id="used_memory_human"><%= @redis_info.fetch("used_memory_human") %></h3>
104
+ <p><%= t('MemoryUsage') %></p>
105
+ </div>
106
+ <% end %>
107
+
108
+ <% if @redis_info.fetch("used_memory_peak_human", nil) %>
109
+ <div class="stat">
110
+ <h3 id="used_memory_peak_human"><%= @redis_info.fetch("used_memory_peak_human") %></h3>
111
+ <p><%= t('PeakMemoryUsage') %></p>
112
+ </div>
113
+ <% end %>
114
+ </div>
115
+ </div>