Страница статуса и мониторинг uptime для приложений FastAPI
Мониторинг эндпоинтов FastAPI и async-воркеров. JSON-path ассершны естественны для health-схем FastAPI. Хостед или headless.
Три способа запустить страницу статуса для FastAPI
Выберите нужный уровень контроля — zero-code, low-code или полный headless.
Хостед
Добавьте FastAPI-эндпоинт, направьте CNAME на status.yourdomain.com — готово. 5 минут.
Headless
Через публичный API собрать свою UI прямо в FastAPI-приложении. Полный контроль дизайна и брендинга.
Смотреть APIВстраиваемые бейджи
SVG-бейджи uptime и статуса в README или лендинг. Обновляются каждые 5 минут.
Вставьте этот health endpoint в своё FastAPI-приложение
Скопируйте, вставьте, направьте PulseAPI на URL. 200 — здоров, 503 — деградация.
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 в main app. 503 при частичном сбое — "деградация". JSON-path нативно на возвращаемой схеме.
Что ломается в FastAPI-приложениях и как это поймать
Async-дедлоки
Забытый `await` или sync-вызов в async блокирует event loop. Всплеск response time ловит моментально.
Баги миграции Pydantic v1→v2
Изменения валидации моделей тихо ломают эндпоинты. Body-ассершны на JSON ловят регрессии.
Падения upstream
Зависимости падают, эндпоинты отдают 502. PulseAPI ловит это до жалоб пользователей.
Не нравится наша страница статуса? Соберите свою на FastAPI.
Наш API отдаёт те же данные, что потребляет наша хостед-UI. Полная OpenAPI-спека на api.pulseapi.tech/docs.
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 и мониторятся одинаково.
Можно мониторить воркеров (Dramatiq, Arq, Celery)?
Да. Сделайте health, пропускающий задачу через воркер. 503 при неудаче/таймауте.
Как работать с ответами Pydantic v1 vs v2?
PulseAPI ассертит по итоговому JSON. Схема может меняться, пока нужные поля есть.
Можно рендерить страницу статуса внутри FastAPI?
Да. Заберите API и рендерьте через Jinja2, или отдавайте JSON фронтенду. Структура в OpenAPI.
Запустите мониторинг FastAPI-приложения за 5 минут
Бесплатный тариф, без карты. Добавьте эндпоинт, получайте алерты о падениях.