Source code for lalandre_rag.retrieval.metrics
"""Metrics hook interfaces for RAG retrieval instrumentation.
This package remains backend-agnostic. Services register a recorder backend
(Prometheus, OTEL, etc.) at startup.
"""
from abc import ABC, abstractmethod
from typing import Any
[docs]
class RetrievalMetricsRecorder(ABC):
"""Backend-agnostic hook interface for retrieval metrics."""
[docs]
@abstractmethod
def observe_phase(
self,
*,
operation: str,
phase: str,
duration_seconds: float,
) -> None:
"""Record latency for one retrieval phase."""
...
[docs]
@abstractmethod
def observe_error(
self,
*,
operation: str,
phase: str,
exc_or_reason: Any,
) -> None:
"""Record one retrieval error or degradation reason."""
...
class _NoopRetrievalMetricsRecorder(RetrievalMetricsRecorder):
def observe_phase(
self,
*,
operation: str,
phase: str,
duration_seconds: float,
) -> None:
return None
def observe_error(
self,
*,
operation: str,
phase: str,
exc_or_reason: Any,
) -> None:
return None
_recorder: RetrievalMetricsRecorder = _NoopRetrievalMetricsRecorder()
[docs]
def set_retrieval_metrics_recorder(recorder: RetrievalMetricsRecorder) -> None:
"""Register the active retrieval metrics recorder backend."""
global _recorder
_recorder = recorder
[docs]
def observe_retrieval_phase(
*,
operation: str,
phase: str,
duration_seconds: float,
) -> None:
"""Forward one retrieval phase observation to the active recorder."""
_recorder.observe_phase(
operation=operation,
phase=phase,
duration_seconds=duration_seconds,
)
[docs]
def observe_retrieval_error(
*,
operation: str,
phase: str,
exc_or_reason: Any,
) -> None:
"""Forward one retrieval error observation to the active recorder."""
_recorder.observe_error(
operation=operation,
phase=phase,
exc_or_reason=exc_or_reason,
)