为 Ruby on Rails 发布状态页的三种方式
选择所需的控制级别 — 零代码、低代码或完全 headless。
托管
添加 Ruby on Rails 端点,把 CNAME 指向 status.yourdomain.com,完成。5 分钟搞定。
嵌入式徽章
将 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
endRuby 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。