topfans/backend/services/statisticService/metrics/metrics.go
zerosaturation f5ece5e1d2 feat(statistic): T3 service skeleton (config + main + healthz + metrics + 10 SQL)
- 6 config blocks (DB/Redis/Channel/Refresh/Partition/Extension with 4 EnableXxx=false)
- 14 Prometheus metric declarations
- self-impl healthz (/healthz + /metrics) — bypasses pkg/health to keep /metrics
- main.go startup: logger → config → DB → Redis → healthz HTTP :21009
- 10 SQL migrations: events partitioned + 4 MV + 3 pre-agg + refresh_log + 7-day initial

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 17:20:53 +08:00

84 lines
2.2 KiB
Go

package metrics
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
)
// 看板 RPC 指标
var (
DashboardRPCTotal = promauto.NewCounterVec(prometheus.CounterOpts{
Name: "dashboard_rpc_total",
Help: "Dashboard RPC total calls",
}, []string{"rpc", "status"})
DashboardRPCDuration = promauto.NewHistogramVec(prometheus.HistogramOpts{
Name: "dashboard_rpc_duration_seconds",
Help: "Dashboard RPC duration",
Buckets: prometheus.DefBuckets,
}, []string{"rpc"})
DashboardCacheHitRate = promauto.NewGauge(prometheus.GaugeOpts{
Name: "dashboard_cache_hit_rate",
Help: "Dashboard cache hit rate (0-1)",
})
)
// 事件采集指标
var (
EventTrackTotal = promauto.NewCounterVec(prometheus.CounterOpts{
Name: "event_track_total",
Help: "Event track total",
}, []string{"event_type", "result"}) // result: accepted/rejected
EventChannelSize = promauto.NewGauge(prometheus.GaugeOpts{
Name: "event_channel_size",
Help: "Event channel current size",
})
EventChannelCapacity = promauto.NewGauge(prometheus.GaugeOpts{
Name: "event_channel_capacity",
Help: "Event channel capacity",
})
EventDroppedTotal = promauto.NewCounter(prometheus.CounterOpts{
Name: "event_dropped_total",
Help: "Total events dropped (channel full)",
})
EventDBInsertTotal = promauto.NewCounterVec(prometheus.CounterOpts{
Name: "event_db_insert_total",
Help: "Event DB insert total",
}, []string{"status"}) // status: success/failed
)
// 物化视图指标
var (
MVRefreshTotal = promauto.NewCounterVec(prometheus.CounterOpts{
Name: "mv_refresh_total",
Help: "Materialized view refresh total",
}, []string{"mv_name", "status"})
MVRefreshDuration = promauto.NewHistogramVec(prometheus.HistogramOpts{
Name: "mv_refresh_duration_seconds",
Help: "MV refresh duration",
Buckets: prometheus.DefBuckets,
}, []string{"mv_name"})
)
// Worker 指标
var (
WorkerRunningCount = promauto.NewGaugeVec(prometheus.GaugeOpts{
Name: "worker_running_count",
Help: "Worker running count (0/1)",
}, []string{"worker_name"})
)
// 分区管理指标
var (
EventsPartitionCount = promauto.NewGauge(prometheus.GaugeOpts{
Name: "events_partition_count",
Help: "Current events partition count",
})
)