Go语言Prometheus实战:指标监控体系搭建
Go语言Prometheus实战指标监控体系搭建1. Prometheus概述Prometheus是CNCF毕业项目提供强大的指标采集、存储、查询能力是云原生时代监控的事实标准。2. 指标类型Prometheus支持四种指标类型Counter只增不减的计数器Gauge可增可减的仪表盘Histogram直方图统计分布Summary摘要统计分位数3. Go语言客户端package prometheus import ( github.com/prometheus/client_golang/prometheus github.com/prometheus/client_golang/prometheus/promauto ) var ( httpRequestsTotal promauto.NewCounterVec( prometheus.CounterOpts{ Name: http_requests_total, Help: Total number of HTTP requests, }, []string{method, endpoint, status}, ) httpRequestDuration promauto.NewHistogramVec( prometheus.HistogramOpts{ Name: http_request_duration_seconds, Help: HTTP request duration in seconds, Buckets: []float64{.001, .005, .01, .025, .05, .1, .25, .5, 1}, }, []string{method, endpoint}, ) activeConnections promauto.NewGauge( prometheus.GaugeOpts{ Name: http_active_connections, Help: Number of active HTTP connections, }, ) requestSizeBytes promauto.NewHistogramVec( prometheus.HistogramOpts{ Name: http_request_size_bytes, Help: HTTP request size in bytes, Buckets: prometheus.ExponentialBuckets(100, 10, 8), }, []string{method}, ) responseSizeBytes promauto.NewHistogramVec( prometheus.HistogramOpts{ Name: http_response_size_bytes, Help: HTTP response size in bytes, Buckets: prometheus.ExponentialBuckets(100, 10, 8), }, []string{method, status}, ) ) func RecordHTTPRequest(method, endpoint, status string, duration time.Duration, size int64) { httpRequestsTotal.WithLabelValues(method, endpoint, status).Inc() httpRequestDuration.WithLabelValues(method, endpoint).Observe(duration.Seconds()) responseSizeBytes.WithLabelValues(method, status).Observe(float64(size)) }4. 中间件实现package middleware import ( strconv time github.com/gin-gonic/gin prometheus ) func PrometheusMiddleware() gin.HandlerFunc { return func(c *gin.Context) { path : c.FullPath() if path { path unknown } start : time.Now() c.Next() duration : time.Since(start) status : strconv.Itoa(c.Writer.Status()) prometheus.httpRequestsTotal.WithLabelValues( c.Request.Method, path, status, ).Inc() prometheus.httpRequestDuration.WithLabelValues( c.Request.Method, path, ).Observe(duration.Seconds()) } }5. 自定义指标type BusinessMetrics struct { ordersTotal *prometheus.CounterVec orderAmountTotal *prometheus.Counter activeUsers prometheus.Gauge paymentDuration prometheus.Histogram } func NewBusinessMetrics() *BusinessMetrics { return BusinessMetrics{ ordersTotal: promauto.NewCounterVec( prometheus.CounterOpts{ Name: orders_total, Help: Total number of orders, }, []string{status, payment_method}, ), orderAmountTotal: promauto.NewCounter( prometheus.CounterOpts{ Name: order_amount_total, Help: Total order amount, }, ), activeUsers: promauto.NewGauge( prometheus.GaugeOpts{ Name: active_users, Help: Number of active users, }, ), paymentDuration: promauto.NewHistogram( prometheus.HistogramOpts{ Name: payment_duration_seconds, Help: Payment processing duration, Buckets: []float64{.1, .5, 1, 2, 5, 10}, }, ), } } func (m *BusinessMetrics) RecordOrder(status, paymentMethod string, amount float64) { m.ordersTotal.WithLabelValues(status, paymentMethod).Inc() m.orderAmountTotal.Add(amount) } func (m *BusinessMetrics) SetActiveUsers(count float64) { m.activeUsers.Set(count) } func (m *BusinessMetrics) ObservePaymentDuration(duration time.Duration) { m.paymentDuration.Observe(duration.Seconds()) }6. 总结Prometheus是Go语言应用监控的首选方案通过客户端库可以方便地采集和暴露指标结合Grafana可以实现强大的可视化监控。