Include Loyalty/Communication/Sports Center backends and registry updates alongside production nginx and compose wiring. Co-authored-by: Cursor <cursoragent@cursor.com>
58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
from fastapi import APIRouter, Depends
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app import __version__
|
|
from app.api.deps import get_db
|
|
from app.core.config import settings
|
|
from app.core.database import engine
|
|
from app.providers import supported_channels
|
|
from app.services.monitoring_service import CapabilityService
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/health")
|
|
async def health_check():
|
|
"""Liveness probe — does not touch the database."""
|
|
return {
|
|
"status": "ok",
|
|
"service": settings.service_name,
|
|
"version": __version__,
|
|
"channels": [c["channel"] for c in supported_channels() if c["status"] == "active"],
|
|
}
|
|
|
|
|
|
@router.get("/health/ready")
|
|
async def readiness_check(session: AsyncSession = Depends(get_db)):
|
|
"""Readiness probe — verifies database connectivity."""
|
|
try:
|
|
await session.execute(select(1))
|
|
db_ok = True
|
|
except Exception: # noqa: BLE001
|
|
db_ok = False
|
|
status = "ok" if db_ok else "degraded"
|
|
return {
|
|
"status": status,
|
|
"service": settings.service_name,
|
|
"version": __version__,
|
|
"database": "up" if db_ok else "down",
|
|
"engine": str(engine.url).split("@")[-1] if engine.url else "unknown",
|
|
}
|
|
|
|
|
|
@router.get("/capabilities")
|
|
async def capabilities():
|
|
return CapabilityService().capabilities()
|
|
|
|
|
|
@router.get("/metrics")
|
|
async def metrics_root():
|
|
"""Service-level metrics summary (no tenant). Use /api/v1/monitoring/metrics for tenant metrics."""
|
|
return {
|
|
"service": settings.service_name,
|
|
"version": __version__,
|
|
"hint": "GET /api/v1/monitoring/metrics with X-Tenant-ID for tenant metrics",
|
|
"features": CapabilityService().capabilities()["features"],
|
|
}
|