go服务指标必须被prometheus成功抓取,否则告警失效;需确保正确注册并挂载promhttp.handler()、路径一致、监听地址可外部访问,且指标名、标签、告警规则、路由配置严格对齐。

Go服务暴露的指标必须能被Prometheus实际抓到
没数据,告警就是空中楼阁。常见错误是注册了指标但没挂载 promhttp.Handler(),或者挂载路径和 scrape_configs 里的 metrics_path 不一致。
检查点:
-
http.Handle("/metrics", promhttp.Handler())必须在http.ListenAndServe()前执行,且监听地址不能是127.0.0.1(Prometheus 通常从外部访问) - 用
curl -s http://localhost:8080/metrics | head -n 5确认返回含# TYPE http_requests_total counter这类行 - 如果改了路径(如
/monitor/metrics),Prometheus 配置里必须同步设metrics_path: "/monitor/metrics" - Kubernetes 中若用 ServiceMonitor,确保 Service 的
port.name和 ServiceMonitor 的endpoints.port完全一致
告警规则里的 expr 要先手动验证是否真能查出数据
很多告警长期不触发,不是规则写错,而是压根没匹配到指标。比如 http_request_duration_seconds_bucket 拼成 http_request_latency_seconds_bucket,或标签值写成 status="500" 但实际暴露的是 status_code="500"。
实操建议:
- 打开 Prometheus UI →
/graph页面,直接粘贴规则里的expr执行,看是否返回非空时间序列 - 直方图 P95 表达式
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))要求原始指标名带_bucket后缀,且含le标签 -
rate(http_requests_total{status=~"5.."}[5m])要求http_requests_total注册时带status_code标签,而不是status - 采样窗口别设太小——
[1m]在默认 15s 抓取间隔下可能因数据点不足导致rate()返回空
for: 2m 不是“等2分钟再发”,而是连续满足条件的最短持续时间
这个值受 scrape_interval 实际影响。如果抓取间隔是 30s,那 for: 2m 就意味着要连续 4 次抓取结果都为 true 才触发;中间任意一次 false,计时器就重置。
容易踩的坑:
- 延迟告警用
histogram_quantile(0.95, ...)+for: 2m,但 Go 进程重启后直方图的_sum和_count会归零,头几次rate()计算异常,可能误触发 - 建议搭配
process_start_time_seconds判断是否刚启动,例如加条件:and on(instance) (time() - process_start_time_seconds > 300) - 不要把
for设得比抓取间隔还短(如scrape_interval: 30s却设for: 10s),它不会生效
Alertmanager 收不到告警?先查 route.matchers 和 receiver 配置
Prometheus 显示 FIRING 只代表它生成了告警事件,真正发通知的是 Alertmanager。收不到通知,90% 是路由没匹配上。
关键检查项:
- Go 代码里告警规则的
labels: {severity: "critical"},必须和 Alertmanager 的route.matchers完全对应,比如写成matchers: ['severity="critical"'](注意引号和等号格式) -
receiver名称要在route.receiver和顶层receivers里都存在,且email_configs中的to、from、SMTP 配置齐全 - 用
amtool alert list直接看 Alertmanager 当前收到哪些告警,比翻日志快得多 - 邮件静默失败很常见——确认
global.smtp_from是合法邮箱,且 SMTP 服务器允许该账号发信
复杂点在于指标、规则、路由三者 label 键名和值必须严格对齐,差一个下划线或大小写,整条链路就断掉。调试时别只盯着 Go 代码,要分段验证:/metrics 有数据 → Prometheus 能查到 → 规则评估为 true → Alertmanager 收到 → route 匹配成功 → receiver 可送达。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











