metrics.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package rag
  2. import (
  3. "sync"
  4. "time"
  5. )
  6. // Metrics 性能指标
  7. type Metrics struct {
  8. mu sync.RWMutex
  9. // 检索指标
  10. TotalQueries int64
  11. SuccessfulQueries int64
  12. FailedQueries int64
  13. // 缓存指标
  14. CacheHits int64
  15. CacheMisses int64
  16. // 延迟指标
  17. TotalLatency time.Duration
  18. MinLatency time.Duration
  19. MaxLatency time.Duration
  20. }
  21. // NewMetrics 创建性能指标实例
  22. func NewMetrics() *Metrics {
  23. return &Metrics{
  24. MinLatency: time.Hour, // 初始值设为很大
  25. }
  26. }
  27. // RecordQuery 记录查询
  28. func (m *Metrics) RecordQuery(success bool, latency time.Duration, cacheHit bool) {
  29. m.mu.Lock()
  30. defer m.mu.Unlock()
  31. m.TotalQueries++
  32. if success {
  33. m.SuccessfulQueries++
  34. } else {
  35. m.FailedQueries++
  36. }
  37. if cacheHit {
  38. m.CacheHits++
  39. } else {
  40. m.CacheMisses++
  41. }
  42. m.TotalLatency += latency
  43. if latency < m.MinLatency {
  44. m.MinLatency = latency
  45. }
  46. if latency > m.MaxLatency {
  47. m.MaxLatency = latency
  48. }
  49. }
  50. // GetStats 获取统计信息
  51. func (m *Metrics) GetStats() map[string]interface{} {
  52. m.mu.RLock()
  53. defer m.mu.RUnlock()
  54. avgLatency := time.Duration(0)
  55. if m.TotalQueries > 0 {
  56. avgLatency = m.TotalLatency / time.Duration(m.TotalQueries)
  57. }
  58. successRate := float64(0)
  59. if m.TotalQueries > 0 {
  60. successRate = float64(m.SuccessfulQueries) / float64(m.TotalQueries) * 100
  61. }
  62. cacheHitRate := float64(0)
  63. totalCacheRequests := m.CacheHits + m.CacheMisses
  64. if totalCacheRequests > 0 {
  65. cacheHitRate = float64(m.CacheHits) / float64(totalCacheRequests) * 100
  66. }
  67. return map[string]interface{}{
  68. "total_queries": m.TotalQueries,
  69. "successful_queries": m.SuccessfulQueries,
  70. "failed_queries": m.FailedQueries,
  71. "success_rate": successRate,
  72. "cache_hits": m.CacheHits,
  73. "cache_misses": m.CacheMisses,
  74. "cache_hit_rate": cacheHitRate,
  75. "average_latency_ms": avgLatency.Milliseconds(),
  76. "min_latency_ms": m.MinLatency.Milliseconds(),
  77. "max_latency_ms": m.MaxLatency.Milliseconds(),
  78. }
  79. }
  80. // Reset 重置指标
  81. func (m *Metrics) Reset() {
  82. m.mu.Lock()
  83. defer m.mu.Unlock()
  84. m.TotalQueries = 0
  85. m.SuccessfulQueries = 0
  86. m.FailedQueries = 0
  87. m.CacheHits = 0
  88. m.CacheMisses = 0
  89. m.TotalLatency = 0
  90. m.MinLatency = time.Hour
  91. m.MaxLatency = 0
  92. }