From 078749a586f8659724e6aabe57173d0436917ee9 Mon Sep 17 00:00:00 2001 From: Flea Flicker Date: Thu, 28 May 2026 18:38:35 +0000 Subject: [PATCH] Add pool_timeout and database health check to /health endpoint 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 --- src/cartsnitch_api/database.py | 1 + src/cartsnitch_api/routes/health.py | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/cartsnitch_api/database.py b/src/cartsnitch_api/database.py index 3c6043c..e9348fb 100644 --- a/src/cartsnitch_api/database.py +++ b/src/cartsnitch_api/database.py @@ -11,6 +11,7 @@ engine = create_async_engine( echo=False, pool_size=10, max_overflow=20, + pool_timeout=30, pool_pre_ping=True, pool_recycle=3600, ) diff --git a/src/cartsnitch_api/routes/health.py b/src/cartsnitch_api/routes/health.py index 0574b10..cef1a6c 100644 --- a/src/cartsnitch_api/routes/health.py +++ b/src/cartsnitch_api/routes/health.py @@ -1,16 +1,23 @@ """Health check and error metrics endpoints.""" 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.database import get_db from cartsnitch_api.middleware.error_handler import get_error_monitor router = APIRouter(tags=["health"]) @router.get("/health") -async def health(): - return {"status": "ok"} +async def health(db: AsyncSession = Depends(get_db)): + 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)])