From 621a30cd818099749cc85993b1a64261fb889676 Mon Sep 17 00:00:00 2001 From: david kiania Date: Thu, 2 Jul 2026 23:57:32 +0300 Subject: [PATCH] fix(dashboard_api): jsonable_encoder on /health/ingest (datetime serialize) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ingest-health handler returned reporting.v_ingest_health rows straight to JSONResponse, but last_run_at is a datetime — json.dumps raised TypeError and the endpoint fell into its except, always returning {"overall":"unknown","endpoints":[]}. Every other analytics endpoint already routes through jsonable_encoder; this one didn't. Surfaced when the prod bridge finally got the /health/ingest route. Co-Authored-By: Claude Fable 5 --- dashboard_api_rev.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dashboard_api_rev.py b/dashboard_api_rev.py index 31c33d3..7ea9dc4 100644 --- a/dashboard_api_rev.py +++ b/dashboard_api_rev.py @@ -205,7 +205,10 @@ def ingest_health(): else "stale" if any(r["freshness"] == "stale" for r in rows) else "ok" ) if rows else "unknown" - return JSONResponse({"overall": worst, "endpoints": rows}) + # rows carry last_run_at (datetime) — jsonable_encoder (Decimal→float, + # datetime→ISO) before JSONResponse, else json.dumps raises TypeError + # and the whole feed 500s into the except below. (260702 fix.) + return JSONResponse(jsonable_encoder({"overall": worst, "endpoints": rows})) except Exception: log.exception("ingest-health failed") return JSONResponse(