MediaProcessing/apps/py-metadata/api/health_api.py

67 lines
1.5 KiB
Python

import time
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
db = None
get_worker_heartbeat = None
def init_health_api(database, heartbeat_ref):
global db, get_worker_heartbeat
db = database
get_worker_heartbeat = heartbeat_ref
@app.get("/health")
async def health():
db_ok = False
worker_ok = False
db_error = None
worker_error = None
# --- Database check ---
try:
db.ping()
db_ok = True
except Exception as e:
db_ok = False
db_error = str(e)
# --- Worker check ---
try:
hb = get_worker_heartbeat()
last = hb["ts"]
in_backoff = hb["inBackoff"]
worker_error = hb["error"]
now = time.time()
diff = now - last if last else None
worker_ok = diff is not None and diff < 90 and worker_error is None
if not worker_ok and worker_error is None:
worker_error = f"Heartbeat too old: {diff:.2f}s"
except Exception as e:
worker_ok = False
worker_error = str(e)
hb = {}
status = db_ok and worker_ok
return JSONResponse(
status_code=200 if status else 500,
content={
"status": "healthy" if status else "unhealthy",
"database": db_ok,
"database_error": db_error,
"worker": worker_ok,
"worker_error": worker_error,
**hb # inkluderer alle backoff-feltene
},
headers={"Refresh": "5"} # ← auto-refresh hvert 5. sekund )
)