mirror of
https://github.com/2930134478/AI-CS.git
synced 2026-06-15 00:44:30 +08:00
110 lines
2.2 KiB
Go
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
|
|
}
|