sidekiq 4.1.4 → 6.5.6

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 (213) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +666 -0
  3. data/LICENSE +3 -3
  4. data/README.md +27 -35
  5. data/bin/sidekiq +27 -3
  6. data/bin/sidekiqload +78 -84
  7. data/bin/sidekiqmon +8 -0
  8. data/lib/generators/sidekiq/job_generator.rb +57 -0
  9. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  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 +583 -288
  13. data/lib/sidekiq/cli.rb +255 -218
  14. data/lib/sidekiq/client.rb +86 -83
  15. data/lib/sidekiq/component.rb +65 -0
  16. data/lib/sidekiq/delay.rb +43 -0
  17. data/lib/sidekiq/extensions/action_mailer.rb +13 -22
  18. data/lib/sidekiq/extensions/active_record.rb +13 -10
  19. data/lib/sidekiq/extensions/class_methods.rb +14 -11
  20. data/lib/sidekiq/extensions/generic_proxy.rb +13 -5
  21. data/lib/sidekiq/fetch.rb +50 -40
  22. data/lib/sidekiq/job.rb +13 -0
  23. data/lib/sidekiq/job_logger.rb +51 -0
  24. data/lib/sidekiq/job_retry.rb +282 -0
  25. data/lib/sidekiq/job_util.rb +71 -0
  26. data/lib/sidekiq/launcher.rb +192 -85
  27. data/lib/sidekiq/logger.rb +156 -0
  28. data/lib/sidekiq/manager.rb +44 -45
  29. data/lib/sidekiq/metrics/deploy.rb +47 -0
  30. data/lib/sidekiq/metrics/query.rb +153 -0
  31. data/lib/sidekiq/metrics/shared.rb +94 -0
  32. data/lib/sidekiq/metrics/tracking.rb +134 -0
  33. data/lib/sidekiq/middleware/chain.rb +102 -46
  34. data/lib/sidekiq/middleware/current_attributes.rb +63 -0
  35. data/lib/sidekiq/middleware/i18n.rb +7 -7
  36. data/lib/sidekiq/middleware/modules.rb +21 -0
  37. data/lib/sidekiq/monitor.rb +133 -0
  38. data/lib/sidekiq/paginator.rb +20 -16
  39. data/lib/sidekiq/processor.rb +178 -78
  40. data/lib/sidekiq/rails.rb +56 -27
  41. data/lib/sidekiq/redis_client_adapter.rb +154 -0
  42. data/lib/sidekiq/redis_connection.rb +123 -47
  43. data/lib/sidekiq/ring_buffer.rb +29 -0
  44. data/lib/sidekiq/scheduled.rb +97 -40
  45. data/lib/sidekiq/sd_notify.rb +149 -0
  46. data/lib/sidekiq/systemd.rb +24 -0
  47. data/lib/sidekiq/testing/inline.rb +6 -5
  48. data/lib/sidekiq/testing.rb +83 -56
  49. data/lib/sidekiq/transaction_aware_client.rb +45 -0
  50. data/lib/sidekiq/version.rb +2 -1
  51. data/lib/sidekiq/web/action.rb +93 -0
  52. data/lib/sidekiq/web/application.rb +379 -0
  53. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  54. data/lib/sidekiq/web/helpers.rb +365 -0
  55. data/lib/sidekiq/web/router.rb +104 -0
  56. data/lib/sidekiq/web.rb +108 -213
  57. data/lib/sidekiq/worker.rb +288 -42
  58. data/lib/sidekiq.rb +188 -80
  59. data/sidekiq.gemspec +24 -22
  60. data/web/assets/images/apple-touch-icon.png +0 -0
  61. data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
  62. data/web/assets/javascripts/application.js +130 -75
  63. data/web/assets/javascripts/chart.min.js +13 -0
  64. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  65. data/web/assets/javascripts/dashboard.js +70 -91
  66. data/web/assets/javascripts/graph.js +16 -0
  67. data/web/assets/javascripts/metrics.js +262 -0
  68. data/web/assets/stylesheets/application-dark.css +143 -0
  69. data/web/assets/stylesheets/application-rtl.css +242 -0
  70. data/web/assets/stylesheets/application.css +390 -145
  71. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  72. data/web/assets/stylesheets/bootstrap.css +4 -8
  73. data/web/locales/ar.yml +87 -0
  74. data/web/locales/de.yml +15 -3
  75. data/web/locales/el.yml +43 -19
  76. data/web/locales/en.yml +15 -1
  77. data/web/locales/es.yml +22 -5
  78. data/web/locales/fa.yml +80 -0
  79. data/web/locales/fr.yml +10 -3
  80. data/web/locales/he.yml +79 -0
  81. data/web/locales/ja.yml +12 -4
  82. data/web/locales/lt.yml +83 -0
  83. data/web/locales/pl.yml +4 -4
  84. data/web/locales/pt-br.yml +27 -9
  85. data/web/locales/ru.yml +4 -0
  86. data/web/locales/ur.yml +80 -0
  87. data/web/locales/vi.yml +83 -0
  88. data/web/views/_footer.erb +6 -3
  89. data/web/views/_job_info.erb +4 -3
  90. data/web/views/_nav.erb +5 -19
  91. data/web/views/_paging.erb +1 -1
  92. data/web/views/_poll_link.erb +2 -5
  93. data/web/views/_summary.erb +7 -7
  94. data/web/views/busy.erb +64 -26
  95. data/web/views/dashboard.erb +26 -17
  96. data/web/views/dead.erb +4 -4
  97. data/web/views/layout.erb +15 -5
  98. data/web/views/metrics.erb +69 -0
  99. data/web/views/metrics_for_job.erb +87 -0
  100. data/web/views/morgue.erb +21 -14
  101. data/web/views/queue.erb +28 -14
  102. data/web/views/queues.erb +15 -5
  103. data/web/views/retries.erb +24 -15
  104. data/web/views/retry.erb +5 -5
  105. data/web/views/scheduled.erb +9 -6
  106. data/web/views/scheduled_job_info.erb +1 -1
  107. metadata +73 -256
  108. data/.github/contributing.md +0 -32
  109. data/.github/issue_template.md +0 -4
  110. data/.gitignore +0 -12
  111. data/.travis.yml +0 -18
  112. data/3.0-Upgrade.md +0 -70
  113. data/4.0-Upgrade.md +0 -53
  114. data/COMM-LICENSE +0 -95
  115. data/Ent-Changes.md +0 -123
  116. data/Gemfile +0 -29
  117. data/Pro-2.0-Upgrade.md +0 -138
  118. data/Pro-3.0-Upgrade.md +0 -44
  119. data/Pro-Changes.md +0 -559
  120. data/Rakefile +0 -9
  121. data/bin/sidekiqctl +0 -99
  122. data/code_of_conduct.md +0 -50
  123. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +0 -6
  124. data/lib/generators/sidekiq/templates/worker_test.rb.erb +0 -8
  125. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  126. data/lib/sidekiq/core_ext.rb +0 -106
  127. data/lib/sidekiq/exception_handler.rb +0 -31
  128. data/lib/sidekiq/logging.rb +0 -106
  129. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  130. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  131. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -205
  132. data/lib/sidekiq/util.rb +0 -62
  133. data/lib/sidekiq/web_helpers.rb +0 -255
  134. data/test/config.yml +0 -9
  135. data/test/env_based_config.yml +0 -11
  136. data/test/fake_env.rb +0 -1
  137. data/test/fixtures/en.yml +0 -2
  138. data/test/helper.rb +0 -75
  139. data/test/test_actors.rb +0 -138
  140. data/test/test_api.rb +0 -528
  141. data/test/test_cli.rb +0 -406
  142. data/test/test_client.rb +0 -266
  143. data/test/test_exception_handler.rb +0 -56
  144. data/test/test_extensions.rb +0 -127
  145. data/test/test_fetch.rb +0 -50
  146. data/test/test_launcher.rb +0 -85
  147. data/test/test_logging.rb +0 -35
  148. data/test/test_manager.rb +0 -50
  149. data/test/test_middleware.rb +0 -158
  150. data/test/test_processor.rb +0 -201
  151. data/test/test_rails.rb +0 -22
  152. data/test/test_redis_connection.rb +0 -132
  153. data/test/test_retry.rb +0 -326
  154. data/test/test_retry_exhausted.rb +0 -149
  155. data/test/test_scheduled.rb +0 -115
  156. data/test/test_scheduling.rb +0 -50
  157. data/test/test_sidekiq.rb +0 -107
  158. data/test/test_testing.rb +0 -143
  159. data/test/test_testing_fake.rb +0 -357
  160. data/test/test_testing_inline.rb +0 -94
  161. data/test/test_util.rb +0 -13
  162. data/test/test_web.rb +0 -614
  163. data/test/test_web_helpers.rb +0 -54
  164. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  165. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  166. data/web/assets/images/status/active.png +0 -0
  167. data/web/assets/images/status/idle.png +0 -0
  168. data/web/assets/javascripts/locales/README.md +0 -27
  169. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  170. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  171. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  172. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  173. data/web/assets/javascripts/locales/jquery.timeago.cs.js +0 -18
  174. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  175. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  176. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  177. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  178. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  179. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  180. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  181. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  182. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  183. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  184. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  185. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  186. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  187. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  188. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  189. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  190. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  191. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  192. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  193. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  194. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  195. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  196. data/web/assets/javascripts/locales/jquery.timeago.nb.js +0 -18
  197. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  198. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  199. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  200. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  201. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  202. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  203. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  204. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  205. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  206. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  207. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  208. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  209. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  210. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  211. data/web/assets/javascripts/locales/jquery.timeago.zh-cn.js +0 -20
  212. data/web/assets/javascripts/locales/jquery.timeago.zh-tw.js +0 -20
  213. data/web/views/_poll_js.erb +0 -5
@@ -0,0 +1,262 @@
1
+ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
2
+ Chart.defaults.borderColor = "#333"
3
+ Chart.defaults.color = "#aaa"
4
+ }
5
+
6
+ class BaseChart {
7
+ constructor(id, options) {
8
+ this.ctx = document.getElementById(id);
9
+ this.options = options
10
+ this.fallbackColor = "#999";
11
+ this.colors = [
12
+ // Colors taken from https://www.chartjs.org/docs/latest/samples/utils.html
13
+ "#537bc4",
14
+ "#4dc9f6",
15
+ "#f67019",
16
+ "#f53794",
17
+ "#acc236",
18
+ "#166a8f",
19
+ "#00a950",
20
+ "#58595b",
21
+ "#8549ba",
22
+ "#991b1b",
23
+ ];
24
+
25
+ this.chart = new Chart(this.ctx, {
26
+ type: this.options.chartType,
27
+ data: { labels: this.options.labels, datasets: this.datasets },
28
+ options: this.chartOptions,
29
+ });
30
+ }
31
+
32
+ addMarksToChart() {
33
+ this.options.marks.forEach(([bucket, label], i) => {
34
+ this.chart.options.plugins.annotation.annotations[`deploy-${i}`] = {
35
+ type: "line",
36
+ xMin: bucket,
37
+ xMax: bucket,
38
+ borderColor: "rgba(220, 38, 38, 0.4)",
39
+ borderWidth: 2,
40
+ };
41
+ });
42
+ }
43
+ }
44
+
45
+ class JobMetricsOverviewChart extends BaseChart {
46
+ constructor(id, options) {
47
+ super(id, { ...options, chartType: "line" });
48
+ this.swatches = [];
49
+
50
+ this.addMarksToChart();
51
+ this.chart.update();
52
+ }
53
+
54
+ registerSwatch(id) {
55
+ const el = document.getElementById(id);
56
+ el.onchange = () => this.toggle(el.value, el.checked);
57
+ this.swatches[el.value] = el;
58
+ this.updateSwatch(el.value);
59
+ }
60
+
61
+ updateSwatch(kls) {
62
+ const el = this.swatches[kls];
63
+ const ds = this.chart.data.datasets.find((ds) => ds.label == kls);
64
+ el.checked = !!ds;
65
+ el.style.color = ds ? ds.borderColor : null;
66
+ }
67
+
68
+ toggle(kls, visible) {
69
+ if (visible) {
70
+ this.chart.data.datasets.push(this.dataset(kls));
71
+ } else {
72
+ const i = this.chart.data.datasets.findIndex((ds) => ds.label == kls);
73
+ this.colors.unshift(this.chart.data.datasets[i].borderColor);
74
+ this.chart.data.datasets.splice(i, 1);
75
+ }
76
+
77
+ this.updateSwatch(kls);
78
+ this.chart.update();
79
+ }
80
+
81
+ dataset(kls) {
82
+ const color = this.colors.shift() || this.fallbackColor;
83
+
84
+ return {
85
+ label: kls,
86
+ data: this.options.series[kls],
87
+ borderColor: color,
88
+ backgroundColor: color,
89
+ borderWidth: 2,
90
+ pointRadius: 2,
91
+ };
92
+ }
93
+
94
+ get datasets() {
95
+ return Object.entries(this.options.series)
96
+ .filter(([kls, _]) => this.options.visible.includes(kls))
97
+ .map(([kls, _]) => this.dataset(kls));
98
+ }
99
+
100
+ get chartOptions() {
101
+ return {
102
+ aspectRatio: 4,
103
+ scales: {
104
+ y: {
105
+ beginAtZero: true,
106
+ title: {
107
+ text: "Total execution time (sec)",
108
+ display: true,
109
+ },
110
+ },
111
+ },
112
+ interaction: {
113
+ mode: "x",
114
+ },
115
+ plugins: {
116
+ legend: {
117
+ display: false,
118
+ },
119
+ tooltip: {
120
+ callbacks: {
121
+ title: (items) => `${items[0].label} UTC`,
122
+ label: (item) =>
123
+ `${item.dataset.label}: ${item.parsed.y.toFixed(1)} seconds`,
124
+ footer: (items) => {
125
+ const bucket = items[0].label;
126
+ const marks = this.options.marks.filter(([b, _]) => b == bucket);
127
+ return marks.map(([b, msg]) => `Deploy: ${msg}`);
128
+ },
129
+ },
130
+ },
131
+ },
132
+ };
133
+ }
134
+ }
135
+
136
+ class HistTotalsChart extends BaseChart {
137
+ constructor(id, options) {
138
+ super(id, { ...options, chartType: "bar" });
139
+ }
140
+
141
+ get datasets() {
142
+ return [{
143
+ data: this.options.series,
144
+ backgroundColor: this.colors[0],
145
+ borderWidth: 0,
146
+ }];
147
+ }
148
+
149
+ get chartOptions() {
150
+ return {
151
+ aspectRatio: 6,
152
+ scales: {
153
+ y: {
154
+ beginAtZero: true,
155
+ title: {
156
+ text: "Total jobs",
157
+ display: true,
158
+ },
159
+ },
160
+ },
161
+ interaction: {
162
+ mode: "x",
163
+ },
164
+ plugins: {
165
+ legend: {
166
+ display: false,
167
+ },
168
+ tooltip: {
169
+ callbacks: {
170
+ label: (item) => `${item.parsed.y} jobs`,
171
+ },
172
+ },
173
+ },
174
+ };
175
+ }
176
+ }
177
+
178
+ class HistBubbleChart extends BaseChart {
179
+ constructor(id, options) {
180
+ super(id, { ...options, chartType: "bubble" });
181
+
182
+ this.addMarksToChart();
183
+ this.chart.update();
184
+ }
185
+
186
+ get datasets() {
187
+ const data = [];
188
+ let maxCount = 0;
189
+
190
+ Object.entries(this.options.hist).forEach(([bucket, hist]) => {
191
+ hist.forEach((count, histBucket) => {
192
+ if (count > 0) {
193
+ data.push({
194
+ x: bucket,
195
+ // histogram data is ordered fastest to slowest, but this.histIntervals is
196
+ // slowest to fastest (so it displays correctly on the chart).
197
+ y:
198
+ this.options.histIntervals[this.options.histIntervals.length - 1 - histBucket] /
199
+ 1000,
200
+ count: count,
201
+ });
202
+
203
+ if (count > maxCount) maxCount = count;
204
+ }
205
+ });
206
+ });
207
+
208
+ // Chart.js will not calculate the bubble size. We have to do that.
209
+ const maxRadius = this.ctx.offsetWidth / this.options.labels.length;
210
+ const minRadius = 1
211
+ const multiplier = (maxRadius / maxCount) * 1.5;
212
+ data.forEach((entry) => {
213
+ entry.r = entry.count * multiplier + minRadius;
214
+ });
215
+
216
+ return [{
217
+ data: data,
218
+ backgroundColor: "#537bc4",
219
+ borderColor: "#537bc4",
220
+ }];
221
+ }
222
+
223
+ get chartOptions() {
224
+ return {
225
+ aspectRatio: 3,
226
+ scales: {
227
+ x: {
228
+ type: "category",
229
+ labels: this.options.labels,
230
+ },
231
+ y: {
232
+ title: {
233
+ text: "Execution time (sec)",
234
+ display: true,
235
+ },
236
+ },
237
+ },
238
+ interaction: {
239
+ mode: "x",
240
+ },
241
+ plugins: {
242
+ legend: {
243
+ display: false,
244
+ },
245
+ tooltip: {
246
+ callbacks: {
247
+ title: (items) => `${items[0].raw.x} UTC`,
248
+ label: (item) =>
249
+ `${item.parsed.y} seconds: ${item.raw.count} job${
250
+ item.raw.count == 1 ? "" : "s"
251
+ }`,
252
+ footer: (items) => {
253
+ const bucket = items[0].raw.x;
254
+ const marks = this.options.marks.filter(([b, _]) => b == bucket);
255
+ return marks.map(([b, msg]) => `Deploy: ${msg}`);
256
+ },
257
+ },
258
+ },
259
+ },
260
+ };
261
+ }
262
+ }
@@ -0,0 +1,143 @@
1
+ html, body {
2
+ background-color: #171717 !important;
3
+ color: #DEDEDE;
4
+ }
5
+
6
+ a,
7
+ .title,
8
+ .summary_bar ul .count,
9
+ span.current-interval,
10
+ .navbar .navbar-brand {
11
+ color: #d04;
12
+ }
13
+
14
+ .history-graph.active,
15
+ .beacon .dot {
16
+ background-color: #d04;
17
+ }
18
+
19
+ .navbar .navbar-brand:hover {
20
+ color: #ddd;
21
+ }
22
+
23
+ .navbar .navbar-brand .status {
24
+ color: #ddd;
25
+ }
26
+
27
+ .navbar-default .navbar-nav > li > a {
28
+ color: #ddd;
29
+ }
30
+
31
+ .navbar-inverse {
32
+ background-color: #222;
33
+ border-color: #444;
34
+ }
35
+
36
+ table {
37
+ background-color: #1D1D1D;
38
+ }
39
+
40
+ .table-striped > tbody > tr:nth-of-type(odd) {
41
+ background-color: #2E2E2E;
42
+ }
43
+
44
+ .table-bordered,
45
+ .table-bordered > tbody > tr > td,
46
+ .table-bordered > tbody > tr > th,
47
+ .table-bordered > tfoot > tr > td,
48
+ .table-bordered > tfoot > tr > th,
49
+ .table-bordered > thead > tr > td,
50
+ .table-bordered > thead > tr > th {
51
+ border: 1px solid #444;
52
+ }
53
+
54
+ .table-hover > tbody > tr:hover {
55
+ background-color: #444;
56
+ }
57
+
58
+ .alert {
59
+ border: none;
60
+ color: #ddd;
61
+ }
62
+
63
+ .alert-success {
64
+ background-color: #484;
65
+ }
66
+
67
+ .alert-danger {
68
+ background-color: #980035;
69
+ }
70
+
71
+ .alert-info {
72
+ background-color: #31708f;
73
+ }
74
+
75
+ a:link, a:active, a:hover, a:visited {
76
+ color: #ddd;
77
+ }
78
+
79
+ input {
80
+ background-color: #444;
81
+ color: #ccc;
82
+ padding: 3px;
83
+ }
84
+
85
+ .summary_bar .summary {
86
+ background-color: #232323;
87
+ border: 1px solid #444;
88
+ }
89
+
90
+ .navbar-default {
91
+ background-color: #0F0F0F;
92
+ border-color: #444;
93
+ }
94
+
95
+ .navbar-default .navbar-nav > .active > a,
96
+ .navbar-default .navbar-nav > .active > a:focus,
97
+ .navbar-default .navbar-nav > .active > a:hover {
98
+ color: #ddd;
99
+ background-color: #333;
100
+ }
101
+
102
+ .navbar-default .navbar-nav > li > a:hover {
103
+ color: #ddd;
104
+ }
105
+
106
+ .pagination > li > a,
107
+ .pagination > li > a:hover,
108
+ .pagination > li > span {
109
+ color: #ddd;
110
+ background-color: #333;
111
+ border-color: #444;
112
+ }
113
+ .pagination > .disabled > a,
114
+ .pagination > .disabled > a:focus,
115
+ .pagination > .disabled > a:hover,
116
+ .pagination > .disabled > span,
117
+ .pagination > .disabled > span:focus,
118
+ .pagination > .disabled > span:hover {
119
+ color: #ddd;
120
+ background-color: #333;
121
+ border-color: #444;
122
+ }
123
+
124
+ .stat {
125
+ border: 1px solid #888;
126
+ }
127
+
128
+ .rickshaw_graph .detail {
129
+ background: #888;
130
+ }
131
+ .rickshaw_graph .x_tick {
132
+ border-color: #888;
133
+ }
134
+
135
+ .rickshaw_graph .y_ticks.glow text {
136
+ fill: #ddd;
137
+ color: #ddd;
138
+ }
139
+
140
+ .info-circle {
141
+ color: #222;
142
+ background-color: #888;
143
+ }
@@ -0,0 +1,242 @@
1
+ .navbar-right {
2
+ float: left !important;
3
+ }
4
+
5
+ footer .edits {
6
+ margin-right: unset;
7
+ margin-left: 40px;
8
+ }
9
+
10
+ .summary_bar .status {
11
+ margin-left: unset;
12
+ margin-right: 10px;
13
+ }
14
+ @media (max-width: 767px) and (min-width: 400px) {
15
+ .summary_bar ul .desc {
16
+ text-align: right;
17
+ }
18
+ .summary_bar ul .count {
19
+ text-align: left;
20
+ }
21
+ }
22
+ @media (max-width: 979px) and (min-width: 768px) {
23
+ }
24
+ .summary_bar ul .count {
25
+ float: left;
26
+ }
27
+
28
+ form .btn {
29
+ margin-right: unset;
30
+ margin-left: 5px;
31
+ }
32
+
33
+ form .btn-group .btn {
34
+ margin-right: unset;
35
+ margin-left: 1px;
36
+ }
37
+
38
+ @media (max-width: 768px) {
39
+ .navbar.navbar-fixed-top ul {
40
+ margin-right: unset;
41
+ margin-left: -15px!important;
42
+ }
43
+ }
44
+
45
+ @media (width: 768px) {
46
+ .navbar .poll-wrapper {
47
+ margin: 4px 0 0 4px;
48
+ }
49
+ }
50
+
51
+ .navbar-footer .navbar ul.nav a.navbar-brand {
52
+ padding: 0 0 0 15px;
53
+ }
54
+
55
+ .navbar-fixed-bottom li {
56
+ margin-right: unset;
57
+ margin-left: 20px;
58
+ }
59
+
60
+ .status-active {
61
+ background-position: 100% 0;
62
+ }
63
+
64
+ .status-idle {
65
+ background-position: 100% -54px;
66
+ }
67
+
68
+ .stat {
69
+ float: right;
70
+ margin-right: unset;
71
+ margin-left: 20px;
72
+ }
73
+
74
+ .stat:last-child {
75
+ margin-left: 0;
76
+ }
77
+
78
+ @media (max-width: 767px) {
79
+ .stat {
80
+ float: right;
81
+ margin-right: unset;
82
+ margin-left: 10px;
83
+ text-align: right;
84
+ }
85
+ .stat h3{
86
+ float: left;
87
+ margin: 5px 5px 5px 10px;
88
+ }
89
+ .stat p{
90
+ font-size: 1em;
91
+ margin: 5px 10px 5px 5px;
92
+ }
93
+ }
94
+
95
+ /* Dashboard
96
+ ********************************** */
97
+ div.dashboard h3 {
98
+ float: right;
99
+ }
100
+
101
+ div.interval-slider {
102
+ float: left;
103
+ }
104
+
105
+ #realtime-legend,
106
+ #history-legend {
107
+ text-align: right;
108
+ float: left;
109
+ }
110
+ #realtime-legend .timestamp,
111
+ #history-legend .timestamp {
112
+ text-align: left;
113
+ }
114
+ #realtime-legend .line,
115
+ #history-legend .line {
116
+ margin: 0 20px 0 0;
117
+ }
118
+ #realtime-legend .swatch,
119
+ #history-legend .swatch {
120
+ margin: 0 0 0 8px;
121
+ }
122
+
123
+ /* Beacon
124
+ ********************************** */
125
+
126
+ .beacon .dot,
127
+ .beacon .ring {
128
+ right: 50%;
129
+ }
130
+
131
+ .beacon .dot {
132
+ margin: -5px -5px 0 0;
133
+ }
134
+
135
+ .beacon .ring {
136
+ margin: -14px -14px 0 0;
137
+ }
138
+
139
+ .history-heading {
140
+ padding-right: unset;
141
+ padding-left: 15px;
142
+ }
143
+
144
+ @media (max-width: 767px) {
145
+ .navbar.navbar-fixed-top ul {
146
+ margin-left: 0;
147
+ }
148
+
149
+ .navbar.navbar-fixed-top li {
150
+ margin-left: 0;
151
+ }
152
+
153
+ .navbar.navbar-fixed-bottom ul {
154
+ margin-left: 0;
155
+ }
156
+
157
+ .navbar.navbar-fixed-bottom li {
158
+ margin-left: 0;
159
+ }
160
+ }
161
+
162
+ @media (max-width: 500px) {
163
+ .navbar-footer .navbar ul.nav a.navbar-brand {
164
+ padding-right: unset;
165
+ padding-left: 5px;
166
+ }
167
+ }
168
+
169
+ /* Rickshaw */
170
+
171
+ .rickshaw_graph .detail .x_label.left {
172
+ right: 0
173
+ }
174
+ .rickshaw_graph .detail .x_label.right {
175
+ left: 0
176
+ }
177
+ .rickshaw_graph .detail .item.left {
178
+ right: 0
179
+ }
180
+ .rickshaw_graph .detail .item.right {
181
+ left: 0
182
+ }
183
+ .rickshaw_graph .detail .item.left:after {
184
+ left: 0;
185
+ right: -5px;
186
+ border-right-color: unset;
187
+ border-left-color: rgba(0, 0, 0, .8);
188
+ border-right-width: 0;
189
+ border-left-width: unset;
190
+ }
191
+ .rickshaw_graph .detail .item.right:after {
192
+ right: 0;
193
+ left: -5px;
194
+ border-left-color: unset;
195
+ border-right-color: rgba(0, 0, 0, .8);
196
+ border-left-width: 0;
197
+ border-right-width: unset;
198
+ }
199
+ .rickshaw_graph .detail .dot {
200
+ margin-right: -3px;
201
+ margin-left: unset;
202
+ }
203
+ .rickshaw_graph .x_tick {
204
+ border-left: unset;
205
+ border-right: 1px dotted rgba(0, 0, 0, .2);
206
+ }
207
+ .rickshaw_graph .x_tick .title {
208
+ margin-right: 3px;
209
+ margin-left: unset;
210
+ }
211
+ .rickshaw_annotation_timeline .annotation {
212
+ margin-right: -2px;
213
+ margin-left: unset;
214
+ }
215
+ .rickshaw_graph .annotation_line {
216
+ border-right: 2px solid rgba(0, 0, 0, .3);
217
+ border-left: unset;
218
+ }
219
+ .rickshaw_annotation_timeline .annotation .content {
220
+ left: unset;
221
+ right: -11px;
222
+ }
223
+ .rickshaw_graph .x_tick.glow .title,
224
+ .rickshaw_graph .y_ticks.glow text {
225
+ text-shadow: 1px 1px 0 rgba(255, 255, 255, .1), -1px -1px 0 rgba(255, 255, 255, .1), -1px 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1), 0 -1px 0 rgba(255, 255, 255, .1), -1px 0 0 rgba(255, 255, 255, .1), 1px 0 0 rgba(255, 255, 255, .1), 1px -1px 0 rgba(255, 255, 255, .1)
226
+ }
227
+ .rickshaw_graph .x_tick.inverse .title,
228
+ .rickshaw_graph .y_ticks.inverse text {
229
+ text-shadow: 1px 1px 0 rgba(0, 0, 0, .8), -1px -1px 0 rgba(0, 0, 0, .8), -1px 1px 0 rgba(0, 0, 0, .8), 0 1px 0 rgba(0, 0, 0, .8), 0 -1px 0 rgba(0, 0, 0, .8), -1px 0 0 rgba(0, 0, 0, .8), 1px 0 0 rgba(0, 0, 0, .8), 1px -1px 0 rgba(0, 0, 0, .8)
230
+ }
231
+ .rickshaw_legend .line {
232
+ padding-left: 15px;
233
+ padding-right: unset;
234
+ }
235
+ .rickshaw_legend .line .swatch {
236
+ margin-left: 3px;
237
+ margin-right: unset;
238
+ }
239
+ .rickshaw_legend .action {
240
+ margin-left: .2em;
241
+ margin-right: unset;
242
+ }