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()
|
kraken_engine.load_models()
|
||||||
load_spell_checker()
|
load_spell_checker()
|
||||||
_models_ready = True
|
_models_ready = True
|
||||||
|
metrics.ocr_models_ready.set(1)
|
||||||
logger.info("Startup complete — ready to accept requests")
|
logger.info("Startup complete — ready to accept requests")
|
||||||
|
|
||||||
yield
|
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="recognition")._value.get() == pytest.approx(recognition_accuracy)
|
||||||
assert fresh_metrics.ocr_model_accuracy.labels(kind="segmentation")._value.get() == pytest.approx(segmentation_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