如何在Golang中使用Prometheus监控指标_收集和报警

Go集成Prometheus需暴露/metrics端点并配置Prometheus抓取,用client_golang注册Counter、Gauge、Histogram等指标,再通过rule_files定义告警规则交由Alertmanager通知。

在 Go 语言中集成 Prometheus 主要分两步:暴露指标供 Prometheus 抓取,以及通过 Alertmanager 配合规则实现报警。核心是用 prometheus/client_golang 库注册和收集指标,再配置 Prometheus Server 定期拉取,最后定义告警规则触发通知。

暴露 HTTP 指标端点

最常用的方式是启动一个 HTTP 服务,将指标以文本格式暴露在 /metrics 路径下:

  • 导入 github.com/prometheus/client_golang/prometheus/promhttp
  • 在主程序中注册自定义指标(如计数器、直方图、Gauge)
  • http.Handle("/metrics", promhttp.Handler()) 暴露端点
  • 确保该端口(如 :2112)对 Prometheus Server 可访问

示例代码片段:

http.Handle("/metrics", promhttp.Handler())
go http.ListenAndServe(":2112", nil)

定义和更新业务指标

根据监控目标选择合适指标类型:

  • Counter:只增不减,适合请求总数、错误总数(如 http_requests_total{method="POST",code="200"}
  • Gauge:可增可减,适合当前活跃连接数、内存使用量
  • Histogram:统计分布,如 HTTP 响应延迟(自动分桶并计算分位数)
  • Summary:类似 Histogram,但客户端计算分位数(一般推荐 Histogram)

注册后,在业务逻辑中调用 .Inc().Observe(duration.Seconds()) 等方法更新值。

配置 Prometheus 抓取目标

在 Prometheus 的 prometheus.yml 中添加 job:

scrape_configs:
  - job_name: 'my-go-service'
    static_configs:
      - targets: ['your-go-app-host:2112']

重启 Prometheus 后,可在 Web UI 的 Status > Targets 查看是否健康,Graph 页面输入指标名查询数据。

设置告警规则和通知

告警不在 Go 程序中实现,而是由

Prometheus Server 加载规则文件,并将触发的告警转发给 Alertmanager:

  • 编写 alert.rules.yml,例如当 5 分钟内错误率 > 1% 时告警
  • prometheus.yml 中通过 rule_files: 加载规则
  • 部署 Alertmanager,配置邮件、Webhook 或钉钉等通知渠道
  • Prometheus 与 Alertmanager 通过 alerting.alertmanagers 关联

一条简单规则示例:

- alert: HighErrorRate
  expr: rate(http_requests_total{code=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.01
  for: 2m
  labels:
    severity: warning
  annotations:
    summary: "High HTTP error rate"