feat(ocr): flip ocr_models_ready to 1 once the lifespan startup finishes
Mirrors the existing _models_ready bool so Prometheus has a time-series liveness/readiness signal for future alerting rules (e.g. ocr_models_ready < 1 for 2m). Refs #652 (AC7) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -69,6 +69,7 @@ async def lifespan(app: FastAPI):
|
||||
kraken_engine.load_models()
|
||||
load_spell_checker()
|
||||
_models_ready = True
|
||||
metrics.ocr_models_ready.set(1)
|
||||
logger.info("Startup complete — ready to accept requests")
|
||||
|
||||
yield
|
||||
|
||||
@@ -422,3 +422,23 @@ async def test_ocr_model_accuracy_gauge_set_per_kind_after_successful_training(f
|
||||
|
||||
assert fresh_metrics.ocr_model_accuracy.labels(kind="recognition")._value.get() == pytest.approx(recognition_accuracy)
|
||||
assert fresh_metrics.ocr_model_accuracy.labels(kind="segmentation")._value.get() == pytest.approx(segmentation_accuracy)
|
||||
|
||||
|
||||
def test_ocr_models_ready_gauge_defaults_to_zero():
|
||||
"""A freshly-built OcrMetrics has ocr_models_ready=0 before lifespan runs."""
|
||||
metrics = build_metrics(CollectorRegistry())
|
||||
assert metrics.ocr_models_ready._value.get() == 0.0
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_ocr_models_ready_gauge_is_one_after_lifespan_startup(fresh_metrics):
|
||||
"""The lifespan flips ocr_models_ready to 1 once load_models / load_spell_checker return.
|
||||
|
||||
ASGITransport does not run lifespan by default, so the lifespan context
|
||||
manager is driven directly to exercise the startup code path.
|
||||
"""
|
||||
assert fresh_metrics.ocr_models_ready._value.get() == 0.0
|
||||
with patch("main.kraken_engine.load_models"), \
|
||||
patch("main.load_spell_checker"):
|
||||
async with app.router.lifespan_context(app):
|
||||
assert fresh_metrics.ocr_models_ready._value.get() == 1.0
|
||||
|
||||
Reference in New Issue
Block a user