/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.
44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
from fastapi import APIRouter, HTTPException, status
|
|
from sqlalchemy import text
|
|
from sqlalchemy.exc import SQLAlchemyError
|
|
|
|
from app.api.deps import SessionDep, SettingsDep
|
|
from app.core.logging import get_logger
|
|
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:
|
|
return LivenessStatus(
|
|
status="ok",
|
|
service=settings.name,
|
|
version=settings.version,
|
|
environment=settings.env,
|
|
)
|
|
|
|
|
|
@router.get("/ready", summary="Sonde de disponibilite")
|
|
async def readiness(session: SessionDep) -> ReadinessStatus:
|
|
try:
|
|
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
|
|
|
|
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)
|