DEV Community

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.