Import source: axon/services/metrics
Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality.
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user