feat(health): add /healthz endpoint (#26)
This commit is contained in:
parent
ea9e76d090
commit
7e59d3432d
3 changed files with 39 additions and 0 deletions
|
|
@ -6,6 +6,7 @@ from fastapi import FastAPI
|
|||
from fastapi.staticfiles import StaticFiles
|
||||
|
||||
from quartermaster.routes import router
|
||||
from quartermaster.routes_health import router as health_router
|
||||
from quartermaster.routes_month import router as month_router
|
||||
|
||||
STATIC_DIR = Path(__file__).parent / "static"
|
||||
|
|
@ -14,6 +15,7 @@ STATIC_DIR = Path(__file__).parent / "static"
|
|||
def create_app() -> FastAPI:
|
||||
app = FastAPI(title="Quartermaster", version="0.1.0")
|
||||
app.mount("/static", StaticFiles(directory=str(STATIC_DIR)), name="static")
|
||||
app.include_router(health_router)
|
||||
app.include_router(router)
|
||||
app.include_router(month_router)
|
||||
return app
|
||||
|
|
|
|||
30
src/quartermaster/routes_health.py
Normal file
30
src/quartermaster/routes_health.py
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
from fastapi.responses import JSONResponse
|
||||
from sqlalchemy import text
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from quartermaster.db import get_session
|
||||
|
||||
logger = logging.getLogger("quartermaster.health")
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/healthz")
|
||||
def healthz(db: Session = Depends(get_session)) -> JSONResponse:
|
||||
try:
|
||||
db.execute(text("SELECT 1"))
|
||||
except Exception as exc:
|
||||
logger.warning(
|
||||
"healthz check failed",
|
||||
extra={"event": "healthz_failed", "error_class": type(exc).__name__},
|
||||
)
|
||||
return JSONResponse(
|
||||
status_code=503,
|
||||
content={"status": "error", "detail": type(exc).__name__},
|
||||
)
|
||||
return JSONResponse(status_code=200, content={"status": "ok"})
|
||||
7
tests/test_health.py
Normal file
7
tests/test_health.py
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
from __future__ import annotations
|
||||
|
||||
|
||||
def test_healthz_returns_ok(client):
|
||||
response = client.get("/healthz")
|
||||
assert response.status_code == 200
|
||||
assert response.json() == {"status": "ok"}
|
||||
Loading…
Reference in a new issue