diff --git a/app/main.py b/app/main.py index dc24c33..169e9d9 100644 --- a/app/main.py +++ b/app/main.py @@ -536,6 +536,31 @@ def api_check(model_id: str): } +@app.get("/api/checks/{model_id:path}") +def api_checks(model_id: str): + """Все проверки модели за период — для дропдауна с деталями ошибок.""" + limit = int(os.environ.get("CHECKS_LIMIT", "100")) + db = get_db() + rows = db.execute( + "SELECT ok, latency_ms, checked_at, error FROM checks " + "WHERE model_id=? ORDER BY checked_at DESC LIMIT ?", + (model_id, limit), + ).fetchall() + db.close() + return { + "model_id": model_id, + "checks": [ + { + "ok": bool(r["ok"]), + "latency_ms": r["latency_ms"], + "checked_at": r["checked_at"], + "error": r["error"], + } + for r in rows + ], + } + + @app.get("/", response_class=HTMLResponse) def index(): with open("/app/app/static/index.html") as f: diff --git a/app/static/index.html b/app/static/index.html index 6b5683c..a6f8034 100644 --- a/app/static/index.html +++ b/app/static/index.html @@ -363,6 +363,7 @@ function renderRow(m) { ${statusCell(m.last_ok)} ${uptimeCell(m.uptime_pct, m.history)} + `; } @@ -487,6 +488,16 @@ async function checkOne(modelId, btn) { } } +async function openCheckHistory(modelId, btn) { + const res = await fetch(`/api/checks/${encodeURIComponent(modelId)}`); + const data = await res.json(); + const idx = allData.findIndex(m => m.id === modelId); + if (idx >= 0) { + allData[idx].history = (data.checks || []).map(c => ({ ok: c.ok, latency_ms: c.latency_ms, at: c.checked_at, error: c.error })); + } + applyFilters(); +} + document.getElementById('btn-refresh').addEventListener('click', loadData); document.getElementById('btn-sync').addEventListener('click', async () => { const btn = document.getElementById('btn-sync');