为 FastAPI 发布状态页的三种方式
选择所需的控制级别 — 零代码、低代码或完全 headless。
托管
添加 FastAPI 端点,把 CNAME 指向 status.yourdomain.com,完成。5 分钟搞定。
嵌入式徽章
将 SVG 正常运行时间和状态徽章放入 README 或落地页。每 5 分钟自动更新。
把这个 health 端点加入你的 FastAPI 应用
复制、粘贴、把 PulseAPI 指向 URL。健康时返回 200,降级时返回 503。
app/health.py
from fastapi import APIRouter, Response
from sqlalchemy import text
from .db import engine
from .redis import redis
router = APIRouter()
@router.get("/health")
async def health(response: Response) -> dict:
checks: dict[str, str] = {}
try:
async with engine.connect() as conn:
await conn.execute(text("SELECT 1"))
checks["database"] = "ok"
except Exception:
checks["database"] = "fail"
try:
pong = await redis.ping()
checks["cache"] = "ok" if pong else "fail"
except Exception:
checks["cache"] = "fail"
healthy = all(v == "ok" for v in checks.values())
response.status_code = 200 if healthy else 503
return {"status": "healthy" if healthy else "degraded", **checks}把 router 挂到主应用上。部分故障时返回 503 标记降级。JSON-path 断言在返回 schema 上原生可用。
FastAPI 应用会出什么故障 — 如何捕获
异步死锁
遗漏的 `await` 或 async 上下文中的同步调用阻塞事件循环。响应时间突增立即揭示问题。
Pydantic v1→v2 迁移 bug
模型验证变化悄然破坏端点。JSON body 断言捕获 schema 回归。
上游故障
依赖宕机导致端点 502。PulseAPI 在用户报告前发现并告警。
Headless 视角
不喜欢我们的状态页? 用 FastAPI 自己构建。
我们的 API 返回的数据与托管 UI 完全一致。完整 OpenAPI 规范见 api.pulseapi.tech/docs.
将状态数据代理到你自己 /status 的 FastAPI 端点。
import httpx
from fastapi import APIRouter
router = APIRouter()
@router.get("/status")
async def status():
async with httpx.AsyncClient(timeout=5) as client:
r = await client.get("https://api.pulseapi.tech/status/acme")
r.raise_for_status()
return r.json()FastAPI 监控 — FAQ
能与 FastAPI、Starlette 和 Quart 一起使用吗?
可以。三者都暴露标准 HTTP,以同样方式监控。
能否监控后台 worker (Dramatiq、Arq、Celery)?
可以。健康端点通过 worker 跑往返任务,失败或超时返回 503。
如何处理 Pydantic v1 与 v2 的响应?
PulseAPI 只断言最终 JSON。只要断言字段保留,schema 可以在版本间变化。
能否在 FastAPI 内渲染状态页?
可以。用 Jinja2 渲染获取的 API,或把 JSON 返回给前端。结构详见我们的 OpenAPI 规范。