go服务暴露/metrics端点需三步:注册gocollector、独立端口绑定0.0.0.0、确保counter调用inc();prometheus采集失败多因targets配置错误、监听地址未绑定通配符或防火墙阻断;for: 2m要求连续满足条件次数≥3×scrape_interval。

Go服务怎么暴露/metrics端点
核心就一句话:http.Handle("/metrics", promhttp.Handler()),但光写这行不够——它默认只暴露空注册表,什么指标都没有。
必须显式注册运行时指标,否则go_goroutines、go_memstats_alloc_bytes这类基础指标压根不会出现。加一行:prometheus.MustRegister(prometheus.NewGoCollector()),放在init()或服务启动早期。
- 别用
http.ListenAndServe(":8080", nil)直接启动,nilhandler 会让所有请求都打到/metrics上,业务路由全失效 - 建议用独立端口(比如
:9091),避免业务 panic 导致监控一起挂掉 - 监听地址别写
127.0.0.1:9091,要写:9091(即绑定""),否则容器外或宿主机上的 Prometheus 访问不到
自定义Counter为什么/metrics里看不到
不是代码没生效,是 Counter 不上报零值——http_requests_total这种指标刚启动时页面里就是空的,属于正常现象。
只有调用过.Inc()或.Add()之后,它才会出现在/metrics输出里。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 确保 handler 函数里真调用了
httpRequestsTotal.WithLabelValues("GET", "/api/v1", "200").Inc(),且 label 值非空(传""或nil会 panic) - label 名称必须和
NewCounterVec初始化时声明的一致:比如定义了[]string{"method", "endpoint", "status"},就不能在调用时传"GET", "/", "2xx"——"2xx"和定义的"status"字段不匹配,指标虽存但查不到 - 如果用的是
prometheus.NewCounter()(非 Vec 版),就别带.WithLabelValues(),否则直接 panic
Prometheus抓不到指标?先盯住这三处
90% 的“采集失败”问题不在 Go 代码里,而在配置和网络层。Prometheus 日志里如果出现server returned HTTP status 404 Not Found或context deadline exceeded,基本就是下面某个环节断了。
-
scrape_configs.targets写的是localhost:8080或容器内网 IP?宿主机上的 Prometheus 根本访问不到,得换成宿主机能路由到的地址,比如host.docker.internal:8080(Docker Desktop)或真实局域网 IP - Go 服务监听绑定的是
127.0.0.1:8080?改成:8080,否则外部连不上 - 防火墙或云服务器安全组是否放行了目标端口?比如你用
:9091暴露 metrics,就得确认该端口在防火墙里是 open 的
for: 2m报警规则为啥总不触发
不是 PromQL 写错了,是评估机制理解偏差。for: 2m 表示「连续 2 分钟内每次 scrape 都满足条件」,而 scrape 间隔默认是 15s,意味着要连续 8 次评估为 true 才触发。
如果 scrape_interval 是 30s,for: 2m 就要求连续 4 次为 true;实际中建议设为 ≥3×scrape_interval,比如 scrape_interval=30s,就写for: 2m或更稳的for: 3m。
- 检查 Prometheus 的
global.scrape_interval配置,再算清楚你的for时长是否足够覆盖至少 3 次 scrape - 用
curl -s http://localhost:9090/api/v1/query?query=ALERTS{alertstate="pending"}手动查 pending 状态,比等邮件/钉钉更快定位规则是否进入 pending 阶段
最容易被忽略的,其实是 label 值的空格和大小写——"200" 和 "200 " 是两个完全不同的时间序列,查不出来时先curl看原始/metrics输出,肉眼比对 label 值是否真一致。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










