memoryweave/go/internal/metrics/metrics.go

160 lines
4.2 KiB
Go

// 织忆 MemoryWeave — Prometheus 指标
package metrics
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
// ─── 请求延迟 ──────────────────────────────
RequestDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "zhiyi_request_duration_seconds",
Help: "请求延迟分布 (histogram)",
Buckets: prometheus.DefBuckets,
},
[]string{"endpoint"},
)
// ─── 蒸馏队列深度 ──────────────────────────
DistillQueueDepth = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "zhiyi_distill_queue_depth",
Help: "蒸馏队列中待处理的 episode 数",
},
)
// ─── 待解决冲突 ────────────────────────────
ConflictsPending = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "zhiyi_conflicts_pending",
Help: "等待人工裁决的冲突数",
},
)
// ─── LLM 调用计数 ──────────────────────────
DistillLLMCallsToday = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "zhiyi_distill_llm_calls_today",
Help: "今日 LLM 蒸馏调用次数",
},
)
// ─── 整合失败 ──────────────────────────────
ConsolidateFailuresTotal = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "zhiyi_consolidate_failures_total",
Help: "深度整合累计失败次数",
},
)
// ─── 内存 RSS ──────────────────────────────
MemoryRSSBytes = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "zhiyi_memory_rss_bytes",
Help: "进程 RSS 内存 (bytes)",
},
)
// ─── SQLite 数据库大小 ─────────────────────
SQLiteDBSizeBytes = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "zhiyi_sqlite_db_size_bytes",
Help: "SQLite 图谱数据库文件大小 (bytes)",
},
)
// ─── 仪表盘指标(从 Dashboard 映射)─────────
RecallUsefulnessRate = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "zhiyi_recall_usefulness_rate",
Help: "recall 有用率 (0-1)",
},
)
RecallHitRate = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "zhiyi_recall_hit_rate",
Help: "recall 命中率 (0-1)",
},
)
GapClosureRate = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "zhiyi_gap_closure_rate",
Help: "缺口关闭率 (0-1)",
},
)
DeprecatedPerDay = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "zhiyi_deprecated_per_day",
Help: "每日废弃记忆数",
},
)
AutoResolveRate = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "zhiyi_auto_resolve_rate",
Help: "自动解决冲突率 (0-1)",
},
)
TotalMemories = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "zhiyi_total_memories",
Help: "总记忆数",
},
)
TotalEpisodes = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "zhiyi_total_episodes",
Help: "总 episode 数",
},
)
registry *prometheus.Registry
)
func init() {
registry = prometheus.NewRegistry()
registry.MustRegister(
RequestDuration,
DistillQueueDepth,
ConflictsPending,
DistillLLMCallsToday,
ConsolidateFailuresTotal,
MemoryRSSBytes,
SQLiteDBSizeBytes,
RecallUsefulnessRate,
RecallHitRate,
GapClosureRate,
DeprecatedPerDay,
AutoResolveRate,
TotalMemories,
TotalEpisodes,
)
}
// Handler 返回 Prometheus HTTP handler
func Handler() http.Handler {
return promhttp.HandlerFor(registry, promhttp.HandlerOpts{})
}
// SyncFromDashboard 从 Dashboard 同步指标到 Prometheus gauges
func SyncFromDashboard(m map[string]float64) {
if v, ok := m["recall_usefulness_rate"]; ok {
RecallUsefulnessRate.Set(v)
}
if v, ok := m["recall_hit_rate"]; ok {
RecallHitRate.Set(v)
}
if v, ok := m["gap_closure_rate"]; ok {
GapClosureRate.Set(v)
}
if v, ok := m["deprecated_per_day"]; ok {
DeprecatedPerDay.Set(v)
}
if v, ok := m["auto_resolve_rate"]; ok {
AutoResolveRate.Set(v)
}
}