Solid Queue has no alerting, so I built QueuePulse
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
Comments
No comments yet. Start the discussion.