| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- package rag
- import (
- "sync"
- "time"
- )
- // Metrics 性能指标
- type Metrics struct {
- mu sync.RWMutex
-
- // 检索指标
- TotalQueries int64
- SuccessfulQueries int64
- FailedQueries int64
-
- // 缓存指标
- CacheHits int64
- CacheMisses int64
-
- // 延迟指标
- TotalLatency time.Duration
- MinLatency time.Duration
- MaxLatency time.Duration
- }
- // NewMetrics 创建性能指标实例
- func NewMetrics() *Metrics {
- return &Metrics{
- MinLatency: time.Hour, // 初始值设为很大
- }
- }
- // RecordQuery 记录查询
- func (m *Metrics) RecordQuery(success bool, latency time.Duration, cacheHit bool) {
- m.mu.Lock()
- defer m.mu.Unlock()
- m.TotalQueries++
- if success {
- m.SuccessfulQueries++
- } else {
- m.FailedQueries++
- }
- if cacheHit {
- m.CacheHits++
- } else {
- m.CacheMisses++
- }
- m.TotalLatency += latency
- if latency < m.MinLatency {
- m.MinLatency = latency
- }
- if latency > m.MaxLatency {
- m.MaxLatency = latency
- }
- }
- // GetStats 获取统计信息
- func (m *Metrics) GetStats() map[string]interface{} {
- m.mu.RLock()
- defer m.mu.RUnlock()
- avgLatency := time.Duration(0)
- if m.TotalQueries > 0 {
- avgLatency = m.TotalLatency / time.Duration(m.TotalQueries)
- }
- successRate := float64(0)
- if m.TotalQueries > 0 {
- successRate = float64(m.SuccessfulQueries) / float64(m.TotalQueries) * 100
- }
- cacheHitRate := float64(0)
- totalCacheRequests := m.CacheHits + m.CacheMisses
- if totalCacheRequests > 0 {
- cacheHitRate = float64(m.CacheHits) / float64(totalCacheRequests) * 100
- }
- return map[string]interface{}{
- "total_queries": m.TotalQueries,
- "successful_queries": m.SuccessfulQueries,
- "failed_queries": m.FailedQueries,
- "success_rate": successRate,
- "cache_hits": m.CacheHits,
- "cache_misses": m.CacheMisses,
- "cache_hit_rate": cacheHitRate,
- "average_latency_ms": avgLatency.Milliseconds(),
- "min_latency_ms": m.MinLatency.Milliseconds(),
- "max_latency_ms": m.MaxLatency.Milliseconds(),
- }
- }
- // Reset 重置指标
- func (m *Metrics) Reset() {
- m.mu.Lock()
- defer m.mu.Unlock()
- m.TotalQueries = 0
- m.SuccessfulQueries = 0
- m.FailedQueries = 0
- m.CacheHits = 0
- m.CacheMisses = 0
- m.TotalLatency = 0
- m.MinLatency = time.Hour
- m.MaxLatency = 0
- }
|