Ruby on Rails

Rails アプリ向けのステータスページと稼働監視

Rails コントローラ、Active Record、Sidekiq キュー、Redis を監視。洗練されたステータスページ、または API で独自構築が可能。

Ruby on Rails のステータスページを公開する 3 つの方法

必要な制御レベルを選択 — ノーコード、ローコード、フルヘッドレス。

ホステッド

Ruby on Rails エンドポイントを追加し status.yourdomain.com に CNAME を向けるだけ。5 分で完成。

ヘッドレス

Public API を使って Ruby on Rails アプリ内に独自 UI を構築。デザインとブランディングを完全制御。

API を見る

埋め込みバッジ

SVG の稼働率・ステータスバッジを README やランディングに埋め込み。5 分ごとに自動更新。

この health エンドポイントを Ruby on Rails アプリに貼り付けます

コピペして PulseAPI を URL に向けるだけ。健康なら 200、劣化なら 503 を返します。

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

routes.rb に `get "/health", to: "health#show"` を記述。CSRF、認証、監視プローブに 401 を返すミドルウェアはスキップしてください。

Ruby on Rails アプリで壊れるもの — それを検知する方法

静かに肥大化する Sidekiq キュー

詰まったワーカーでアプリは動きキューだけが膨らみます。キュー深さを公開して閾値監視を。

N+1 リグレッション

PR で .includes() が抜けるとレスポンスタイムが 10 倍に。レスポンスタイム監視でデプロイ直後 1 分以内に検知。

コネクションプール枯渇

長時間クエリがプールをブロックし滞留。短タイムアウトのヘルスで ActionCable 落下前に発見。

ヘッドレス視点

当社のステータスページが気に入らない? Ruby on Rails で自作してください。

当社 API はホステッド UI と同じデータを返します。完全な OpenAPI 仕様書は api.pulseapi.tech/docs.

app/controllers/status_controller.rb — 当社 API の上に独自ステータス UI を構築。
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 監視 — FAQ

Rails、Sinatra、Hanami、Padrino で動きますか?

すべて動作。監視は HTTP レベルでフレームワーク非依存です。

Sidekiq のキュー監視は?

キュー深さを返すアクションと閾値アラート。JSON-path 対応なので `$.queue_depth < 100` で OK。

Heroku、Fly.io、Render で動作?

はい、任意のデプロイで動作。PulseAPI は公開 URL だけあれば動きます。

Rails 内にステータスページを組み込めますか?

はい。コントローラから Public API を呼びテンプレート描画、または turbo_frame と partial の組み合わせで可能です。

Ruby on Rails アプリの監視を 5 分で開始

無料プラン、クレジットカード不要。エンドポイントを追加して障害時にアラート。