Ruby on Rails

面向 Rails 应用的状态页和正常运行时间监控

监控 Rails 控制器、Active Record、Sidekiq 队列和 Redis。精美状态页或通过 API 自建。

为 Ruby on Rails 发布状态页的三种方式

选择所需的控制级别 — 零代码、低代码或完全 headless。

托管

添加 Ruby on Rails 端点,把 CNAME 指向 status.yourdomain.com,完成。5 分钟搞定。

Headless

通过公共 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 队列悄悄膨胀

卡住的 worker 让队列越积越多而应用仍提供流量。暴露队列深度端点并以阈值断言。

N+1 回归

缺少一个 .includes() 能让响应时间涨十倍。响应时间断言能在 deploy 后一分钟内抓到。

连接池饥饿

长查询阻塞连接池,请求堆积。短超时的健康端点能在 ActionCable 掉用户之前暴露。

Headless 视角

不喜欢我们的状态页? 用 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 队列?

一个 action 返回队列深度,超阈值告警。PulseAPI 支持 JSON-path:`$.queue_depth < 100` 即可。

能与 Heroku、Fly.io 和 Render 配合吗?

可以,任何部署都行。PulseAPI 只需要一个公网 URL。

可以在 Rails 应用内嵌入状态页吗?

可以。在控制器里调用公共 API,渲染模板,或使用 turbo_frame 搭配服务器渲染的 partial。

5 分钟开始监控你的 Ruby on Rails 应用

免费套餐,无需信用卡。添加端点,故障时接收告警。