Ruby on Rails

Status page and uptime monitoring for Rails apps

Monitor Rails controllers, Active Record connections, Sidekiq queues, and Redis. Pretty status page or build your own via our API.

Three ways to ship a status page for Ruby on Rails

Pick the level of control you need — zero-code, low-code, or full headless.

Hosted

Add your Ruby on Rails endpoint, point a CNAME at status.yourdomain.com, done. Works in 5 minutes.

Headless

Use our public API to build your own UI inside your Ruby on Rails app. Full control over design and branding.

See the API

Embedded badges

Drop SVG uptime and status badges into your README or landing page. Auto-updates every 5 minutes.

Drop this health endpoint into your Ruby on Rails app

Copy, paste, point PulseAPI at the URL. Returns 200 when healthy, 503 when degraded.

app/controllers/health_controller.rb
class HealthController < ApplicationController
  skip_before_action :authenticate_user!, raise: false

  def show
    checks = {
      database: active_record_ok? ? "ok" : "fail",
      cache: cache_ok? ? "ok" : "fail",
      sidekiq: sidekiq_ok? ? "ok" : "fail",
    }
    healthy = checks.values.all? { |v| v == "ok" }
    render json: { status: healthy ? "healthy" : "degraded", **checks },
           status: healthy ? 200 : 503
  end

  private

  def active_record_ok?
    ActiveRecord::Base.connection.execute("SELECT 1") && true
  rescue StandardError
    false
  end

  def cache_ok?
    Rails.cache.write("health:probe", "1", expires_in: 5.seconds)
    Rails.cache.read("health:probe") == "1"
  rescue StandardError
    false
  end

  def sidekiq_ok?
    Sidekiq.redis { |c| c.ping == "PONG" }
  rescue StandardError
    false
  end
end

Wire with `get "/health", to: "health#show"` in routes.rb. Skip CSRF, auth, and any middleware that would 401 a probe.

What breaks in Ruby on Rails apps — and how to catch it

Sidekiq queues silently growing

A stuck worker lets a queue balloon while the app keeps serving traffic. Expose queue-depth and alert on threshold.

N+1 regressions

A missing .includes() can 10x response time. Response-time assertions catch it in the first minute post-deploy.

Connection pool starvation

Long queries block the pool and requests pile up. A fast-timeout health endpoint surfaces this before ActionCable drops users.

Headless angle

Don't like our status page? Build your own in Ruby on Rails.

Our API returns the same data our hosted UI consumes. Full OpenAPI spec documented at api.pulseapi.tech/docs.

app/controllers/status_controller.rb — build your own status UI on top of our API.
require "net/http"
require "json"

class StatusController < ApplicationController
  def show
    uri = URI("https://api.pulseapi.tech/status/acme")
    @data = JSON.parse(Net::HTTP.get(uri))
  end
end

Ruby on Rails monitoring — FAQ

Does it work with Rails, Sinatra, Hanami, or Padrino?

Yes. Monitoring is HTTP-level — the framework does not matter.

How do I monitor a Sidekiq queue?

Return current queue depth from a controller action and alert above a threshold. PulseAPI supports JSON-path so `$.queue_depth < 100` works.

Does it work with Heroku, Fly.io, and Render?

Yes, and with any deployment. PulseAPI only needs a public URL.

Can I embed the status page inside the Rails app?

Yes. Hit the public API from a controller, render a template, or use a turbo_frame with a server-rendered partial.

Start monitoring your Ruby on Rails app in 5 minutes

Free tier. No credit card. Add your endpoint and get alerts when it breaks.