fix(metrics): развязать vidconf_pipeline_sessions с основным пулом БД
_refresh_pipeline_sessions_gauge и metrics_endpoint ходили через Depends(get_session) — основной пул, разделяемый с API-запросами. В инциденте 07.08 это дало 16 падений в api/metrics.py ровно тогда, когда метрики были нужнее всего (пул исчерпан). db_up/db_pool_* уже были развязаны в 0.0.32, эта метрика — нет (мешал тестовый харнесс). Добавлен get_metrics_session (core/db.py) — отдельный движок с NullPool, как у check_db_up, но с полноценной ORM-сессией для репозитория. Тестовый харнесс (app-фикстура) подменяет её на ту же savepoint-сессию, что и get_session, — иначе /metrics не видел бы данные теста.
This commit is contained in:
@@ -145,13 +145,21 @@ async def db_session(db_connection: AsyncConnection) -> AsyncGenerator[AsyncSess
|
||||
|
||||
@pytest_asyncio.fixture
|
||||
async def app(db_session: AsyncSession) -> AsyncGenerator[FastAPI, None]:
|
||||
"""Экземпляр FastAPI-приложения с `get_session`, подменённым на тестовую (savepoint) сессию."""
|
||||
"""Экземпляр FastAPI-приложения с `get_session`/`get_metrics_session`,
|
||||
подменёнными на тестовую (savepoint) сессию.
|
||||
|
||||
`get_metrics_session` (сессия 37, `core/db.py`) в проде — отдельный от
|
||||
основного пула движок, но в тестах должен указывать на ТУ ЖЕ savepoint-
|
||||
сессию, что и `get_session` — иначе `/metrics` не видел бы данные теста,
|
||||
ещё не закоммиченные за пределы savepoint (см. `test_metrics_api.py`).
|
||||
"""
|
||||
application = create_app()
|
||||
|
||||
async def _override_get_session() -> AsyncGenerator[AsyncSession, None]:
|
||||
yield db_session
|
||||
|
||||
application.dependency_overrides[get_session] = _override_get_session
|
||||
application.dependency_overrides[get_metrics_session] = _override_get_session
|
||||
yield application
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user