HOTFIX výkon: delta-profile cache 44 s/site se přepočítávala každých 15 min
Some checks failed
CI and deploy / deploy (push) Has been cancelled
CI and deploy / migration-check (push) Has been cancelled

fn_fill_forecast_accuracy (tick :02/:17/:32/:47, 4 lokality) na konci volá
fn_refresh_site_pv_delta_profile_cache → fn_pv_forecast_delta_profile =
agregace 120 dní nad 4.1M řádky forecast_accuracy = ~44 s/site na prod
→ ~3 minuty plné DB zátěže KAŽDOU čtvrthodinu → timeouty /sites a
/health/detailed (30 s), celodenní 'pomalý server'.

Fix: (1) cache refresh throttle 6 h přes delta_profile_cached_at (+p_force;
profil má 14d poločas — 4×/den bohatě stačí); (2) 15min tick lookback
48→3 h (insert část); (3) denní 48h catch-up job 05:50.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dusan Vojacek
2026-06-12 14:25:27 +02:00
parent e490e8cd26
commit 11767dfdbd
2 changed files with 39 additions and 2 deletions

View File

@@ -108,7 +108,7 @@ async def lifespan(app: FastAPI):
for site in await _active_site_rows(conn):
try:
n = await conn.fetchval(
"SELECT ems.fn_fill_forecast_accuracy($1, 48)",
"SELECT ems.fn_fill_forecast_accuracy($1, 3)",
site["id"],
)
if n:
@@ -257,6 +257,19 @@ async def lifespan(app: FastAPI):
"scheduled_tuv_usage_stats site=%s failed", site["id"]
)
async def scheduled_forecast_accuracy_catchup() -> None:
"""Denní 48h catch-up (pozdní telemetrie) — 15min tick jede jen 3 h okno."""
async with app.state.pg_pool.acquire() as conn:
for site in await _active_site_rows(conn):
try:
await conn.fetchval(
"SELECT ems.fn_fill_forecast_accuracy($1, 48)", site["id"]
)
except Exception:
logger.exception(
"forecast_accuracy catchup site=%s failed", site["id"]
)
async def scheduled_ev_usage_stats() -> None:
async with app.state.pg_pool.acquire() as conn:
try:
@@ -431,6 +444,14 @@ async def lifespan(app: FastAPI):
id="tuv_usage_stats",
replace_existing=True,
)
scheduler.add_job(
scheduled_forecast_accuracy_catchup,
"cron",
hour=5,
minute=50,
id="forecast_accuracy_catchup",
replace_existing=True,
)
scheduler.add_job(
scheduled_ev_usage_stats,
"cron",