metrics.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. """调用计量中间件"""
  2. from __future__ import annotations
  3. import time
  4. from dataclasses import dataclass, field
  5. @dataclass
  6. class ToolMetrics:
  7. call_count: int = 0
  8. total_latency_ms: float = 0.0
  9. error_count: int = 0
  10. @property
  11. def avg_latency_ms(self) -> float:
  12. return self.total_latency_ms / self.call_count if self.call_count else 0.0
  13. @property
  14. def error_rate(self) -> float:
  15. return self.error_count / self.call_count if self.call_count else 0.0
  16. class MetricsCollector:
  17. """记录每个工具的调用频次、耗时、错误率"""
  18. def __init__(self) -> None:
  19. self._metrics: dict[str, ToolMetrics] = {}
  20. def record(self, tool_id: str, latency_ms: float, error: bool = False) -> None:
  21. if tool_id not in self._metrics:
  22. self._metrics[tool_id] = ToolMetrics()
  23. m = self._metrics[tool_id]
  24. m.call_count += 1
  25. m.total_latency_ms += latency_ms
  26. if error:
  27. m.error_count += 1
  28. def get(self, tool_id: str) -> ToolMetrics | None:
  29. return self._metrics.get(tool_id)
  30. def all(self) -> dict[str, ToolMetrics]:
  31. return dict(self._metrics)