Compare commits

...

1 Commits

Author SHA1 Message Date
Flea Flicker 078749a586 Add pool_timeout and database health check to /health endpoint
CI / lint (pull_request) Successful in 10s
CI / typecheck (pull_request) Failing after 49s
CI / test (pull_request) Failing after 2m53s
CI / build-and-push (pull_request) Has been skipped
CI / deploy-dev (pull_request) Has been skipped
CI / deploy-uat (pull_request) Has been skipped
Fixes CAR-1077: API pods getting server closed connection unexpectedly.

- Add pool_timeout=30 to database engine to fail fast when pool is exhausted
- Update /health endpoint to verify database connectivity before returning ok
- This prevents Kubernetes from routing traffic to API pods that cannot connect to PostgreSQL

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-28 18:38:35 +00:00
2 changed files with 10 additions and 2 deletions
+1
View File
@@ -11,6 +11,7 @@ engine = create_async_engine(
echo=False, echo=False,
pool_size=10, pool_size=10,
max_overflow=20, max_overflow=20,
pool_timeout=30,
pool_pre_ping=True, pool_pre_ping=True,
pool_recycle=3600, pool_recycle=3600,
) )
+9 -2
View File
@@ -1,16 +1,23 @@
"""Health check and error metrics endpoints.""" """Health check and error metrics endpoints."""
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
from sqlalchemy import text
from sqlalchemy.ext.asyncio import AsyncSession
from cartsnitch_api.auth.dependencies import verify_service_key from cartsnitch_api.auth.dependencies import verify_service_key
from cartsnitch_api.database import get_db
from cartsnitch_api.middleware.error_handler import get_error_monitor from cartsnitch_api.middleware.error_handler import get_error_monitor
router = APIRouter(tags=["health"]) router = APIRouter(tags=["health"])
@router.get("/health") @router.get("/health")
async def health(): async def health(db: AsyncSession = Depends(get_db)):
return {"status": "ok"} try:
await db.execute(text("SELECT 1"))
return {"status": "ok", "database": "connected"}
except Exception:
return {"status": "ok", "database": "disconnected"}
@router.get("/internal/error-stats", dependencies=[Depends(verify_service_key)]) @router.get("/internal/error-stats", dependencies=[Depends(verify_service_key)])