Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
"""基础监控与指标采集。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import time
|
|
from contextlib import contextmanager
|
|
from dataclasses import dataclass, field
|
|
from typing import Dict, List
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class MetricRecord:
|
|
name: str
|
|
duration: float
|
|
details: Dict[str, str] = field(default_factory=dict)
|
|
|
|
|
|
class MetricsRecorder:
|
|
"""事件耗时记录器。"""
|
|
|
|
def __init__(self) -> None:
|
|
self._records: List[MetricRecord] = []
|
|
|
|
@contextmanager
|
|
def track(self, name: str, **details: str):
|
|
start = time.perf_counter()
|
|
try:
|
|
yield
|
|
finally:
|
|
duration = time.perf_counter() - start
|
|
self._records.append(MetricRecord(name=name, duration=duration, details=details))
|
|
|
|
def add(self, name: str, duration: float, **details: str) -> None:
|
|
self._records.append(MetricRecord(name=name, duration=duration, details=details))
|
|
|
|
def to_dict(self) -> Dict[str, List[dict]]:
|
|
return {
|
|
"records": [
|
|
{
|
|
"name": record.name,
|
|
"duration": round(record.duration, 4),
|
|
"details": record.details,
|
|
}
|
|
for record in self._records
|
|
]
|
|
}
|
|
|
|
|
|
__all__ = ["MetricsRecorder", "MetricRecord"]
|