From d76e54e22d88ae75cc72db26592b4cbb0edd1097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brage=20Skj=C3=B8nborg?= Date: Sun, 18 Jan 2026 16:49:56 +0100 Subject: [PATCH] Fixes --- apps/py-metadata/api/health_api.py | 18 ++++++++++-------- apps/py-watcher/api/health_api.py | 26 ++++++++++++++++++++------ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/apps/py-metadata/api/health_api.py b/apps/py-metadata/api/health_api.py index ac58dd6b..651f27d3 100644 --- a/apps/py-metadata/api/health_api.py +++ b/apps/py-metadata/api/health_api.py @@ -5,15 +5,11 @@ from fastapi.responses import JSONResponse app = FastAPI() -# Disse settes av app.py db = None get_worker_heartbeat = None 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 db = database get_worker_heartbeat = heartbeat_ref @@ -23,20 +19,24 @@ def init_health_api(database, heartbeat_ref): async def health(): db_ok = False worker_ok = False + db_error = None + worker_error = None # Sjekk database try: db.ping() db_ok = True - except Exception: + except Exception as e: db_ok = False + db_error = str(e) # Sjekk worker heartbeat try: last = get_worker_heartbeat() - worker_ok = (time.time() - last) < 10 # 10 sekunder uten heartbeat = død - except Exception: + worker_ok = (time.time() - last) < 10 + except Exception as e: worker_ok = False + worker_error = str(e) status = db_ok and worker_ok @@ -45,6 +45,8 @@ async def health(): content={ "status": "ok" if status else "error", "database": db_ok, - "worker": worker_ok + "database_error": db_error, + "worker": worker_ok, + "worker_error": worker_error } ) diff --git a/apps/py-watcher/api/health_api.py b/apps/py-watcher/api/health_api.py index 784adc4b..d34fc8f8 100644 --- a/apps/py-watcher/api/health_api.py +++ b/apps/py-watcher/api/health_api.py @@ -14,26 +14,37 @@ def create_health_app(observers_ref, db_ref, heartbeat_ref): @app.get("/health") def health(): - # Sjekk observers + # --- Observer status --- observers = observers_ref() 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_error = None try: db_ref().ping() db_ok = True - except Exception: + except Exception as e: db_ok = False + db_error = str(e) - # Sjekk worker heartbeat + # --- Worker heartbeat --- worker_ok = False + worker_error = None try: last = heartbeat_ref() 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_error = str(e) + # --- Combined status --- healthy = observers_ok and db_ok and worker_ok return JSONResponse( @@ -41,8 +52,11 @@ def create_health_app(observers_ref, db_ref, heartbeat_ref): content={ "status": "healthy" if healthy else "unhealthy", "observers": observers_ok, + "observers_error": observers_error, "database": db_ok, - "worker": worker_ok + "database_error": db_error, + "worker": worker_ok, + "worker_error": worker_error } )