|
|
""" |
|
|
Metrics Middleware - Automatically track request metrics |
|
|
Records request count, response times, and error rates |
|
|
""" |
|
|
import time |
|
|
import logging |
|
|
from fastapi import Request |
|
|
from starlette.middleware.base import BaseHTTPMiddleware |
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
class MetricsMiddleware(BaseHTTPMiddleware): |
|
|
""" |
|
|
Middleware to track HTTP request metrics |
|
|
|
|
|
Tracks: |
|
|
- Request count |
|
|
- Response times |
|
|
- Error rates |
|
|
""" |
|
|
|
|
|
async def dispatch(self, request: Request, call_next): |
|
|
"""Process request and track metrics""" |
|
|
|
|
|
if (request.url.path.startswith("/static/") or |
|
|
request.url.path == "/api/system/metrics" or |
|
|
request.url.path == "/api/system/health"): |
|
|
return await call_next(request) |
|
|
|
|
|
|
|
|
start_time = time.time() |
|
|
|
|
|
|
|
|
try: |
|
|
response = await call_next(request) |
|
|
|
|
|
|
|
|
response_time_ms = (time.time() - start_time) * 1000 |
|
|
|
|
|
|
|
|
is_error = response.status_code >= 400 |
|
|
|
|
|
|
|
|
try: |
|
|
from backend.routers.system_metrics_api import get_metrics_tracker |
|
|
tracker = get_metrics_tracker() |
|
|
tracker.record_request(response_time_ms, is_error) |
|
|
except Exception as e: |
|
|
logger.debug(f"Failed to record metrics: {e}") |
|
|
|
|
|
return response |
|
|
|
|
|
except Exception as e: |
|
|
|
|
|
response_time_ms = (time.time() - start_time) * 1000 |
|
|
|
|
|
try: |
|
|
from backend.routers.system_metrics_api import get_metrics_tracker |
|
|
tracker = get_metrics_tracker() |
|
|
tracker.record_request(response_time_ms, is_error=True) |
|
|
except Exception as track_error: |
|
|
logger.debug(f"Failed to record error metrics: {track_error}") |
|
|
|
|
|
|
|
|
raise e |
|
|
|