| """RMI Backend — middleware registration. |
| |
| Per v3 unfuck rule #7: add_middleware MUST be called at module level, |
| NOT inside lifespan. FastAPI rejects middleware added after startup. |
| |
| This module owns every middleware registration. Adding a new middleware: |
| 1. Add a `try_register(app, "name")` block below |
| 2. Each block is isolated — one failure doesn't break the rest |
| """ |
| from __future__ import annotations |
|
|
| import logging |
|
|
| log = logging.getLogger(__name__) |
|
|
|
|
| def register_middleware(app) -> None: |
| """Register all middleware. Each registration is isolated.""" |
| _try_register_prometheus(app) |
| _try_register_cost_tracking(app) |
| _try_register_tracing(app) |
|
|
|
|
| def _try_register_prometheus(app) -> None: |
| """Prometheus metrics middleware. Records every request.""" |
| try: |
| from app.core.metrics import PrometheusMiddleware |
| app.add_middleware(PrometheusMiddleware) |
| log.info("middleware_registered name=prometheus") |
| except Exception as exc: |
| log.warning("middleware_skipped name=prometheus err=%s", exc) |
|
|
|
|
| def _try_register_cost_tracking(app) -> None: |
| """M7 — per-tenant/per-route cost tracking.""" |
| try: |
| from app.middleware.cost_tracking import CostTrackingMiddleware, CostBuffer |
| app.add_middleware(CostTrackingMiddleware, buffer=CostBuffer()) |
| log.info("middleware_registered name=cost_tracking") |
| except Exception as exc: |
| log.warning("middleware_skipped name=cost_tracking err=%s", exc) |
|
|
|
|
| def _try_register_tracing(app) -> None: |
| """Request-id + timing middleware (always on).""" |
| try: |
| from app.core.tracing import setup_tracing |
| setup_tracing(app) |
| log.info("middleware_registered name=tracing") |
| except Exception as exc: |
| log.warning("middleware_skipped name=tracing err=%s", exc) |
|
|