Removes HTTP error

This commit is contained in:
Ulysse Pence 2026-09-01 18:55:27 -02:00
parent 0d1af09534
commit 144862924b
2 changed files with 9 additions and 27 deletions

View File

@ -1,18 +1,15 @@
"""Deriver work metrics as JSON. Errors rather than serving a stale number."""
"""Deriver work metrics as JSON, with the age of the measurement alongside them."""
from logging import getLogger
from fastapi import APIRouter, HTTPException
from src.backlog import DeriverMetricsPoller
from src.config import settings
logger = getLogger(__name__)
router = APIRouter(prefix="/deriver", tags=["deriver"])
MAX_SNAPSHOT_AGE_INTERVALS = 3
_poller: DeriverMetricsPoller | None = None
@ -21,13 +18,6 @@ def set_deriver_metrics_poller(poller: DeriverMetricsPoller | None) -> None:
_poller = poller
def max_snapshot_age_seconds() -> float:
return float(
settings.DERIVER.BACKLOG_METRICS_POLL_INTERVAL_SECONDS
* MAX_SNAPSHOT_AGE_INTERVALS
)
@router.get("/metrics")
async def get_deriver_metrics_response() -> dict[str, float | int]:
"""Seconds of outstanding deriver work, plus the raw counts behind it."""
@ -37,15 +27,6 @@ async def get_deriver_metrics_response() -> dict[str, float | int]:
status_code=503, detail="No deriver measurement available yet"
)
age = snapshot.age_seconds
if age is None or age > max_snapshot_age_seconds():
raise HTTPException(
status_code=503,
detail=f"Deriver measurement is stale ({age:.0f}s old)"
if age is not None
else "Deriver measurement is stale",
)
return {
"outstanding_work_seconds": snapshot.signal_seconds,
"eligible_work_units": snapshot.stats.eligible_work_units,
@ -56,5 +37,5 @@ async def get_deriver_metrics_response() -> dict[str, float | int]:
"embeddings_pending_due": snapshot.stats.embeddings_pending_due,
"dreams_due": snapshot.dreams_due,
"measured_at": snapshot.measured_at,
"measurement_age_seconds": age,
"measurement_age_seconds": snapshot.age_seconds or 0.0,
}

View File

@ -162,20 +162,21 @@ class TestDeriverMetricsRoute:
assert excinfo.value.status_code == 503
async def test_errors_when_the_measurement_is_stale(self):
async def test_serves_an_old_snapshot_with_its_age(self):
"""The caller decides what is too old, from measurement_age_seconds."""
poller = DeriverMetricsPoller()
poller._snapshot = DeriverMetricsSnapshot( # pyright: ignore[reportPrivateUsage]
signal_seconds=0.0,
measured_at=time.time() - (deriver_metrics.max_snapshot_age_seconds() + 60),
signal_seconds=7.0,
measured_at=time.time() - 3600,
)
deriver_metrics.set_deriver_metrics_poller(poller)
try:
with pytest.raises(HTTPException) as excinfo:
await deriver_metrics.get_deriver_metrics_response()
body = await deriver_metrics.get_deriver_metrics_response()
finally:
deriver_metrics.set_deriver_metrics_poller(None)
assert excinfo.value.status_code == 503
assert body["outstanding_work_seconds"] == 7.0
assert body["measurement_age_seconds"] >= 3600
async def test_errors_when_no_poller_is_registered(self):
deriver_metrics.set_deriver_metrics_poller(None)