Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality.
37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
import asyncio
|
|
from collections import defaultdict
|
|
|
|
|
|
class MetricsRegistry:
|
|
def __init__(self) -> None:
|
|
self._lock = asyncio.Lock()
|
|
self.requests_total = 0
|
|
self.errors_total = 0
|
|
self.latency_total_ms = 0.0
|
|
self.requests_by_path: dict[str, int] = defaultdict(int)
|
|
|
|
async def record(self, path: str, status_code: int, latency_ms: float) -> None:
|
|
async with self._lock:
|
|
self.requests_total += 1
|
|
self.requests_by_path[path] += 1
|
|
self.latency_total_ms += latency_ms
|
|
if status_code >= 500:
|
|
self.errors_total += 1
|
|
|
|
async def snapshot(self) -> dict:
|
|
async with self._lock:
|
|
average = (
|
|
self.latency_total_ms / self.requests_total
|
|
if self.requests_total
|
|
else 0.0
|
|
)
|
|
return {
|
|
"requests_total": self.requests_total,
|
|
"requests_by_path": dict(self.requests_by_path),
|
|
"errors_total": self.errors_total,
|
|
"average_latency_ms": round(average, 3),
|
|
}
|
|
|
|
|
|
metrics = MetricsRegistry()
|