Files
AI-CS/backend/service/rag/metrics.go
T
2026-02-02 21:41:47 +08:00

110 lines
2.2 KiB
Go

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
}