Go应用需通过prometheus/client_golang暴露/metrics接口,注册指标并配置Prometheus抓取,Grafana则连接Prometheus数据源查询指标。

Go 应用怎么暴露指标给 Grafana
Grafana 本身不直接采集 Go 程序的指标,它靠 Prometheus 拉取数据。所以核心是:让 Go 程序跑一个 /metrics HTTP 接口,返回符合 Prometheus 格式的文本(如 http_requests_total{method="GET"} 123)。
最稳妥的做法是用官方库 prometheus/client_golang,别手写格式——哪怕只暴露一个计数器,手拼字符串也容易错格式、漏换行、少类型声明,导致 Prometheus 抓取失败并报 text format parsing error。
- 必须注册
promhttp.Handler()到 HTTP 路由,且路径严格为/metrics(Prometheus 默认拉这个路径) - 所有自定义指标(
prometheus.NewCounter、prometheus.NewGauge等)必须用MustRegister()或显式Register(),否则不会出现在/metrics输出里 - 避免在 handler 里做耗时操作(比如查 DB),
promhttp.Handler()是同步阻塞的,指标暴露慢会拖垮整个健康检查
Grafana 里添加 Go 指标数据源要填什么
不是直接连 Go 程序,而是连 Prometheus 实例。Grafana 的数据源类型选 Prometheus,URL 填 Prometheus 服务地址,比如 http://localhost:9090 —— 注意不是 Go 程序的地址。
如果 Prometheus 和 Go 程序不在同一台机器,要确认两点:Prometheus 能否访问 Go 程序的 /metrics(网络通、端口开),以及 Prometheus 配置里的 scrape_configs 是否包含该目标:
立即学习“go语言免费学习笔记(深入)”;
scrape_configs: - job_name: 'go-app' static_configs: - targets: ['10.0.1.22:8080']
常见错误是填错 target 地址(比如写了 localhost,但 Prometheus 在 Docker 里运行,localhost 指的是容器自己);或者忘记给 Go 程序加 CORS 头(其实不用加,Prometheus 是服务端拉取,不走浏览器,CORS 完全无关)。
在 Grafana 面板里写 Go 相关 PromQL 查询要注意什么
Go 运行时自带的指标(如 go_goroutines、go_memstats_alloc_bytes)前缀固定,但你代码里定义的指标名完全由你控制,命名建议带前缀(如 myapp_http_request_duration_seconds),避免和运行时指标冲突或混淆。
查延迟类指标常用 histogram_quantile(),但新手常忽略分位数计算依赖 _bucket 样本,必须确保指标是 prometheus.NewHistogram 类型,且直方图配置的 Buckets 合理(太密浪费存储,太疏分位不准):
-
histogram_quantile(0.95, sum(rate(myapp_http_request_duration_seconds_bucket[5m])) by (le))—— 注意rate()要套在sum() by (le)外面,顺序反了结果就错 - 如果指标没打标签(label),比如所有请求共用一个
myapp_http_requests_total,那面板就无法按接口路径、状态码下钻,得提前在NewCounterVec里定义labels: []string{"path", "status"}
为什么面板数据为空或显示 no data
先看 Prometheus 是否真抓到了指标:打开 http://<prometheus-url>:9090/targets</prometheus-url>,确认你的 Go job 状态是 UP;再进 http://<prometheus-url>:9090/graph</prometheus-url>,输指标名回车,看有没有样本点。
常见断点位置:
- Go 程序启动后没调用
prometheus.MustRegister()注册指标(尤其是用prometheus.NewCounterVec后忘了.MustRegister()) - Prometheus 配置 reload 了但语法错(
promtool check config可验证),导致 job 没生效 - Grafana 面板时间范围设得太窄(比如只看最近 5 秒),而指标采集间隔是 15 秒,默认抓不到数据
- Go 程序用了非标准端口(如 8081),但 Prometheus 配置里写的是
targets: ['host:8080'],连不上自然没数据
指标上报和面板展示之间至少隔了两层(Go → Prometheus → Grafana),出问题优先查中间环节,别一上来就改 Grafana 面板设置。










