vn6295337's picture
Initial commit: Enterprise-AI-Gateway - Secure LLM gateway
bb0c63f
"""
Metrics store for the Enterprise AI Gateway
"""
from dataclasses import dataclass, field
from typing import Dict, List
import threading
@dataclass
class MetricsStore:
"""Thread-safe metrics store for tracking gateway performance"""
total_requests: int = 0
successful_requests: int = 0
blocked_requests: int = 0
total_latency_ms: int = 0
provider_usage: Dict[str, int] = field(default_factory=dict)
cascade_failures: int = 0
pii_detections: int = 0
injection_detections: int = 0
latency_history: List[int] = field(default_factory=list)
_lock: threading.Lock = field(default_factory=threading.Lock, repr=False)
def record_request(
self,
provider: str = None,
latency_ms: int = 0,
blocked: bool = False,
pii_detected: bool = False,
injection_detected: bool = False,
cascade_failed: bool = False
):
"""Record a request with its metrics"""
with self._lock:
self.total_requests += 1
if blocked:
self.blocked_requests += 1
else:
self.successful_requests += 1
self.total_latency_ms += latency_ms
self.latency_history.append(latency_ms)
# Keep only last 100 latency measurements
if len(self.latency_history) > 100:
self.latency_history.pop(0)
if provider:
self.provider_usage[provider] = self.provider_usage.get(provider, 0) + 1
if pii_detected:
self.pii_detections += 1
if injection_detected:
self.injection_detections += 1
if cascade_failed:
self.cascade_failures += 1
def to_dict(self) -> dict:
"""Return metrics as a dictionary"""
with self._lock:
avg_latency = (
self.total_latency_ms / self.successful_requests
if self.successful_requests > 0
else 0
)
return {
"total_requests": self.total_requests,
"successful_requests": self.successful_requests,
"blocked_requests": self.blocked_requests,
"average_latency_ms": round(avg_latency, 2),
"provider_usage": dict(self.provider_usage),
"cascade_failures": self.cascade_failures,
"pii_detections": self.pii_detections,
"injection_detections": self.injection_detections,
"latency_history": list(self.latency_history[-20:]),
}
def reset(self):
"""Reset all metrics"""
with self._lock:
self.total_requests = 0
self.successful_requests = 0
self.blocked_requests = 0
self.total_latency_ms = 0
self.provider_usage = {}
self.cascade_failures = 0
self.pii_detections = 0
self.injection_detections = 0
self.latency_history = []
# Singleton instance
metrics = MetricsStore()