Solid Queue has no alerting, so I built QueuePulse

작성자

카테고리:

← 피드로
DEV Community · Nishino · 2026-07-17 개발(SW)

Nishino

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:

  1. You find out your jobs have been failing for three days when a customer emails you, or
  2. 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"

Enter fullscreen mode Exit fullscreen mode

# config/initializers/queue_pulse.rb
QueuePulse.configure do |config|
  config.add_notifier QueuePulse::Notifiers::Slack.new(webhook_url: ENV["SLACK_WEBHOOK_URL"])
end

Enter fullscreen mode Exit fullscreen mode

Then schedule the check with Solid Queue’s own recurring tasks:

# config/recurring.yml
queue_pulse_check:
  class: QueuePulse::CheckJob
  schedule: every minute

Enter fullscreen mode Exit fullscreen mode

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

원문에서 계속 ↗

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다