File size: 1,392 Bytes
b53ee19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from prometheus_client import Counter, Histogram, Gauge, generate_latest, CONTENT_TYPE_LATEST
from fastapi import Response
import time

# Define Prometheus metrics
prediction_counter = Counter(
    'predictions_total',
    'Total number of predictions made',
    ['model_version', 'status']
)

prediction_duration = Histogram(
    'prediction_duration_seconds',
    'Time spent processing prediction',
    buckets=[0.1, 0.5, 1.0, 2.0, 5.0]
)

model_accuracy = Gauge(
    'model_accuracy',
    'Current model accuracy',
    ['model_version']
)

data_drift_detected = Gauge(
    'data_drift_detected',
    'Whether data drift has been detected (1=yes, 0=no)'
)

active_requests = Gauge(
    'active_requests',
    'Number of active requests'
)


class MetricsMiddleware:
    """Middleware to track request metrics"""
    
    async def __call__(self, request, call_next):
        active_requests.inc()
        start_time = time.time()
        
        try:
            response = await call_next(request)
            return response
        finally:
            active_requests.dec()
            duration = time.time() - start_time
            if request.url.path == "/predict/":
                prediction_duration.observe(duration)


def get_metrics() -> Response:
    """Endpoint to expose Prometheus metrics"""
    return Response(content=generate_latest(), media_type=CONTENT_TYPE_LATEST)