feat(backend): verifie l extension TimescaleDB sur la sonde de disponibilite
/api/v1/health/ready interrogeait la base par un SELECT 1, qui ne distingue pas un PostgreSQL nu d'un PostgreSQL avec TimescaleDB. La sonde lit desormais pg_extension et repond 503 si l'extension manque, cas qui survient quand db/init n'a pas ete joue. - Premiere revision Alembic : aucune table, une garde qui refuse de s'appliquer sans l'extension. - Tests du chemin nominal et de l'extension absente, plus un test marque `integration` contre la vraie base. pytest ecarte ce marqueur par defaut pour que make check reste jouable sans Docker. - conftest recycle l'engine entre les tests : get_engine est lru_cache alors que pytest-asyncio ouvre une boucle par test, et les connexions asyncpg sont liees a leur boucle.
This commit is contained in:
@@ -9,6 +9,8 @@ from app.schemas.health import LivenessStatus, ReadinessStatus
|
||||
logger = get_logger(__name__)
|
||||
router = APIRouter(tags=["health"])
|
||||
|
||||
TIMESCALEDB_VERSION = text("SELECT extversion FROM pg_extension WHERE extname = 'timescaledb'")
|
||||
|
||||
|
||||
@router.get("/live", summary="Sonde de vivacite")
|
||||
async def liveness(settings: SettingsDep) -> LivenessStatus:
|
||||
@@ -23,11 +25,19 @@ async def liveness(settings: SettingsDep) -> LivenessStatus:
|
||||
@router.get("/ready", summary="Sonde de disponibilite")
|
||||
async def readiness(session: SessionDep) -> ReadinessStatus:
|
||||
try:
|
||||
await session.execute(text("SELECT 1"))
|
||||
except (SQLAlchemyError, OSError):
|
||||
version: str | None = await session.scalar(TIMESCALEDB_VERSION)
|
||||
except SQLAlchemyError, OSError:
|
||||
logger.exception("Base de donnees injoignable")
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
||||
detail="Base de donnees injoignable",
|
||||
) from None
|
||||
return ReadinessStatus(status="ready", database="reachable")
|
||||
|
||||
if version is None:
|
||||
logger.error("Extension TimescaleDB absente de la base")
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
||||
detail="Extension TimescaleDB absente",
|
||||
)
|
||||
|
||||
return ReadinessStatus(status="ready", database="reachable", timescaledb=version)
|
||||
|
||||
Reference in New Issue
Block a user