Go-Prometheus指标采集与监控从Counter到Histogram全栈实践
文章导语
Prometheus是CNCF毕业的监控标准,Go的prometheus/client_golang库是集成Prometheus的首选。本文基于Gin构建完整的指标监控体系。
一、指标类型
go
var (
httpRequestsTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests",
},
[]string{"method", "path", "status"},
)
httpRequestDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "HTTP request latency",
Buckets: prometheus.DefBuckets,
},
[]string{"method", "path"},
)
)
func init() {
prometheus.MustRegister(httpRequestsTotal)
prometheus.MustRegister(httpRequestDuration)
}
二、Gin监控中间件
go
func PrometheusMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
start := time.Now()
c.Next()
status := strconv.Itoa(c.Writer.Status())
httpRequestsTotal.WithLabelValues(c.Request.Method, c.FullPath(), status).Inc()
httpRequestDuration.WithLabelValues(c.Request.Method, c.FullPath()).
Observe(time.Since(start).Seconds())
}
}
// 暴露/metrics端点
r.GET("/metrics", gin.WrapH(promhttp.Handler()))
三、自定义业务指标
go
var (
ordersProcessed = prometheus.NewCounter(prometheus.CounterOpts{
Name: "orders_processed_total",
Help: "Processed orders count",
})
activeUsers = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "active_users",
Help: "Currently active users",
})
)
四、全文总结
- Counter累计计数,只增不减
- Gauge瞬时值,可增可减
- Histogram分布统计,自动计算分位数
- Summary客户端分位数计算
参考文献
- Prometheus Go Client: https://github.com/prometheus/client_golang
- Prometheus文档
- Google SRE Book - Monitoring