← Блог

Health check пула соединений с БД для API-only SaaS

Под нагрузкой приложение отдаёт 500 не потому, что Postgres мёртв — исчерпан connection pool. Внешний монитор, бьющий в /, узнает позже клиентов.

StillOnline фиксирует HTTP-код и задержку на зарегистрированном URL. /health или /ready, который берёт соединение и отдаёт 503 при насыщении pool, превращает давление в DOWN на странице статуса.

Краткий ответ

GET /ready (или /health, если готовы к blip при деплое) с SELECT 1 или acquire() и коротким timeout503, если соединение не выдали за < 500 мс. URL в StillOnline; пять минут на Free, две неудачи подрядDOWN. Исчерпание pool и падение хоста БД различайте в тексте инцидента; код может быть одинаковым 503. Шаблон JSON ниже; паттерны API — API-only.

Pool vs простой БД

СимптомHTTPДля клиентаНа status page
Timeout pool под нагрузкой503 на /readyТаймаутыDegraded / Major
Postgres недоступен503Полный отказ APIAPI Outage
Миграциикраткий 503ОшибкиMaintenance
/health без БД200Ложная уверенностьИзбегать для API-only

Пул соединений PostgreSQL конечен — health должен отваливаться быстро.

Шаблон JSON

{
  "status": "ok",
  "checks": {
    "database": "ok"
  }
}

При сбое:

{
  "status": "error",
  "checks": {
    "database": "pool_timeout"
  }
}

503, без строк подключения — дизайн health.

curl -sS -w "\n%{http_code}\n" https://api.yourproduct.com/ready

StillOnline

  1. ПриложениеHTTP/ready200.
  2. Инцидент на APIпубличная страница.
  3. Pro/health и /ready отдельно; Free — один URL.

Ложные алерты.

Связанные материалы

FAQ

Ночные blip pool?

Два fail при 5 мин ≈ 10 мин красного. Сначала pool и timeout.

StillOnline читает поле database в JSON?

Нет — только код HTTP. Маппите pool → 503 в handler.

Хватит status managed БД?

status.supabase.com — платформа, не ваш pool; мониторьте свой /ready.