feat(metrics): метрики доступности БД и занятости пулов БД/Redis

vidconf_db_up проверяется отдельным от основного пула соединением
(NullPool, короткий таймаут) — иначе в момент исчерпания пула проверка
сама встала бы в очередь и не отличила бы «БД лежит» от «пул занят».
vidconf_db_pool_* читаются синхронно из engine.pool, без единого запроса
к БД. metrics_endpoint больше не виснет и не падает при недоступном
основном пуле: критичные gauge'и считаются первыми и не зависят от него,
а vidconf_pipeline_sessions (по-прежнему через Depends(get_session) —
тестовый харнесс подменяет её на savepoint-сессию) обёрнут таймаутом
и try/except.
This commit is contained in:
2026-08-09 02:39:59 +03:00
parent c906c97cb8
commit 0e56960714
5 changed files with 238 additions and 5 deletions

View File

@@ -38,6 +38,13 @@ class Settings(BaseSettings):
# и показывает проблему, а не висит полминуты, делая вид, что всё живо.
db_pool_timeout: int = 10
# --- Проверка доступности БД вне основного пула (`core/db.py::check_db_up`) ---
# Таймаут TCP/auth отдельного соединения-пробы (не путать с
# `db_pool_timeout` выше — тот про очередь на основной пул). Дефолт
# asyncpg — 60с, для сигнала мониторинга это неприемлемо долго: пусть
# `vidconf_db_up` станет 0 за секунды, а не через минуту.
db_probe_timeout_s: float = 3.0
# --- Пул соединений с Redis ---
# Считается по УЧАСТНИКАМ, а не по запросам: каждое WS-подключение комнаты
# (`api/chat.py`) держит собственное pub/sub-соединение всё время, пока