Golang Prometheus监控
在Golang项目中集成Prometheus监控时遇到一些问题:
- 如何正确暴露metrics接口给Prometheus采集?
- 自定义的Counter/Gauge等指标应该在哪里初始化比较合适?
- 业务代码中记录指标的最佳实践是什么?会不会影响性能?
- 有没有推荐的开源库可以简化Prometheus的集成?
- 如何监控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. 最佳实践
- 合理设计指标标签(labels)
- 避免标签值基数过高
- 使用合适的指标类型
- 添加应用相关的业务指标
6. 运行和查看
启动服务后访问:
curl http://localhost:8080/metrics
通过Prometheus Server收集这些指标,再使用Grafana进行可视化展示。这种组合可以为Golang应用提供完整的监控解决方案。

