160 lines
4.2 KiB
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)
|
|
}
|
|
}
|