Rails 8 made Solid Queue the default Active Job backend, and it's excellent: database-backed, no Redis, and Mission Control Jobs gives you a dashboard.
But there's a gap nobody talks about: nothing tells you when things break. Mission Control is a window you have to remember to look through. It has no alerting and no historical metrics. In practice that means one of two things happens:
- You find out your jobs have been failing for three days when a customer emails you, or
- You bolt on Datadog/New Relic — a heavyweight APM subscription to answer "did my background jobs fail?"
For small and mid-size Rails apps, neither is great. So I built QueuePulse.
What it does
QueuePulse reads Solid Queue's existing tables — read-only, no migration, no extra service, no agent process — and notifies you the moment one of five things happens:
| Check | Fires when |
|---|---|
| 🔴 Job failures | a job lands in failed_executions
|
| 🟠 Queue latency | the oldest ready job has waited past your threshold |
| 🟠 Queue depth | a queue backs up beyond N jobs |
| 🟠 Stuck jobs | a job has been "running" far longer than it should |
| 🔴 Dead workers | no worker/dispatcher heartbeat — nothing is processing |
Alerts go to Slack, email, or any webhook.
Setup (2 minutes)
# Gemfile
gem "queue_pulse"
# config/initializers/queue_pulse.rb
QueuePulse.configure do |config|
config.add_notifier QueuePulse::Notifiers::Slack.new(webhook_url: ENV["SLACK_WEBHOOK_URL"])
end
Then schedule the check with Solid Queue's own recurring tasks:
# config/recurring.yml
queue_pulse_check:
class: QueuePulse::CheckJob
schedule: every minute
That's it. Every setting (thresholds, cooldowns) has a sensible default you can override.
Design principles
-
No new infrastructure. It piggybacks on tables you already have. Dedupe state lives in
Rails.cache. - Safe by default. Read-only queries; every check and notifier is exception-isolated, so QueuePulse can never take down your app. Raw job arguments are never sent unless you opt in.
- Quiet. Cooldowns + burst-collapsing (one alert for 500 identical failures, not 500 alerts).
It's free
MIT-licensed, on RubyGems. A hosted dashboard with historical metrics is on the roadmap (waitlist here), but the gem is and stays open source.
If you run Solid Queue in production I'd genuinely love feedback — what would you want alerted on that's missing? Issues and PRs welcome: https://github.com/michiya-59/queue_pulse
Top comments (0)