File size: 2,198 Bytes
f3b19b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
"""
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"""
        # Skip tracking for static files and the metrics endpoint itself
        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)
        
        # Record start time
        start_time = time.time()
        
        # Process request
        try:
            response = await call_next(request)
            
            # Calculate response time
            response_time_ms = (time.time() - start_time) * 1000
            
            # Check if it's an error response
            is_error = response.status_code >= 400
            
            # Record metrics
            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:
            # Record error
            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}")
            
            # Re-raise the exception
            raise e