performance.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. """
  2. 性能监控模块
  3. """
  4. import time
  5. from typing import List, Dict
  6. from statistics import mean, median
  7. from loguru import logger
  8. class PerformanceMonitor:
  9. """性能监控器"""
  10. def __init__(self):
  11. self.latencies: List[float] = []
  12. self.audio_sent_total = 0
  13. self.audio_received_total = 0
  14. self.session_count = 0
  15. self.error_count = 0
  16. self.start_time = time.time()
  17. def record_latency(self, latency_ms: float):
  18. """记录延迟"""
  19. self.latencies.append(latency_ms)
  20. # 只保留最近1000次
  21. if len(self.latencies) > 1000:
  22. self.latencies.pop(0)
  23. # 警告高延迟
  24. if latency_ms > 500:
  25. logger.warning(f"高延迟检测: {latency_ms:.2f}ms")
  26. def record_audio_sent(self, bytes_count: int):
  27. """记录发送的音频"""
  28. self.audio_sent_total += bytes_count
  29. def record_audio_received(self, bytes_count: int):
  30. """记录接收的音频"""
  31. self.audio_received_total += bytes_count
  32. def record_session(self):
  33. """记录会话"""
  34. self.session_count += 1
  35. def record_error(self):
  36. """记录错误"""
  37. self.error_count += 1
  38. def get_stats(self) -> Dict:
  39. """获取统计信息"""
  40. stats = {
  41. 'uptime_seconds': int(time.time() - self.start_time),
  42. 'total_sessions': self.session_count,
  43. 'total_errors': self.error_count,
  44. 'audio_sent_mb': round(self.audio_sent_total / 1024 / 1024, 2),
  45. 'audio_received_mb': round(self.audio_received_total / 1024 / 1024, 2),
  46. }
  47. if self.latencies:
  48. stats.update({
  49. 'avg_latency_ms': round(mean(self.latencies), 2),
  50. 'median_latency_ms': round(median(self.latencies), 2),
  51. 'min_latency_ms': round(min(self.latencies), 2),
  52. 'max_latency_ms': round(max(self.latencies), 2),
  53. 'p95_latency_ms': round(self._percentile(self.latencies, 0.95), 2),
  54. 'p99_latency_ms': round(self._percentile(self.latencies, 0.99), 2),
  55. })
  56. return stats
  57. def _percentile(self, data: List[float], percentile: float) -> float:
  58. """计算百分位数"""
  59. if not data:
  60. return 0
  61. sorted_data = sorted(data)
  62. index = int(len(sorted_data) * percentile)
  63. return sorted_data[min(index, len(sorted_data) - 1)]
  64. def reset(self):
  65. """重置统计"""
  66. self.latencies.clear()
  67. self.audio_sent_total = 0
  68. self.audio_received_total = 0
  69. self.session_count = 0
  70. self.error_count = 0
  71. self.start_time = time.time()
  72. logger.info("性能监控已重置")
  73. # 全局性能监控实例
  74. performance_monitor = PerformanceMonitor()