This commit is contained in:
Brage Skjønborg 2026-01-18 16:49:56 +01:00
parent 7a3053741c
commit d76e54e22d
2 changed files with 30 additions and 14 deletions

View File

@ -5,15 +5,11 @@ from fastapi.responses import JSONResponse
app = FastAPI() app = FastAPI()
# Disse settes av app.py
db = None db = None
get_worker_heartbeat = None get_worker_heartbeat = None
def init_health_api(database, heartbeat_ref): def init_health_api(database, heartbeat_ref):
"""
Kalles fra app.py for å gi health-API tilgang til DB og worker-heartbeat.
"""
global db, get_worker_heartbeat global db, get_worker_heartbeat
db = database db = database
get_worker_heartbeat = heartbeat_ref get_worker_heartbeat = heartbeat_ref
@ -23,20 +19,24 @@ def init_health_api(database, heartbeat_ref):
async def health(): async def health():
db_ok = False db_ok = False
worker_ok = False worker_ok = False
db_error = None
worker_error = None
# Sjekk database # Sjekk database
try: try:
db.ping() db.ping()
db_ok = True db_ok = True
except Exception: except Exception as e:
db_ok = False db_ok = False
db_error = str(e)
# Sjekk worker heartbeat # Sjekk worker heartbeat
try: try:
last = get_worker_heartbeat() last = get_worker_heartbeat()
worker_ok = (time.time() - last) < 10 # 10 sekunder uten heartbeat = død worker_ok = (time.time() - last) < 10
except Exception: except Exception as e:
worker_ok = False worker_ok = False
worker_error = str(e)
status = db_ok and worker_ok status = db_ok and worker_ok
@ -45,6 +45,8 @@ async def health():
content={ content={
"status": "ok" if status else "error", "status": "ok" if status else "error",
"database": db_ok, "database": db_ok,
"worker": worker_ok "database_error": db_error,
"worker": worker_ok,
"worker_error": worker_error
} }
) )

View File

@ -14,26 +14,37 @@ def create_health_app(observers_ref, db_ref, heartbeat_ref):
@app.get("/health") @app.get("/health")
def health(): def health():
# Sjekk observers # --- Observer status ---
observers = observers_ref() observers = observers_ref()
observers_ok = all(obs.is_alive() for obs in observers) observers_ok = all(obs.is_alive() for obs in observers)
observers_error = None
if not observers_ok:
dead = [type(obs).__name__ for obs in observers if not obs.is_alive()]
observers_error = f"Dead observers: {dead}"
# Sjekk database # --- Database status ---
db_ok = False db_ok = False
db_error = None
try: try:
db_ref().ping() db_ref().ping()
db_ok = True db_ok = True
except Exception: except Exception as e:
db_ok = False db_ok = False
db_error = str(e)
# Sjekk worker heartbeat # --- Worker heartbeat ---
worker_ok = False worker_ok = False
worker_error = None
try: try:
last = heartbeat_ref() last = heartbeat_ref()
worker_ok = (time.time() - last) < 10 worker_ok = (time.time() - last) < 10
except Exception: if not worker_ok:
worker_error = f"Heartbeat too old: {time.time() - last:.1f}s"
except Exception as e:
worker_ok = False worker_ok = False
worker_error = str(e)
# --- Combined status ---
healthy = observers_ok and db_ok and worker_ok healthy = observers_ok and db_ok and worker_ok
return JSONResponse( return JSONResponse(
@ -41,8 +52,11 @@ def create_health_app(observers_ref, db_ref, heartbeat_ref):
content={ content={
"status": "healthy" if healthy else "unhealthy", "status": "healthy" if healthy else "unhealthy",
"observers": observers_ok, "observers": observers_ok,
"observers_error": observers_error,
"database": db_ok, "database": db_ok,
"worker": worker_ok "database_error": db_error,
"worker": worker_ok,
"worker_error": worker_error
} }
) )