Golang Prometheus监控

在Golang项目中集成Prometheus监控时遇到一些问题:

  1. 如何正确暴露metrics接口给Prometheus采集?
  2. 自定义的Counter/Gauge等指标应该在哪里初始化比较合适?
  3. 业务代码中记录指标的最佳实践是什么?会不会影响性能?
  4. 有没有推荐的开源库可以简化Prometheus的集成?
  5. 如何监控Goroutine数量、内存使用等运行时指标?

目前用http.Handler暴露了默认的/metrics,但自定义的业务指标总是显示为0,不知道哪里写错了?

2 回复

Golang集成Prometheus监控,可使用官方client_golang库。通过HTTP暴露/metrics端点,自定义指标(如Counter、Gauge、Histogram)。搭配Grafana可视化,实现应用性能监控和告警。

更多关于Golang Prometheus监控的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中使用Prometheus进行监控,主要包括以下几个关键步骤:

1. 安装依赖

go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp

2. 基础指标类型

  • Counter:累加指标,如请求次数
  • Gauge:可增减指标,如内存使用量
  • Histogram:直方图,统计数据分布
  • Summary:摘要,计算分位数

3. 示例代码

package main

import (
    "net/http"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

// 定义指标
var (
    requestCount = prometheus.NewCounter(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total number of HTTP requests",
        })
    responseTime = prometheus.NewHistogram(
        prometheus.HistogramOpts{
            Name: "http_response_time_seconds",
            Help: "Response time in seconds",
        })
)

func init() {
    // 注册指标
    prometheus.MustRegister(requestCount)
    prometheus.MustRegister(responseTime)
}

func handler(w http.ResponseWriter, r *http.Request) {
    timer := prometheus.NewTimer(responseTime)
    defer timer.ObserveDuration()
    
    requestCount.Inc()
    w.Write([]byte("Hello, World!"))
}

func main() {
    http.HandleFunc("/", handler)
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":8080", nil)
}

4. 关键配置

  • 默认指标端点:/metrics
  • 使用promhttp.Handler()暴露指标
  • 指标名称使用snake_case命名规范

5. 最佳实践

  1. 合理设计指标标签(labels)
  2. 避免标签值基数过高
  3. 使用合适的指标类型
  4. 添加应用相关的业务指标

6. 运行和查看

启动服务后访问:

curl http://localhost:8080/metrics

通过Prometheus Server收集这些指标,再使用Grafana进行可视化展示。这种组合可以为Golang应用提供完整的监控解决方案。

回到顶部