From ba01548088b1e8e6b1707f5527af3a7710475ab8 Mon Sep 17 00:00:00 2001 From: Max Ronzhin Date: Sun, 9 Aug 2026 02:40:10 +0300 Subject: [PATCH] =?UTF-8?q?release:=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F?= =?UTF-8?q?=200.0.32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 2 +- CHANGELOG.md | 46 +++++++++++++++++++++++++++++++++++++++ VERSION | 2 +- deploy/docker-compose.yml | 2 +- 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 499af3f..92681ce 100644 --- a/.env.example +++ b/.env.example @@ -128,7 +128,7 @@ SMTP_TIMEOUT_S=30 # --- Версия инстанса (релиз v0.0.1) --- # install.sh копирует значение из корневого файла VERSION при каждой # установке/обновлении — руками менять не нужно. -VIDCONF_VERSION=0.0.31 +VIDCONF_VERSION=0.0.32 # --- Профили compose. Дефолт ниже (`media,monitoring`) — только для ручного # `docker compose up` БЕЗ install.sh: медиа (LiveKit+coturn) + мониторинг, diff --git a/CHANGELOG.md b/CHANGELOG.md index 14110ae..c692202 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,52 @@ Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/), проект придерживается [семантического версионирования](https://semver.org/lang/ru/). +## [0.0.32] — 2026-08-09 + +Метрики состояния БД и пулов соединений + алерты в Prometheus — по решению +оператора на отказ БД реагируем сигналом, а не автолечением (перезапуск +контейнера при недоступной БД оборвал бы WS у всех, кто в конференциях). +См. разбор инцидента 07.08.2026 (0.0.31): `/api/health` во время отказа +отдавал 200 с `db: false`, а Prometheus скрейпит `/metrics`, где метрик +состояния БД не было вообще — строить алерт было не на чем. + +### Добавлено +- **`vidconf_db_up`** — доступность БД (1/0), проверяется отдельным от + основного пула соединением с коротким таймаутом. Позволяет отличить + «БД лежит» от «основной пул занят под нагрузкой» — это два разных + состояния, и до этого релиза их нечем было различить. +- **`vidconf_db_pool_size`/`_max_overflow`/`_checked_out`** — конфигурация + и занятость основного пула SQLAlchemy. Читаются синхронно из объекта + пула (`engine.pool`), без единого запроса к БД — это единственный + способ получить сигнал именно в момент, когда пул исчерпан. +- **`vidconf_redis_pool_in_use`/`_max_connections`** — занятость пула + Redis (второй потолок того же рода, закрыт в 0.0.31). +- Алерты `deploy/monitoring/alerts.yml` (группа `vidconf-db`): + `DatabaseUnavailable` (`vidconf_db_up == 0`, `for: 30s`, critical) и + `DbConnectionPoolNearExhaustion`/`RedisConnectionPoolNearExhaustion` + (занято > 80% дольше минуты, warning) — ранний сигнал: в инциденте + 07.08 пул заполнялся постепенно по мере входа участников в комнату, + а не рывком от HTTP-нагрузки. +- Дашборд Grafana **«БД и пулы соединений»** + (`deploy/monitoring/grafana/dashboards/db-pool.json`). + +### Технические детали +- `GET /metrics` больше не падает и не виснет при недоступности основного + пула БД: gauge'и о состоянии пула читаются первыми и не зависят от него + (отдельное NullPool-соединение для `db_up`, синхронный снимок для + занятости пула), а зависящий от основного пула `vidconf_pipeline_sessions` + обёрнут таймаутом (2с) — при недоступности оставляет прежнее значение, + не роняя остальные метрики. Полностью развести его с основным пулом не + стали: тестовый харнесс подменяет `get_session` на savepoint-сессию + (`tests/conftest.py`), отдельное соединение не увидело бы несознанные + тестом данные — тот же компромисс, что и в 0.0.31 для `api/chat.py`. +- Проверено вживую на локальном стенде (не только по синтаксису конфига): + остановка Postgres → `vidconf_db_up` = 0, `/metrics` продолжает отвечать, + алерт `DatabaseUnavailable` переходит в `firing`; временно урезанный + пул под нагрузкой → `DbConnectionPoolNearExhaustion` переходит в + `firing` ровно через заявленный `for: 1m`; снятие нагрузки/восстановление + БД — алерты гаснут. + ## [0.0.31] — 2026-08-09 Разбор провала входа на нагрузочном тесте 07.08.2026: комната держала diff --git a/VERSION b/VERSION index 700703b..f9d08f8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.31 \ No newline at end of file +0.0.32 \ No newline at end of file diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index 8c58bf9..992fbdd 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -89,7 +89,7 @@ services: MEDIA_ROOT: ${MEDIA_ROOT:-/app/media} # Версия инстанса (релиз v0.0.1) — install.sh копирует значение # из файла VERSION (корень репозитория) в .env; отдаётся в GET /api/health. - VIDCONF_VERSION: ${VIDCONF_VERSION:-0.0.31} + VIDCONF_VERSION: ${VIDCONF_VERSION:-0.0.32} # Число процессов uvicorn (см. backend/Dockerfile). Дефолт 2 рассчитан # на 4-ядерный сервер, где ядра делятся с LiveKit. Поднимая значение, # проверьте бюджет соединений с БД: каждый воркер держит свой пул