Alertmanager收不到firing告警的主因是告警分组label缺失或不一致,需在rule中显式定义service和instance标签,并确保target_labels正确映射;误报源于阈值脱离业务基线,应结合历史P95分布与业务语义设定;Webhook缺上下文因模板未显式引用labels字段;多模块panic源于全局注册器冲突,须用独立Registry替代DefaultRegistry。

为什么 Alertmanager 收不到 firing 告警
不是 Prometheus 没触发规则,而是 Alertmanager 根本没收到——最常见原因是告警分组 label 缺失或不一致。
-
service和instance必须同时出现在告警 rule 的labels里,否则 Alertmanager 无法路由、分组、去重 - 别依赖 Prometheus 自动注入:rule 中要显式写
labels: { service: "payment", instance: "{{ $labels.instance }}" } - 如果用了 Kubernetes Service DNS 作为
instance,确保 scrape_configs 中target_labels正确映射,否则$labels.instance是空的 - 检查 Alertmanager 日志是否有
dropping alert due to missing group key—— 这是 label 不全的直接证据
告警阈值为什么总误报
用固定百分比(比如 rate(http_requests_total{code=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.01)而不看基线,等于在猜业务行为。
- 先查历史基线:
rate(http_requests_total{code=~"5.."}[1h]) / rate(http_requests_total[1h])跑一整天,看 P95 分布 - 对延迟类指标,永远别用
avg():用histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) - 错误率告警加 duration 条件:
AND ON() (count_over_time(ALERTS{alertstate="firing"}[2m]) >= 2)避免瞬时抖动触发 - 业务语义优先:支付失败率 0.2% 可能正常,但登录失败率 0.2% 就该立刻告警
Webhook 发出去的告警信息总是缺上下文
Alertmanager 默认只渲染 summary 和 description,而 trace_id、order_id、user_id 这些关键字段藏在 labels 里,模板不显式引用就丢了。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
- 在
alert.rules.yml中提前把业务字段塞进 labels:labels: { service: "order", trace_id: "{{ $labels.trace_id }}", order_id: "{{ $labels.order_id }}" } - Webhook 模板里必须用
{{ .Labels.trace_id }},不能指望日志采集端二次 enrich - 企业微信/钉钉接口有频率限制,
repeat_interval: 1h必须配,否则同一告警每分钟刷一次 - 测试 Webhook 时,用
curl -X POST http://your-webhook/ -d @sample-alert.json直接发原始 payload,绕过 Alertmanager 缓存
多模块服务 panic: duplicate metrics collector registration attempted
全局注册器冲突不是配置问题,是代码结构问题——尤其当你引入了云厂商 SDK 或中间件包时,它们可能偷偷调了 prometheus.MustRegister()。
立即学习“go语言免费学习笔记(深入)”;
- 永远不用
prometheus.DefaultRegistry:创建独立 registry:reg := prometheus.NewRegistry() - 所有自定义指标注册都走这个 reg:
reg.MustRegister(httpRequestsTotal) - HTTP handler 必须显式传入:
promhttp.HandlerFor(reg, promhttp.HandlerOpts{}) - /metrics 路由别硬编码为
/metrics,微服务可能有多个 endpoint(如/admin/metrics),需统一前缀约定

















