solid_queue_guard 1.0.3 → 1.1.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/Gemfile.lock +26 -1
- data/README.md +53 -4
- data/app/controllers/solid_queue_guard/mission_control/base_controller.rb +9 -0
- data/app/controllers/solid_queue_guard/mission_control/dashboard_controller.rb +11 -0
- data/app/helpers/solid_queue_guard/mission_control/dashboard_helper.rb +34 -0
- data/app/views/solid_queue_guard/mission_control/dashboard/_check.html.erb +6 -0
- data/app/views/solid_queue_guard/mission_control/dashboard/_summary_metrics.html.erb +29 -0
- data/app/views/solid_queue_guard/mission_control/dashboard/show.html.erb +75 -0
- data/lib/generators/solid_queue_guard/install/templates/solid_queue_guard.rb +1 -0
- data/lib/solid_queue_guard/configuration.rb +2 -0
- data/lib/solid_queue_guard/engine.rb +20 -0
- data/lib/solid_queue_guard/mission_control/integration.rb +44 -0
- data/lib/solid_queue_guard/mission_control/navigation_extension.rb +19 -0
- data/lib/solid_queue_guard/version.rb +1 -1
- data/solid_queue_guard.gemspec +2 -0
- metadata +37 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ab2d0794eaf4923a9cf04258b3475241168c65560f177e538161ad79d0b247b8
|
|
4
|
+
data.tar.gz: 2af293272bbc2c18cb7abd55f096b2970825530f7c24a9b62cc780e6e75e05cc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8350cd4a805e859ac5d8ba42fe3ea5775e5fef08d1d9982e02c64533135d7586e6eaea79d92205b050ec7882c7feacf2a23b57f48cd8f52431b4a28e5563c7dd
|
|
7
|
+
data.tar.gz: b4ceba904d1835995315792528e822e59a91a1ae93fe7aefbe4f6948db514bddd90cc9826a1854f08902f867a7ec99b9c9cbe9fc5758af11d46c3515eba7d167
|
data/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,26 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.1.2] - 2026-07-09
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- RuboCop Style/ClassAndModuleChildren offense in test helper
|
|
13
|
+
|
|
14
|
+
## [1.1.1] - 2026-07-09
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Rails 7.1 CI: keep `:solid_queue` adapter in integration tests instead of ActiveJob's default `TestAdapter`, so Mission Control navigation renders on the Guard dashboard
|
|
19
|
+
|
|
20
|
+
## [1.1.0] - 2026-07-09
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- Opt-in Mission Control — Jobs integration via `config.integrate_mission_control`
|
|
25
|
+
- **Guard** tab at `/jobs/guard` with Bulma UI matching Mission Control (status, metrics, warnings, suggestions, checks table)
|
|
26
|
+
- Reuses Mission Control authentication and layout; `/solid_queue_guard/health` JSON endpoint unchanged for load balancers
|
|
27
|
+
|
|
8
28
|
## [1.0.3] - 2026-07-09
|
|
9
29
|
|
|
10
30
|
### Fixed
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
solid_queue_guard (1.
|
|
4
|
+
solid_queue_guard (1.1.2)
|
|
5
5
|
actionpack (>= 7.1, < 9.0)
|
|
6
6
|
activejob (>= 7.1, < 9.0)
|
|
7
7
|
activerecord (>= 7.1, < 9.0)
|
|
@@ -113,6 +113,10 @@ GEM
|
|
|
113
113
|
activesupport (>= 6.1)
|
|
114
114
|
i18n (1.15.2)
|
|
115
115
|
concurrent-ruby (~> 1.0)
|
|
116
|
+
importmap-rails (2.2.3)
|
|
117
|
+
actionpack (>= 6.0.0)
|
|
118
|
+
activesupport (>= 6.0.0)
|
|
119
|
+
railties (>= 6.0.0)
|
|
116
120
|
io-console (0.8.2)
|
|
117
121
|
irb (1.18.0)
|
|
118
122
|
pp (>= 0.6.0)
|
|
@@ -135,6 +139,16 @@ GEM
|
|
|
135
139
|
marcel (1.2.1)
|
|
136
140
|
mini_mime (1.1.5)
|
|
137
141
|
minitest (5.27.0)
|
|
142
|
+
mission_control-jobs (1.1.0)
|
|
143
|
+
actioncable (>= 7.1)
|
|
144
|
+
actionpack (>= 7.1)
|
|
145
|
+
activejob (>= 7.1)
|
|
146
|
+
activerecord (>= 7.1)
|
|
147
|
+
importmap-rails (>= 1.2.1)
|
|
148
|
+
irb (~> 1.13)
|
|
149
|
+
railties (>= 7.1)
|
|
150
|
+
stimulus-rails
|
|
151
|
+
turbo-rails
|
|
138
152
|
mocha (3.1.0)
|
|
139
153
|
ruby2_keywords (>= 0.0.5)
|
|
140
154
|
net-imap (0.6.4.1)
|
|
@@ -171,6 +185,10 @@ GEM
|
|
|
171
185
|
prettyprint
|
|
172
186
|
prettyprint (0.2.0)
|
|
173
187
|
prism (1.9.0)
|
|
188
|
+
propshaft (1.3.2)
|
|
189
|
+
actionpack (>= 7.0.0)
|
|
190
|
+
activesupport (>= 7.0.0)
|
|
191
|
+
rack
|
|
174
192
|
puma (8.0.2)
|
|
175
193
|
nio4r (~> 2.0)
|
|
176
194
|
raabro (1.4.0)
|
|
@@ -265,9 +283,14 @@ GEM
|
|
|
265
283
|
sqlite3 (2.9.5-x86_64-darwin)
|
|
266
284
|
sqlite3 (2.9.5-x86_64-linux-gnu)
|
|
267
285
|
sqlite3 (2.9.5-x86_64-linux-musl)
|
|
286
|
+
stimulus-rails (1.3.4)
|
|
287
|
+
railties (>= 6.0.0)
|
|
268
288
|
thor (1.5.0)
|
|
269
289
|
timeout (0.6.1)
|
|
270
290
|
tsort (0.2.0)
|
|
291
|
+
turbo-rails (2.0.23)
|
|
292
|
+
actionpack (>= 7.1.0)
|
|
293
|
+
railties (>= 7.1.0)
|
|
271
294
|
tzinfo (2.0.6)
|
|
272
295
|
concurrent-ruby (~> 1.0)
|
|
273
296
|
unicode-display_width (3.2.0)
|
|
@@ -295,8 +318,10 @@ DEPENDENCIES
|
|
|
295
318
|
appraisal (~> 2.5)
|
|
296
319
|
debug
|
|
297
320
|
minitest (~> 5.0)
|
|
321
|
+
mission_control-jobs (>= 1.0)
|
|
298
322
|
mocha (>= 2.1)
|
|
299
323
|
parallel (~> 1.26)
|
|
324
|
+
propshaft (>= 1.0)
|
|
300
325
|
puma (>= 6.0)
|
|
301
326
|
rails (>= 7.1, < 9.0)
|
|
302
327
|
rubocop (~> 1.75)
|
data/README.md
CHANGED
|
@@ -176,17 +176,52 @@ config.unhealthy_http_status = 503 # default
|
|
|
176
176
|
|
|
177
177
|
Works with **Kamal**, **Heroku**, **Fly.io**, **ECS/Fargate**, **Kubernetes**, **Better Stack**, **UptimeRobot**.
|
|
178
178
|
|
|
179
|
+
### Mission Control dashboard (opt-in)
|
|
180
|
+
|
|
181
|
+
Add a **Guard** tab to [Mission Control — Jobs](https://github.com/rails/mission_control-jobs) — same Bulma UI, same auth, same navigation:
|
|
182
|
+
|
|
183
|
+
```ruby
|
|
184
|
+
# Gemfile
|
|
185
|
+
gem "mission_control-jobs"
|
|
186
|
+
gem "solid_queue_guard"
|
|
187
|
+
|
|
188
|
+
# config/initializers/solid_queue_guard.rb
|
|
189
|
+
SolidQueueGuard.configure do |config|
|
|
190
|
+
config.integrate_mission_control = true
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# config/routes.rb
|
|
194
|
+
mount MissionControl::Jobs::Engine, at: "/jobs"
|
|
195
|
+
mount SolidQueueGuard::Engine, at: "/solid_queue_guard" # keep /health for probes
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Open `/jobs/guard` (or click the **Guard** tab inside Mission Control). The page shows:
|
|
199
|
+
|
|
200
|
+
| Section | Content |
|
|
201
|
+
| ------- | ------- |
|
|
202
|
+
| **Overall status** | `healthy` / `degraded` / `unhealthy` badge |
|
|
203
|
+
| **Metrics** | Queue lag, failed jobs (1h), dead processes, check count |
|
|
204
|
+
| **Warnings & suggestions** | Same messages as `doctor` / `/health` |
|
|
205
|
+
| **Checks table** | Every check with status tag, message, and suggestion |
|
|
206
|
+
|
|
207
|
+
**Authentication:** the Guard tab inherits Mission Control auth — HTTP basic (default) or your admin controller via `MissionControl::Jobs.base_controller_class`. No separate login.
|
|
208
|
+
|
|
209
|
+
**Load balancers:** keep using `GET /solid_queue_guard/health` with optional `health_token`. Probes do not go through Mission Control.
|
|
210
|
+
|
|
211
|
+
**Requirements:** an asset pipeline (Propshaft or Sprockets), same as Mission Control. `mission_control-jobs` is optional — only needed when `integrate_mission_control` is enabled.
|
|
212
|
+
|
|
179
213
|
---
|
|
180
214
|
|
|
181
215
|
## How to use it
|
|
182
216
|
|
|
183
|
-
Solid Queue does not show up in Rails `/up`. **solid_queue_guard** gives you
|
|
217
|
+
Solid Queue does not show up in Rails `/up`. **solid_queue_guard** gives you four operational surfaces:
|
|
184
218
|
|
|
185
219
|
| Surface | Command / URL | Best for |
|
|
186
220
|
| ------- | ------------- | -------- |
|
|
187
221
|
| **Doctor** | `bin/rails solid_queue_guard:doctor` | Local pre-deploy, config review |
|
|
188
222
|
| **CI gate** | `SOLID_QUEUE_GUARD_STRICT=1 bin/rails solid_queue_guard:doctor` | Block merges with broken queue config |
|
|
189
223
|
| **HTTP health** | `GET /solid_queue_guard/health` | Production uptime monitors (Kamal, ECS, UptimeRobot) |
|
|
224
|
+
| **Guard tab** | `GET /jobs/guard` (with `integrate_mission_control`) | Human-readable checks inside Mission Control |
|
|
190
225
|
|
|
191
226
|
**Mission Control** shows what is happening. **solid_queue_guard** warns what is dangerous. Use both.
|
|
192
227
|
|
|
@@ -352,6 +387,7 @@ SolidQueueGuard.configure do |config|
|
|
|
352
387
|
|
|
353
388
|
# config.health_token = ENV["SOLID_QUEUE_GUARD_TOKEN"]
|
|
354
389
|
# config.integrate_rails_health = true
|
|
390
|
+
# config.integrate_mission_control = true # Guard tab in Mission Control (requires mission_control-jobs)
|
|
355
391
|
# config.notify_with = [:rails_logger, :slack, :datadog, :webhook]
|
|
356
392
|
# config.metrics_backends = [:statsd, :prometheus, :opentelemetry]
|
|
357
393
|
end
|
|
@@ -374,8 +410,10 @@ The following surface is **stable** until `2.0` and follows [semantic versioning
|
|
|
374
410
|
| `solid_queue_guard:install` | Initializer generator |
|
|
375
411
|
| `solid_queue_guard:install:ci` | GitHub Actions workflow generator |
|
|
376
412
|
| `mount SolidQueueGuard::Engine` | HTTP health endpoint |
|
|
413
|
+
| `config.integrate_mission_control` | Guard tab in Mission Control (opt-in, requires `mission_control-jobs`) |
|
|
414
|
+
| `GET /jobs/guard` | Human-readable health dashboard (when integration enabled) |
|
|
377
415
|
|
|
378
|
-
Configuration attributes, rake tasks,
|
|
416
|
+
Configuration attributes, rake tasks, health JSON shape, and Mission Control integration are public. Internal check classes and registry are `@api private`.
|
|
379
417
|
|
|
380
418
|
Breaking changes ship only in major versions (`2.0+`). Deprecations warn one minor version ahead.
|
|
381
419
|
|
|
@@ -386,7 +424,7 @@ Breaking changes ship only in major versions (`2.0+`). Deprecations warn one min
|
|
|
386
424
|
| | [Mission Control — Jobs](https://github.com/rails/mission_control-jobs) | solid_queue_guard |
|
|
387
425
|
| --- | --- | --- |
|
|
388
426
|
| **Purpose** | Inspect & manage jobs | Detect production risk |
|
|
389
|
-
| **UI** | Dashboard | CLI + JSON + health endpoint |
|
|
427
|
+
| **UI** | Dashboard | CLI + JSON + health endpoint + optional Guard tab in Mission Control |
|
|
390
428
|
| **Retry / discard** | Yes | No (use Mission Control) |
|
|
391
429
|
| **Config doctor** | No | Yes |
|
|
392
430
|
| **Queue lag alerts** | No | Yes |
|
|
@@ -410,6 +448,7 @@ Breaking changes ship only in major versions (`2.0+`). Deprecations warn one min
|
|
|
410
448
|
| **v0.7** | Puma plugin runtime check, async supervisor awareness | ✅ Released |
|
|
411
449
|
| **v0.8** | HTTP status policy, `install:ci` generator | ✅ Released |
|
|
412
450
|
| **v1.0** | Stable public API, strict semver | ✅ Released |
|
|
451
|
+
| **v1.1** | Mission Control Guard tab (opt-in) | ✅ Released |
|
|
413
452
|
|
|
414
453
|
---
|
|
415
454
|
|
|
@@ -417,6 +456,7 @@ Breaking changes ship only in major versions (`2.0+`). Deprecations warn one min
|
|
|
417
456
|
|
|
418
457
|
| Gem version | Ruby | Rails |
|
|
419
458
|
| ----------- | ---- | ----- |
|
|
459
|
+
| 1.1.x | 3.1+ | 7.1, 7.2, 8.0 |
|
|
420
460
|
| 1.0.x | 3.1+ | 7.1, 7.2, 8.0 |
|
|
421
461
|
| 0.5.x | 3.1+ | 7.1, 7.2, 8.0 |
|
|
422
462
|
| 0.1.x | 3.1+ | 7.1, 7.2, 8.0 |
|
|
@@ -426,6 +466,7 @@ Breaking changes ship only in major versions (`2.0+`). Deprecations warn one min
|
|
|
426
466
|
- Ruby >= 3.1
|
|
427
467
|
- Rails >= 7.1, < 9.0
|
|
428
468
|
- [solid_queue](https://github.com/rails/solid_queue) >= 1.0, < 2.0
|
|
469
|
+
- [mission_control-jobs](https://github.com/rails/mission_control-jobs) >= 1.0 — optional, only for `integrate_mission_control`
|
|
429
470
|
|
|
430
471
|
---
|
|
431
472
|
|
|
@@ -442,7 +483,15 @@ bundle exec appraisal install
|
|
|
442
483
|
bundle exec appraisal rake test
|
|
443
484
|
```
|
|
444
485
|
|
|
445
|
-
Release a new version
|
|
486
|
+
Release a new version after CI passes:
|
|
487
|
+
|
|
488
|
+
```bash
|
|
489
|
+
# Tag must match lib/solid_queue_guard/version.rb (currently 1.1.2)
|
|
490
|
+
git tag v1.1.2
|
|
491
|
+
git push origin v1.1.2
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
Trusted Publishing on RubyGems publishes automatically when the tag is pushed.
|
|
446
495
|
|
|
447
496
|
---
|
|
448
497
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module SolidQueueGuard
|
|
4
|
+
module MissionControl
|
|
5
|
+
module DashboardHelper
|
|
6
|
+
def guard_modifier_for_status(status)
|
|
7
|
+
case status.to_s
|
|
8
|
+
when 'healthy', 'pass' then 'is-success'
|
|
9
|
+
when 'degraded', 'warn' then 'is-warning'
|
|
10
|
+
when 'unhealthy', 'fail' then 'is-danger'
|
|
11
|
+
else 'is-light'
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def guard_status_tag(status, label: nil)
|
|
16
|
+
tag.span(label || status.to_s.titleize, class: "tag #{guard_modifier_for_status(status)}")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def guard_check_label(check)
|
|
20
|
+
check[:id].to_s.tr('_', ' ').titleize
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def guard_metric_value(value)
|
|
24
|
+
value.nil? ? '—' : value
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def guard_format_duration(seconds)
|
|
28
|
+
return '—' if seconds.nil?
|
|
29
|
+
|
|
30
|
+
distance_of_time_in_words(0, seconds.to_i, include_seconds: true)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<div class="columns is-multiline">
|
|
2
|
+
<div class="column is-one-quarter">
|
|
3
|
+
<div class="box has-text-centered">
|
|
4
|
+
<p class="heading">Queue lag</p>
|
|
5
|
+
<p class="title is-5"><%= guard_format_duration(payload[:queue_lag_seconds]) %></p>
|
|
6
|
+
</div>
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<div class="column is-one-quarter">
|
|
10
|
+
<div class="box has-text-centered">
|
|
11
|
+
<p class="heading">Failed jobs (1h)</p>
|
|
12
|
+
<p class="title is-5"><%= guard_metric_value(payload[:failed_jobs_last_hour]) %></p>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<div class="column is-one-quarter">
|
|
17
|
+
<div class="box has-text-centered">
|
|
18
|
+
<p class="heading">Dead processes</p>
|
|
19
|
+
<p class="title is-5"><%= guard_metric_value(payload[:dead_processes]) %></p>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div class="column is-one-quarter">
|
|
24
|
+
<div class="box has-text-centered">
|
|
25
|
+
<p class="heading">Checks</p>
|
|
26
|
+
<p class="title is-5"><%= payload[:checks].size %></p>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<% navigation(title: "Guard", section: :guard) %>
|
|
2
|
+
|
|
3
|
+
<div class="level mb-5">
|
|
4
|
+
<div class="level-left">
|
|
5
|
+
<div class="level-item">
|
|
6
|
+
<h2 class="title is-4 mb-0">
|
|
7
|
+
Overall status
|
|
8
|
+
<%= guard_status_tag(@payload[:status]) %>
|
|
9
|
+
</h2>
|
|
10
|
+
</div>
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<%= render "solid_queue_guard/mission_control/dashboard/summary_metrics", payload: @payload %>
|
|
15
|
+
|
|
16
|
+
<% if @payload[:warnings].present? %>
|
|
17
|
+
<article class="message is-warning mt-5">
|
|
18
|
+
<div class="message-header">
|
|
19
|
+
<p>Warnings</p>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="message-body">
|
|
22
|
+
<ul>
|
|
23
|
+
<% @payload[:warnings].each do |warning| %>
|
|
24
|
+
<li><%= warning %></li>
|
|
25
|
+
<% end %>
|
|
26
|
+
</ul>
|
|
27
|
+
</div>
|
|
28
|
+
</article>
|
|
29
|
+
<% end %>
|
|
30
|
+
|
|
31
|
+
<% if @payload[:suggestions].present? %>
|
|
32
|
+
<article class="message is-info mt-5">
|
|
33
|
+
<div class="message-header">
|
|
34
|
+
<p>Suggested fixes</p>
|
|
35
|
+
</div>
|
|
36
|
+
<div class="message-body">
|
|
37
|
+
<ul>
|
|
38
|
+
<% @payload[:suggestions].each do |suggestion| %>
|
|
39
|
+
<li><%= suggestion %></li>
|
|
40
|
+
<% end %>
|
|
41
|
+
</ul>
|
|
42
|
+
</div>
|
|
43
|
+
</article>
|
|
44
|
+
<% end %>
|
|
45
|
+
|
|
46
|
+
<% if @payload[:recommendations].present? %>
|
|
47
|
+
<article class="message is-link mt-5">
|
|
48
|
+
<div class="message-header">
|
|
49
|
+
<p>Topology recommendations</p>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="message-body">
|
|
52
|
+
<ul>
|
|
53
|
+
<% @payload[:recommendations].each do |recommendation| %>
|
|
54
|
+
<li><%= recommendation %></li>
|
|
55
|
+
<% end %>
|
|
56
|
+
</ul>
|
|
57
|
+
</div>
|
|
58
|
+
</article>
|
|
59
|
+
<% end %>
|
|
60
|
+
|
|
61
|
+
<table class="guard-checks table is-hoverable is-fullwidth mt-5">
|
|
62
|
+
<thead>
|
|
63
|
+
<tr>
|
|
64
|
+
<th>Check</th>
|
|
65
|
+
<th>Status</th>
|
|
66
|
+
<th>Message</th>
|
|
67
|
+
<th>Suggestion</th>
|
|
68
|
+
</tr>
|
|
69
|
+
</thead>
|
|
70
|
+
<tbody>
|
|
71
|
+
<%= render partial: "solid_queue_guard/mission_control/dashboard/check",
|
|
72
|
+
collection: @payload[:checks],
|
|
73
|
+
as: :check %>
|
|
74
|
+
</tbody>
|
|
75
|
+
</table>
|
|
@@ -22,6 +22,7 @@ SolidQueueGuard.configure do |config|
|
|
|
22
22
|
|
|
23
23
|
# config.health_token = ENV["SOLID_QUEUE_GUARD_TOKEN"]
|
|
24
24
|
# config.integrate_rails_health = true
|
|
25
|
+
# config.integrate_mission_control = true
|
|
25
26
|
# config.notify_with = [:rails_logger, :slack, :datadog, :webhook]
|
|
26
27
|
# config.metrics_backends = [:statsd, :prometheus, :opentelemetry]
|
|
27
28
|
end
|
|
@@ -11,6 +11,7 @@ module SolidQueueGuard
|
|
|
11
11
|
:health_cache_ttl,
|
|
12
12
|
:scheduled_backlog_threshold,
|
|
13
13
|
:integrate_rails_health,
|
|
14
|
+
:integrate_mission_control,
|
|
14
15
|
:notify_with,
|
|
15
16
|
:metrics_backends,
|
|
16
17
|
:disabled_checks,
|
|
@@ -28,6 +29,7 @@ module SolidQueueGuard
|
|
|
28
29
|
@health_cache_ttl = 15.seconds
|
|
29
30
|
@scheduled_backlog_threshold = 100
|
|
30
31
|
@integrate_rails_health = false
|
|
32
|
+
@integrate_mission_control = false
|
|
31
33
|
@notify_with = [:rails_logger]
|
|
32
34
|
@metrics_backends = []
|
|
33
35
|
@disabled_checks = []
|
|
@@ -29,5 +29,25 @@ module SolidQueueGuard
|
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
|
+
|
|
33
|
+
initializer 'solid_queue_guard.mission_control' do
|
|
34
|
+
next unless SolidQueueGuard.config.integrate_mission_control
|
|
35
|
+
|
|
36
|
+
config.after_initialize do
|
|
37
|
+
if defined?(::MissionControl::Jobs)
|
|
38
|
+
SolidQueueGuard::MissionControl::Integration.install!
|
|
39
|
+
else
|
|
40
|
+
Rails.logger.warn(
|
|
41
|
+
'[solid_queue_guard] integrate_mission_control is enabled but mission_control-jobs is not loaded'
|
|
42
|
+
)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
config.to_prepare do
|
|
47
|
+
next unless defined?(::MissionControl::Jobs)
|
|
48
|
+
|
|
49
|
+
SolidQueueGuard::MissionControl::Integration.install_navigation!
|
|
50
|
+
end
|
|
51
|
+
end
|
|
32
52
|
end
|
|
33
53
|
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module SolidQueueGuard
|
|
4
|
+
module MissionControl
|
|
5
|
+
class Integration
|
|
6
|
+
class << self
|
|
7
|
+
def install!
|
|
8
|
+
install_routes!
|
|
9
|
+
install_navigation!
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def install_routes!
|
|
13
|
+
return if routes_installed?
|
|
14
|
+
|
|
15
|
+
::MissionControl::Jobs::Engine.routes.append do
|
|
16
|
+
get 'guard',
|
|
17
|
+
controller: '/solid_queue_guard/mission_control/dashboard',
|
|
18
|
+
action: 'show',
|
|
19
|
+
as: :solid_queue_guard_dashboard
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def install_navigation!
|
|
24
|
+
return unless defined?(::MissionControl::Jobs::NavigationHelper)
|
|
25
|
+
return if navigation_installed?
|
|
26
|
+
|
|
27
|
+
::MissionControl::Jobs::NavigationHelper.prepend(NavigationExtension)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def routes_installed?
|
|
33
|
+
::MissionControl::Jobs::Engine.routes.routes.any? do |route|
|
|
34
|
+
route.name == 'solid_queue_guard_dashboard'
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def navigation_installed?
|
|
39
|
+
::MissionControl::Jobs::NavigationHelper.ancestors.include?(NavigationExtension)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module SolidQueueGuard
|
|
4
|
+
module MissionControl
|
|
5
|
+
module NavigationExtension
|
|
6
|
+
def navigation_sections
|
|
7
|
+
super.tap do |sections|
|
|
8
|
+
sections[:guard] = ['Guard', guard_dashboard_path]
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
private
|
|
13
|
+
|
|
14
|
+
def guard_dashboard_path
|
|
15
|
+
::MissionControl::Jobs::Engine.routes.url_helpers.solid_queue_guard_dashboard_path
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
data/solid_queue_guard.gemspec
CHANGED
|
@@ -45,7 +45,9 @@ Gem::Specification.new do |spec|
|
|
|
45
45
|
spec.add_development_dependency 'appraisal', '~> 2.5'
|
|
46
46
|
spec.add_development_dependency 'debug'
|
|
47
47
|
spec.add_development_dependency 'minitest', '~> 5.0'
|
|
48
|
+
spec.add_development_dependency 'mission_control-jobs', '>= 1.0'
|
|
48
49
|
spec.add_development_dependency 'mocha', '>= 2.1'
|
|
50
|
+
spec.add_development_dependency 'propshaft', '>= 1.0'
|
|
49
51
|
spec.add_development_dependency 'puma', '>= 6.0'
|
|
50
52
|
spec.add_development_dependency 'rails', rails_version
|
|
51
53
|
spec.add_development_dependency 'rubocop', '~> 1.75'
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: solid_queue_guard
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Rafael Pissardo
|
|
@@ -171,6 +171,20 @@ dependencies:
|
|
|
171
171
|
- - "~>"
|
|
172
172
|
- !ruby/object:Gem::Version
|
|
173
173
|
version: '5.0'
|
|
174
|
+
- !ruby/object:Gem::Dependency
|
|
175
|
+
name: mission_control-jobs
|
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
|
177
|
+
requirements:
|
|
178
|
+
- - ">="
|
|
179
|
+
- !ruby/object:Gem::Version
|
|
180
|
+
version: '1.0'
|
|
181
|
+
type: :development
|
|
182
|
+
prerelease: false
|
|
183
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
184
|
+
requirements:
|
|
185
|
+
- - ">="
|
|
186
|
+
- !ruby/object:Gem::Version
|
|
187
|
+
version: '1.0'
|
|
174
188
|
- !ruby/object:Gem::Dependency
|
|
175
189
|
name: mocha
|
|
176
190
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -185,6 +199,20 @@ dependencies:
|
|
|
185
199
|
- - ">="
|
|
186
200
|
- !ruby/object:Gem::Version
|
|
187
201
|
version: '2.1'
|
|
202
|
+
- !ruby/object:Gem::Dependency
|
|
203
|
+
name: propshaft
|
|
204
|
+
requirement: !ruby/object:Gem::Requirement
|
|
205
|
+
requirements:
|
|
206
|
+
- - ">="
|
|
207
|
+
- !ruby/object:Gem::Version
|
|
208
|
+
version: '1.0'
|
|
209
|
+
type: :development
|
|
210
|
+
prerelease: false
|
|
211
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
212
|
+
requirements:
|
|
213
|
+
- - ">="
|
|
214
|
+
- !ruby/object:Gem::Version
|
|
215
|
+
version: '1.0'
|
|
188
216
|
- !ruby/object:Gem::Dependency
|
|
189
217
|
name: puma
|
|
190
218
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -280,6 +308,12 @@ files:
|
|
|
280
308
|
- Rakefile
|
|
281
309
|
- app/controllers/solid_queue_guard/application_controller.rb
|
|
282
310
|
- app/controllers/solid_queue_guard/health_controller.rb
|
|
311
|
+
- app/controllers/solid_queue_guard/mission_control/base_controller.rb
|
|
312
|
+
- app/controllers/solid_queue_guard/mission_control/dashboard_controller.rb
|
|
313
|
+
- app/helpers/solid_queue_guard/mission_control/dashboard_helper.rb
|
|
314
|
+
- app/views/solid_queue_guard/mission_control/dashboard/_check.html.erb
|
|
315
|
+
- app/views/solid_queue_guard/mission_control/dashboard/_summary_metrics.html.erb
|
|
316
|
+
- app/views/solid_queue_guard/mission_control/dashboard/show.html.erb
|
|
283
317
|
- config/routes.rb
|
|
284
318
|
- lib/generators/solid_queue_guard/install/USAGE
|
|
285
319
|
- lib/generators/solid_queue_guard/install/USAGE.ci
|
|
@@ -330,6 +364,8 @@ files:
|
|
|
330
364
|
- lib/solid_queue_guard/metrics/open_telemetry.rb
|
|
331
365
|
- lib/solid_queue_guard/metrics/prometheus.rb
|
|
332
366
|
- lib/solid_queue_guard/metrics/statsd.rb
|
|
367
|
+
- lib/solid_queue_guard/mission_control/integration.rb
|
|
368
|
+
- lib/solid_queue_guard/mission_control/navigation_extension.rb
|
|
333
369
|
- lib/solid_queue_guard/notifier.rb
|
|
334
370
|
- lib/solid_queue_guard/notifiers/base.rb
|
|
335
371
|
- lib/solid_queue_guard/puma_plugin_support.rb
|