| """ |
| Performance monitoring middleware for API endpoints |
| """ |
| import time |
| from typing import Callable, Awaitable |
| from fastapi import Request, Response |
| from fastapi.middleware.base import BaseHTTPMiddleware |
| from src.core.logging import structured_logger |
| from src.utils.performance import measure_execution_time |
|
|
| class PerformanceMonitoringMiddleware(BaseHTTPMiddleware): |
| """Middleware to monitor API performance and collect metrics""" |
|
|
| async def dispatch(self, request: Request, call_next: Callable[[Request], Awaitable[Response]]) -> Response: |
| """Process request and measure performance""" |
| start_time = time.time() |
| user_id = request.headers.get("X-User-Id", "unknown") |
|
|
| |
| structured_logger.log_request(request, user_id=user_id) |
|
|
| try: |
| |
| response = await call_next(request) |
| except Exception as e: |
| |
| structured_logger.log_error(e, request, user_id=user_id) |
| raise |
| finally: |
| |
| processing_time_ms = (time.time() - start_time) * 1000 |
|
|
| |
| structured_logger.log_response(response, request, processing_time_ms) |
|
|
| |
| self.log_performance_metrics(request, response, processing_time_ms, user_id) |
|
|
| return response |
|
|
| def log_performance_metrics(self, request: Request, response: Response, |
| processing_time_ms: float, user_id: str) -> None: |
| """Log various performance metrics""" |
| |
| structured_logger.log_metric( |
| "request_processing_time", |
| processing_time_ms, |
| { |
| "method": request.method, |
| "path": request.url.path, |
| "status_code": response.status_code, |
| "user_id": user_id |
| } |
| ) |
|
|
| |
| structured_logger.log_metric( |
| "database_query_performance", |
| 0.0, |
| { |
| "method": request.method, |
| "path": request.url.path, |
| "status_code": response.status_code, |
| "user_id": user_id |
| } |
| ) |
|
|
| |
| response_size = len(response.body or b"") if response.body else 0 |
| structured_logger.log_metric( |
| "response_size", |
| response_size, |
| { |
| "method": request.method, |
| "path": request.url.path, |
| "status_code": response.status_code, |
| "user_id": user_id |
| } |
| ) |
|
|
| |
| structured_logger.log_metric( |
| "rate_limit_metrics", |
| 0.0, |
| { |
| "method": request.method, |
| "path": request.url.path, |
| "status_code": response.status_code, |
| "user_id": user_id |
| } |
| ) |
|
|
| |
| performance_monitoring_middleware = PerformanceMonitoringMiddleware() |