mini-clean-lib 0.0.1

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 (151) hide show
  1. checksums.yaml +7 -0
  2. data/mini-clean-lib.gemspec +12 -0
  3. data/sidekiq-8.1.6/Changes.md +2515 -0
  4. data/sidekiq-8.1.6/LICENSE.txt +9 -0
  5. data/sidekiq-8.1.6/README.md +124 -0
  6. data/sidekiq-8.1.6/bin/kiq +17 -0
  7. data/sidekiq-8.1.6/bin/lint-herb +13 -0
  8. data/sidekiq-8.1.6/bin/multi_queue_bench +271 -0
  9. data/sidekiq-8.1.6/bin/sidekiq +37 -0
  10. data/sidekiq-8.1.6/bin/sidekiqload +256 -0
  11. data/sidekiq-8.1.6/bin/sidekiqmon +11 -0
  12. data/sidekiq-8.1.6/bin/webload +69 -0
  13. data/sidekiq-8.1.6/lib/active_job/queue_adapters/sidekiq_adapter.rb +124 -0
  14. data/sidekiq-8.1.6/lib/generators/sidekiq/job_generator.rb +71 -0
  15. data/sidekiq-8.1.6/lib/generators/sidekiq/templates/job.rb.erb +9 -0
  16. data/sidekiq-8.1.6/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
  17. data/sidekiq-8.1.6/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
  18. data/sidekiq-8.1.6/lib/sidekiq/api.rb +1466 -0
  19. data/sidekiq-8.1.6/lib/sidekiq/capsule.rb +135 -0
  20. data/sidekiq-8.1.6/lib/sidekiq/cli.rb +433 -0
  21. data/sidekiq-8.1.6/lib/sidekiq/client.rb +306 -0
  22. data/sidekiq-8.1.6/lib/sidekiq/component.rb +132 -0
  23. data/sidekiq-8.1.6/lib/sidekiq/config.rb +316 -0
  24. data/sidekiq-8.1.6/lib/sidekiq/deploy.rb +64 -0
  25. data/sidekiq-8.1.6/lib/sidekiq/embedded.rb +64 -0
  26. data/sidekiq-8.1.6/lib/sidekiq/fetch.rb +89 -0
  27. data/sidekiq-8.1.6/lib/sidekiq/iterable_job.rb +56 -0
  28. data/sidekiq-8.1.6/lib/sidekiq/job/interrupt_handler.rb +24 -0
  29. data/sidekiq-8.1.6/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
  30. data/sidekiq-8.1.6/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
  31. data/sidekiq-8.1.6/lib/sidekiq/job/iterable/enumerators.rb +135 -0
  32. data/sidekiq-8.1.6/lib/sidekiq/job/iterable.rb +322 -0
  33. data/sidekiq-8.1.6/lib/sidekiq/job.rb +400 -0
  34. data/sidekiq-8.1.6/lib/sidekiq/job_logger.rb +54 -0
  35. data/sidekiq-8.1.6/lib/sidekiq/job_retry.rb +332 -0
  36. data/sidekiq-8.1.6/lib/sidekiq/job_util.rb +113 -0
  37. data/sidekiq-8.1.6/lib/sidekiq/launcher.rb +283 -0
  38. data/sidekiq-8.1.6/lib/sidekiq/loader.rb +57 -0
  39. data/sidekiq-8.1.6/lib/sidekiq/logger.rb +87 -0
  40. data/sidekiq-8.1.6/lib/sidekiq/manager.rb +134 -0
  41. data/sidekiq-8.1.6/lib/sidekiq/metrics/query.rb +184 -0
  42. data/sidekiq-8.1.6/lib/sidekiq/metrics/shared.rb +109 -0
  43. data/sidekiq-8.1.6/lib/sidekiq/metrics/tracking.rb +153 -0
  44. data/sidekiq-8.1.6/lib/sidekiq/middleware/chain.rb +207 -0
  45. data/sidekiq-8.1.6/lib/sidekiq/middleware/current_attributes.rb +120 -0
  46. data/sidekiq-8.1.6/lib/sidekiq/middleware/i18n.rb +44 -0
  47. data/sidekiq-8.1.6/lib/sidekiq/middleware/modules.rb +23 -0
  48. data/sidekiq-8.1.6/lib/sidekiq/monitor.rb +143 -0
  49. data/sidekiq-8.1.6/lib/sidekiq/paginator.rb +74 -0
  50. data/sidekiq-8.1.6/lib/sidekiq/processor.rb +298 -0
  51. data/sidekiq-8.1.6/lib/sidekiq/profiler.rb +73 -0
  52. data/sidekiq-8.1.6/lib/sidekiq/rails.rb +63 -0
  53. data/sidekiq-8.1.6/lib/sidekiq/redis_client_adapter.rb +117 -0
  54. data/sidekiq-8.1.6/lib/sidekiq/redis_connection.rb +115 -0
  55. data/sidekiq-8.1.6/lib/sidekiq/ring_buffer.rb +32 -0
  56. data/sidekiq-8.1.6/lib/sidekiq/scheduled.rb +235 -0
  57. data/sidekiq-8.1.6/lib/sidekiq/sd_notify.rb +149 -0
  58. data/sidekiq-8.1.6/lib/sidekiq/systemd.rb +26 -0
  59. data/sidekiq-8.1.6/lib/sidekiq/test_api.rb +331 -0
  60. data/sidekiq-8.1.6/lib/sidekiq/testing/inline.rb +2 -0
  61. data/sidekiq-8.1.6/lib/sidekiq/testing.rb +3 -0
  62. data/sidekiq-8.1.6/lib/sidekiq/transaction_aware_client.rb +59 -0
  63. data/sidekiq-8.1.6/lib/sidekiq/tui/controls.rb +53 -0
  64. data/sidekiq-8.1.6/lib/sidekiq/tui/filtering.rb +53 -0
  65. data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/base_tab.rb +204 -0
  66. data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/busy.rb +118 -0
  67. data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/dead.rb +19 -0
  68. data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/home.rb +144 -0
  69. data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/metrics.rb +131 -0
  70. data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/queues.rb +95 -0
  71. data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/retries.rb +19 -0
  72. data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/scheduled.rb +19 -0
  73. data/sidekiq-8.1.6/lib/sidekiq/tui/tabs/set_tab.rb +96 -0
  74. data/sidekiq-8.1.6/lib/sidekiq/tui/tabs.rb +15 -0
  75. data/sidekiq-8.1.6/lib/sidekiq/tui.rb +382 -0
  76. data/sidekiq-8.1.6/lib/sidekiq/version.rb +10 -0
  77. data/sidekiq-8.1.6/lib/sidekiq/web/action.rb +178 -0
  78. data/sidekiq-8.1.6/lib/sidekiq/web/application.rb +480 -0
  79. data/sidekiq-8.1.6/lib/sidekiq/web/config.rb +117 -0
  80. data/sidekiq-8.1.6/lib/sidekiq/web/helpers.rb +474 -0
  81. data/sidekiq-8.1.6/lib/sidekiq/web/router.rb +91 -0
  82. data/sidekiq-8.1.6/lib/sidekiq/web.rb +140 -0
  83. data/sidekiq-8.1.6/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  84. data/sidekiq-8.1.6/lib/sidekiq.rb +161 -0
  85. data/sidekiq-8.1.6/sidekiq.gemspec +31 -0
  86. data/sidekiq-8.1.6/web/assets/images/apple-touch-icon.png +0 -0
  87. data/sidekiq-8.1.6/web/assets/images/favicon.ico +0 -0
  88. data/sidekiq-8.1.6/web/assets/images/logo.png +0 -0
  89. data/sidekiq-8.1.6/web/assets/images/status.png +0 -0
  90. data/sidekiq-8.1.6/web/assets/javascripts/application.js +204 -0
  91. data/sidekiq-8.1.6/web/assets/javascripts/base-charts.js +120 -0
  92. data/sidekiq-8.1.6/web/assets/javascripts/chart.min.js +13 -0
  93. data/sidekiq-8.1.6/web/assets/javascripts/chartjs-adapter-date-fns.min.js +7 -0
  94. data/sidekiq-8.1.6/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  95. data/sidekiq-8.1.6/web/assets/javascripts/dashboard-charts.js +194 -0
  96. data/sidekiq-8.1.6/web/assets/javascripts/dashboard.js +63 -0
  97. data/sidekiq-8.1.6/web/assets/javascripts/metrics.js +280 -0
  98. data/sidekiq-8.1.6/web/assets/stylesheets/style.css +776 -0
  99. data/sidekiq-8.1.6/web/locales/ar.yml +89 -0
  100. data/sidekiq-8.1.6/web/locales/cs.yml +80 -0
  101. data/sidekiq-8.1.6/web/locales/da.yml +77 -0
  102. data/sidekiq-8.1.6/web/locales/de.yml +83 -0
  103. data/sidekiq-8.1.6/web/locales/el.yml +89 -0
  104. data/sidekiq-8.1.6/web/locales/en.yml +110 -0
  105. data/sidekiq-8.1.6/web/locales/es.yml +109 -0
  106. data/sidekiq-8.1.6/web/locales/fa.yml +82 -0
  107. data/sidekiq-8.1.6/web/locales/fr.yml +100 -0
  108. data/sidekiq-8.1.6/web/locales/gd.yml +110 -0
  109. data/sidekiq-8.1.6/web/locales/he.yml +82 -0
  110. data/sidekiq-8.1.6/web/locales/hi.yml +77 -0
  111. data/sidekiq-8.1.6/web/locales/it.yml +109 -0
  112. data/sidekiq-8.1.6/web/locales/ja.yml +92 -0
  113. data/sidekiq-8.1.6/web/locales/ko.yml +70 -0
  114. data/sidekiq-8.1.6/web/locales/lt.yml +85 -0
  115. data/sidekiq-8.1.6/web/locales/nb.yml +79 -0
  116. data/sidekiq-8.1.6/web/locales/nl.yml +70 -0
  117. data/sidekiq-8.1.6/web/locales/pl.yml +61 -0
  118. data/sidekiq-8.1.6/web/locales/pt-BR.yml +97 -0
  119. data/sidekiq-8.1.6/web/locales/pt.yml +69 -0
  120. data/sidekiq-8.1.6/web/locales/ru.yml +85 -0
  121. data/sidekiq-8.1.6/web/locales/sv.yml +70 -0
  122. data/sidekiq-8.1.6/web/locales/ta.yml +77 -0
  123. data/sidekiq-8.1.6/web/locales/tr.yml +102 -0
  124. data/sidekiq-8.1.6/web/locales/uk.yml +102 -0
  125. data/sidekiq-8.1.6/web/locales/ur.yml +82 -0
  126. data/sidekiq-8.1.6/web/locales/vi.yml +85 -0
  127. data/sidekiq-8.1.6/web/locales/zh-CN.yml +107 -0
  128. data/sidekiq-8.1.6/web/locales/zh-TW.yml +103 -0
  129. data/sidekiq-8.1.6/web/views/_footer.html.erb +32 -0
  130. data/sidekiq-8.1.6/web/views/_job_info.html.erb +115 -0
  131. data/sidekiq-8.1.6/web/views/_metrics_period_select.html.erb +15 -0
  132. data/sidekiq-8.1.6/web/views/_nav.html.erb +45 -0
  133. data/sidekiq-8.1.6/web/views/_paging.html.erb +26 -0
  134. data/sidekiq-8.1.6/web/views/_poll_link.html.erb +4 -0
  135. data/sidekiq-8.1.6/web/views/_summary.html.erb +40 -0
  136. data/sidekiq-8.1.6/web/views/busy.html.erb +155 -0
  137. data/sidekiq-8.1.6/web/views/dashboard.html.erb +104 -0
  138. data/sidekiq-8.1.6/web/views/dead.html.erb +38 -0
  139. data/sidekiq-8.1.6/web/views/filtering.html.erb +6 -0
  140. data/sidekiq-8.1.6/web/views/layout.html.erb +26 -0
  141. data/sidekiq-8.1.6/web/views/metrics.html.erb +85 -0
  142. data/sidekiq-8.1.6/web/views/metrics_for_job.html.erb +58 -0
  143. data/sidekiq-8.1.6/web/views/morgue.html.erb +69 -0
  144. data/sidekiq-8.1.6/web/views/profiles.html.erb +43 -0
  145. data/sidekiq-8.1.6/web/views/queue.html.erb +57 -0
  146. data/sidekiq-8.1.6/web/views/queues.html.erb +46 -0
  147. data/sidekiq-8.1.6/web/views/retries.html.erb +77 -0
  148. data/sidekiq-8.1.6/web/views/retry.html.erb +39 -0
  149. data/sidekiq-8.1.6/web/views/scheduled.html.erb +64 -0
  150. data/sidekiq-8.1.6/web/views/scheduled_job_info.html.erb +8 -0
  151. metadata +190 -0
@@ -0,0 +1,115 @@
1
+ <section>
2
+ <header>
3
+ <h1><%= t('Job') %></h1>
4
+ </header>
5
+
6
+ <div class="table_container">
7
+ <table>
8
+ <tbody>
9
+ <tr>
10
+ <th><%= t('Queue') %></th>
11
+ <td>
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>
28
+ </code>
29
+ </td>
30
+ </tr>
31
+ <tr>
32
+ <th>JID</th>
33
+ <td>
34
+ <code><%= job.jid %></code>
35
+ </td>
36
+ </tr>
37
+ <% if (state = job.iterable_state) %>
38
+ <tr>
39
+ <th>Iteration</th>
40
+ <td>
41
+ <code>cursor=<%= h(state.cursor.inspect) %>; exec=<%= state.executions %>; rt=<%= number_with_delimiter(state.runtime, precision: 3) %>s</code>
42
+ </td>
43
+ </tr>
44
+ <% end %>
45
+ <% if job.bid %>
46
+ <tr>
47
+ <th>BID</th>
48
+ <td>
49
+ <a href="<%= root_path %>batches/<%= job.bid %>"><%= job.bid %></a>
50
+ </td>
51
+ </tr>
52
+ <% end %>
53
+ <tr>
54
+ <th><%= t('CreatedAt') %></th>
55
+ <td><%= relative_time(job.created_at) %></td>
56
+ </tr>
57
+ <tr>
58
+ <th><%= t('Enqueued') %></th>
59
+ <td><%= (enqueued_at = job.enqueued_at) ? relative_time(enqueued_at) : t('NotYetEnqueued') %></td>
60
+ </tr>
61
+ <% unless retry_extra_items(job).empty? %>
62
+ <tr>
63
+ <th><%= t('Extras') %></th>
64
+ <td>
65
+ <code>
66
+ <%= retry_extra_items(job).inspect %>
67
+ </code>
68
+ </td>
69
+ </tr>
70
+ <% end %>
71
+ <% if type == :retry %>
72
+ <% if job['retry_count'] && job['retry_count'] > 0 %>
73
+ <tr>
74
+ <th><%= t('RetryCount') %></th>
75
+ <td><%= job['retry_count'] %></td>
76
+ </tr>
77
+ <tr>
78
+ <th><%= t('LastRetry') %></th>
79
+ <td><%= relative_time(job.retried_at) %></td>
80
+ </tr>
81
+ <% else %>
82
+ <tr>
83
+ <th><%= t('OriginallyFailed') %></th>
84
+ <td><%= relative_time(job.failed_at) %></td>
85
+ </tr>
86
+ <% end %>
87
+ <tr>
88
+ <th><%= t('NextRetry') %></th>
89
+ <td><%= relative_time(job.at) %></td>
90
+ </tr>
91
+ <% end %>
92
+ <% if type == :scheduled %>
93
+ <tr>
94
+ <th><%= t('Scheduled') %></th>
95
+ <td><%= relative_time(job.at) %></td>
96
+ </tr>
97
+ <% end %>
98
+ <% if type == :dead %>
99
+ <tr>
100
+ <th><%= t('LastRetry') %></th>
101
+ <td><%= relative_time(job.at) if job['retry_count'] %></td>
102
+ </tr>
103
+ <% end %>
104
+ <% config.custom_job_info_rows&.each do |helper| %>
105
+ <% helper.add_pair(job) do |name, value| %>
106
+ <tr>
107
+ <th><%= name %></th>
108
+ <td><%= value %></td>
109
+ </tr>
110
+ <% end %>
111
+ <% end %>
112
+ </tbody>
113
+ </table>
114
+ </div>
115
+ </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") %>" autocomplete="off">
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>
@@ -0,0 +1,45 @@
1
+ <header>
2
+ <div class="container">
3
+ <div class="navbar-header" data-navbar="static">
4
+ <button type="button" class="btn navbar-toggle" 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-livereload">
10
+ <%= erb :_poll_link %>
11
+ <% if config.app_url %>
12
+ <a class="btn btn-inverse" href="<%= config.app_url %>"><%= t('BackToApp') %></a>
13
+ <% end %>
14
+ </div>
15
+ <a class="navbar-brand" href="<%= root_path %>">
16
+ <%= Sidekiq::NAME %>
17
+ </a>
18
+ </div>
19
+
20
+ <div class="navbar-collapse" role="navigation" id="navbar-menu">
21
+ <ul class="nav" data-navbar="static">
22
+ <% config.tabs.each do |title, url| %>
23
+ <% if url == '' %>
24
+ <li class="<%= current_path == url ? 'active' : '' %>">
25
+ <a href="<%= root_path %><%= url %>"><%= t(title) %></a>
26
+ </li>
27
+ <% else %>
28
+ <li class="<%= current_path.start_with?(url) ? 'active' : '' %>">
29
+ <a href="<%= root_path %><%= url %>"><%= t(title) %></a>
30
+ </li>
31
+ <% end %>
32
+ <% end %>
33
+
34
+ <li class="navbar-livereload">
35
+ <div class="poll-wrapper">
36
+ <%= erb :_poll_link %>
37
+ <% if config.app_url %>
38
+ <a class="btn btn-inverse" href="<%= config.app_url %>"><%= t('BackToApp') %></a>
39
+ <% end %>
40
+ </div>
41
+ </li>
42
+ </ul>
43
+ </div>
44
+ </div>
45
+ </header>
@@ -0,0 +1,26 @@
1
+
2
+ <% if @total_size > @count %>
3
+ <div>
4
+ <ul class="pagination pull-right">
5
+ <li class="<%= 'disabled' if @current_page == 1 %>">
6
+ <a href="<%= url %>?page=1">&laquo;</a>
7
+ </li>
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="active">
14
+ <a href="<%= url %>?<%= qparams(page: @current_page) %>"><%= @current_page %></a>
15
+ </li>
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>
26
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <% if pollable? %>
2
+ <a href="#" class="btn live-poll live-poll-start btn-primary"><%= t('LivePoll') %></a>
3
+ <a href="#" class="btn live-poll live-poll-stop btn-danger"><%= t('StopPolling') %></a>
4
+ <% end %>
@@ -0,0 +1,40 @@
1
+ <div class="cards-container">
2
+ <article>
3
+ <span id="txtProcessed" class="count" data-nwp><%= stats.processed %></span>
4
+ <span class="desc"><%= t('Processed') %></span>
5
+ </article>
6
+ <article>
7
+ <span id="txtFailed" class="count" data-nwp><%= stats.failed %></span>
8
+ <span class="desc"><%= t('Failed') %></span>
9
+ </article>
10
+ <article>
11
+ <a href="<%= root_path %>busy">
12
+ <span id="txtBusy" class="count" data-nwp><%= workset.size %></span>
13
+ <span class="desc"><%= t('Busy') %></span>
14
+ </a>
15
+ </article>
16
+ <article>
17
+ <a href="<%= root_path %>queues">
18
+ <span id="txtEnqueued" class="count" data-nwp><%= stats.enqueued %></span>
19
+ <span class="desc"><%= t('Enqueued') %></span>
20
+ </a>
21
+ </article>
22
+ <article>
23
+ <a href="<%= root_path %>retries">
24
+ <span id="txtRetries" class="count" data-nwp><%= stats.retry_size %></span>
25
+ <span class="desc"><%= t('Retries') %></span>
26
+ </a>
27
+ </article>
28
+ <article>
29
+ <a href="<%= root_path %>scheduled">
30
+ <span id="txtScheduled" class="count" data-nwp><%= stats.scheduled_size %></span>
31
+ <span class="desc"><%= t('Scheduled') %></span>
32
+ </a>
33
+ </article>
34
+ <article>
35
+ <a href="<%= root_path %>morgue">
36
+ <span id="txtDead" class="count" data-nwp><%= stats.dead_size %></span>
37
+ <span class="desc"><%= t('Dead') %></span>
38
+ </a>
39
+ </article>
40
+ </div>
@@ -0,0 +1,155 @@
1
+ <section>
2
+ <header>
3
+ <h1><%= t('Status') %></h1>
4
+ </header>
5
+
6
+ <div class="cards-container">
7
+ <article>
8
+ <h3><%= s = processes.size; number_with_delimiter(s) %></h3>
9
+ <p><%= t('Processes') %></p>
10
+ </article>
11
+ <article>
12
+ <h3><%= x = processes.total_concurrency; number_with_delimiter(x) %></h3>
13
+ <p><%= t('Threads') %></p>
14
+ </article>
15
+ <article>
16
+ <h3><%= ws = workset.size; number_with_delimiter(ws) %></h3>
17
+ <p><%= t('Busy') %></p>
18
+ </article>
19
+ <article>
20
+ <h3><%= x == 0 ? 0 : ((ws / x.to_f) * 100).round(0) %>%</h3>
21
+ <p><%= t('Utilization') %></p>
22
+ </article>
23
+ <article>
24
+ <h3><%= format_memory(processes.total_rss) %></h3>
25
+ <p><%= t('RSS') %></p>
26
+ </article>
27
+ </div>
28
+ </section>
29
+
30
+ <% if @show_processes %>
31
+ <section>
32
+ <header>
33
+ <h2><%= t('Processes') %></h2>
34
+ <form method="POST" class="filter warning-messages">
35
+ <%= csrf_tag %>
36
+ <div class="btn-group pull-right flip">
37
+ <input class="btn btn-warn" type="submit" name="quiet" value="<%= t('QuietAll') %>" data-confirm="<%= t('AreYouSure') %>">
38
+ <input class="btn btn-danger" type="submit" name="stop" value="<%= t('StopAll') %>" data-confirm="<%= t('AreYouSure') %>">
39
+ </div>
40
+ </form>
41
+ </header>
42
+
43
+ <div class="table_container">
44
+ <table>
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
+ <%= queue_names_by_capsule(process) %>
74
+ <% if process.version != Sidekiq::VERSION %>
75
+ <br>
76
+ <b><%= "#{t('Version')}: " %></b>
77
+ <% if process.version %>
78
+ <%= process.version %>
79
+ <% else %>
80
+ <%= t('Unknown') %>
81
+ <% end %>
82
+ <% end %>
83
+ </td>
84
+ <td><%= relative_time(Time.at(process['started_at'])) %></td>
85
+ <td class="num"><%= format_memory(process['rss'].to_i) %></td>
86
+ <td class="num"><%= number_with_delimiter(process['concurrency']) %></td>
87
+ <td class="num"><%= number_with_delimiter(process['busy']) %></td>
88
+ <td>
89
+ <% unless process.embedded? %>
90
+ <form method="POST">
91
+ <%= csrf_tag %>
92
+ <input type="hidden" name="identity" value="<%= process['identity'] %>">
93
+
94
+ <div class="btn-group">
95
+ <% unless process.stopping? %><button class="btn btn-warn" type="submit" name="quiet" value="1"><%= t('Quiet') %></button><% end %>
96
+ <button class="btn btn-danger" type="submit" name="stop" value="1"><%= t('Stop') %></button>
97
+ </div>
98
+ </form>
99
+ <% end %>
100
+ </td>
101
+ </tr>
102
+ <% end %>
103
+ </table>
104
+ </div>
105
+ </section>
106
+ <% end %>
107
+
108
+ <% if @show_jobs %>
109
+ <section>
110
+ <header>
111
+ <h2><%= t('Jobs') %></h2>
112
+ <% if @workset.size > 0 && @total_size > @count %>
113
+ <%= erb :_paging, locals: { url: "#{root_path}busy" } %>
114
+ <% end %>
115
+ </header>
116
+
117
+ <div class="table_container">
118
+ <table>
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, work| %>
129
+ <% job = work.job %>
130
+ <tr>
131
+ <td><%= process %></td>
132
+ <td><%= thread %></td>
133
+ <td><%= job.jid %></td>
134
+ <td>
135
+ <a href="<%= root_path %>queues/<%= work.queue %>"><%= work.queue %></a>
136
+ </td>
137
+ <td>
138
+ <%= job.display_class %>
139
+ <%= display_tags(job, nil) %>
140
+ </td>
141
+ <td>
142
+ <code><div class="args"><%= display_args(job.display_args) %></div></code>
143
+ </td>
144
+ <td>
145
+ <%= relative_time(work.run_at) %>
146
+ <% if (state = @iterable_states[job.jid]) %>
147
+ <div><small>cursor=<%= h(truncate(state.cursor.inspect, 100)) %>; exec=<%= state.executions %>; rt=<%= number_with_delimiter(state.runtime, precision: 3) %>s</small></div>
148
+ <% end %>
149
+ </td>
150
+ </tr>
151
+ <% end %>
152
+ </table>
153
+ </div>
154
+ </section>
155
+ <% end %>
@@ -0,0 +1,104 @@
1
+ <script type="text/javascript" src="<%= root_path %>javascripts/dashboard.js" nonce="<%= csp_nonce %>"></script>
2
+
3
+ <section>
4
+ <header>
5
+ <h1>
6
+ <%= t('Dashboard') %>
7
+ <span id="beacon" class="beacon"></span>
8
+ </h1>
9
+ <div class="filter interval-slider">
10
+ <span class="interval-slider-label"><%= t('PollingInterval') %>:</span>
11
+ <span id="sldr-text" class="current-interval">5 s</span>
12
+ <br>
13
+ <input id="sldr" aria-label="<%= t("PollingIntervalMilliseconds") %>" role="slider" type="range" min="2000" max="20000" step="1000" value="5000" autocomplete="off">
14
+ </div>
15
+ </header>
16
+
17
+ <div class="chart">
18
+ <span id="sr-last-dashboard-update-template" hidden><%= t("LastDashboardUpdateTemplateLiteral") %></span>
19
+ <span id="sr-last-dashboard-update" class="sr-only" role="status"></span>
20
+
21
+ <canvas id="realtime-chart">
22
+ <%= to_json({
23
+ processedLabel: t('Processed'),
24
+ failedLabel: t('Failed'),
25
+ labels: Array.new(50, ""),
26
+ processed: Array.new(50),
27
+ failed: Array.new(50),
28
+ updateUrl: "#{root_path}stats",
29
+ }) %>
30
+ </canvas>
31
+
32
+ <!-- start with a space in the legend so the height doesn't change when we add content dynamically -->
33
+ <div id="realtime-legend">&nbsp;</div>
34
+ </div>
35
+ </section>
36
+
37
+ <section>
38
+ <header>
39
+ <h2><%= t('History') %></h2>
40
+
41
+ <div class="filter">
42
+ <% d = url_params("days") %>
43
+ <a href="<%= root_path %>?days=7" class="history-graph <%= "active" if d == "7" %>"><%= t('OneWeek') %></a>
44
+ <a href="<%= root_path %>" class="history-graph <%= "active" if d.nil? || d == "30" %>"><%= t('OneMonth') %></a>
45
+ <a href="<%= root_path %>?days=90" class="history-graph <%= "active" if d == "90" %>"><%= t('ThreeMonths') %></a>
46
+ <a href="<%= root_path %>?days=180" class="history-graph <%= "active" if d == "180" %>"><%= t('SixMonths') %></a>
47
+ </div>
48
+ </header>
49
+
50
+ <canvas id="history-chart">
51
+ <%= to_json({
52
+ processedLabel: t('Processed'),
53
+ failedLabel: t('Failed'),
54
+ processed: @processed_history.to_a.reverse,
55
+ failed: @failed_history.to_a.reverse,
56
+ }) %>
57
+ </canvas>
58
+ </section>
59
+
60
+ <section>
61
+ <header>
62
+ <h2><%= store_name %></h2>
63
+ </header>
64
+ <div class="cards-container">
65
+ <article>
66
+ <h3 id="redis_version"><%= store_version %></h3>
67
+ <p><%= t('Version') %></p>
68
+ </article>
69
+
70
+ <% if @redis_info.fetch("uptime_in_days", nil) %>
71
+ <article>
72
+ <h3 id="uptime_in_days"><%= @redis_info.fetch("uptime_in_days") %></h3>
73
+ <p><%= t('Uptime') %></p>
74
+ </article>
75
+ <% end %>
76
+
77
+ <% if @redis_info.fetch("connected_clients", nil) %>
78
+ <article>
79
+ <h3 id="connected_clients"><%= @redis_info.fetch("connected_clients") %></h3>
80
+ <p><%= t('Connections') %></p>
81
+ </article>
82
+ <% end %>
83
+
84
+ <% if @redis_info.fetch("used_memory_human", nil) %>
85
+ <article>
86
+ <h3 id="used_memory_human"><%= @redis_info.fetch("used_memory_human") %></h3>
87
+ <p><%= t('MemoryUsage') %></p>
88
+ </article>
89
+ <% end %>
90
+
91
+ <% if @redis_info.fetch("used_memory_peak_human", nil) %>
92
+ <article>
93
+ <h3 id="used_memory_peak_human"><%= @redis_info.fetch("used_memory_peak_human") %></h3>
94
+ <p><%= t('PeakMemoryUsage') %></p>
95
+ </article>
96
+ <% end %>
97
+ </div>
98
+ </section>
99
+
100
+ <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js" nonce="<%= csp_nonce %>"></script>
101
+ <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js" nonce="<%= csp_nonce %>"></script>
102
+ <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-adapter-date-fns.min.js" nonce="<%= csp_nonce %>"></script>
103
+ <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js" nonce="<%= csp_nonce %>"></script>
104
+ <script type="text/javascript" src="<%= root_path %>javascripts/dashboard-charts.js" nonce="<%= csp_nonce %>"></script>
@@ -0,0 +1,38 @@
1
+ <%= erb :_job_info, locals: { job: @dead, type: :dead } %>
2
+
3
+ <section>
4
+ <header>
5
+ <h1><%= t('Error') %></h1>
6
+ </header>
7
+ <div class="table_container">
8
+ <table>
9
+ <tbody>
10
+ <tr>
11
+ <th><%= t('ErrorClass') %></th>
12
+ <td>
13
+ <code><%= @dead['error_class'] %></code>
14
+ </td>
15
+ </tr>
16
+ <tr>
17
+ <th><%= t('ErrorMessage') %></th>
18
+ <td><%= h(@dead['error_message']) %></td>
19
+ </tr>
20
+ <% if @dead.error_backtrace %>
21
+ <tr>
22
+ <th><%= t('ErrorBacktrace') %></th>
23
+ <td>
24
+ <code><%= @dead.error_backtrace.join("<br/>") %></code>
25
+ </td>
26
+ </tr>
27
+ <% end %>
28
+ </tbody>
29
+ </table>
30
+ </div>
31
+
32
+ <form action="<%= root_path %>morgue/<%= job_params(@dead, @dead.score) %>" method="post">
33
+ <%= csrf_tag %>
34
+ <a class="btn btn-default" href="<%= root_path %>morgue"><%= t('GoBack') %></a>
35
+ <input class="btn btn-primary" type="submit" name="retry" value="<%= t('RetryNow') %>">
36
+ <input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>">
37
+ </form>
38
+ </section>
@@ -0,0 +1,6 @@
1
+ <div class="filter">
2
+ <form role="search" method="get" class="form-inline" action="<%= root_path %><%= which %>">
3
+ <label for="substr"><%= t(label_key) %></label>
4
+ <input class="form-control" type="search" name="substr" value="<%= h url_params("substr") %>" placeholder="<%= t(placeholder_key) %>" autocomplete="off">
5
+ </form>
6
+ </div>
@@ -0,0 +1,26 @@
1
+ <!doctype html>
2
+ <html dir="<%= text_direction %>" lang="<%= locale %>">
3
+ <head>
4
+ <title><%= environment_title_prefix %><%= Sidekiq::NAME %></title>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width,initial-scale=1.0">
7
+ <meta name="color-scheme" content="light dark">
8
+ <link href="<%= root_path %>stylesheets/style.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>">
9
+ <link rel="apple-touch-icon" href="<%= root_path %>images/apple-touch-icon.png">
10
+ <link rel="shortcut icon" type="image/ico" href="<%= root_path %>images/favicon.ico">
11
+ <script type="text/javascript" src="<%= root_path %>javascripts/application.js" nonce="<%= csp_nonce %>"></script>
12
+ <meta name="google" content="notranslate">
13
+ <%= display_custom_head %>
14
+ </head>
15
+ <body class="admin" data-locale="<%= locale %>">
16
+ <%= erb :_nav %>
17
+ <main id="page">
18
+ <div class="container">
19
+ <%= erb :_summary %>
20
+ <% if flash? %><p class="flash"><%= get_flash %></p><% end %>
21
+ <%= yield %>
22
+ </div>
23
+ </main>
24
+ <%= erb :_footer %>
25
+ </body>
26
+ </html>