File size: 911 Bytes
fee2f22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
"""Request middleware for API latency metrics."""

from __future__ import annotations

import time

from starlette.middleware.base import BaseHTTPMiddleware
from starlette.requests import Request

from backend.monitoring.metrics import api_request_duration_seconds


class MetricsMiddleware(BaseHTTPMiddleware):
    """Capture request duration/status and emit Prometheus metrics."""

    async def dispatch(self, request: Request, call_next):
        start = time.perf_counter()
        status_code = 500
        try:
            response = await call_next(request)
            status_code = response.status_code
            return response
        finally:
            elapsed = time.perf_counter() - start
            api_request_duration_seconds.labels(
                method=request.method,
                endpoint=request.url.path,
                status=str(status_code),
            ).observe(elapsed)