直接用rate()算错误率会误报,因未考虑流量基线与服务差异:低qps时段(如凌晨qps=2,1个5xx即达1%)易触发误报,且未区分支付接口常态0.2%与登录接口0.01%的业务语义;正确做法是先查1小时基线p90定阈值,改用sum(rate(...[5m]))>3等绝对值+统一时间窗口组合,并确保histogram_quantile()配sum by(le)。

业务指标预警不能靠堆规则,得从采集源头就绑定语义、对齐时间窗口、带上下文发告警。
为什么直接用 rate() 算错误率会误报
常见写法 rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.01 看似合理,但实际容易在流量低谷期触发——比如凌晨 QPS 只有 2,其中 1 个 5xx 就满足条件。更关键的是,它没考虑服务真实基线:有些支付类接口 5xx 常态就是 0.2%,而登录接口 0.01% 就算异常。
实操建议:
- 先查一小时基线:
rate(http_requests_total{status=~"5.."}[1h]) / rate(http_requests_total[1h]),观察 P90 分位值再定阈值 - 改用绝对值 + 时间窗口组合,例如
sum(rate(http_requests_total{status=~"5.."}[5m])) > 3,避免低流量放大噪声 - 所有 rate 表达式必须用相同区间,
[5m]和[1h]混用会导致计算错位
histogram_quantile() 必须配 sum by(le) 才有效
直方图类指标(如 http_request_duration_seconds_bucket)如果漏掉 sum by(le),histogram_quantile(0.95, ...) 会返回空或错误结果,告警永远不触发。
正确写法示例:
histogram_quantile(0.95, sum by(le) (rate(http_request_duration_seconds_bucket[5m]))) > 0.8
注意点:
- 别用
avg()替代分位数,长尾请求会把平均值拉高,掩盖真实 P95/P99 延迟恶化 - bucket 边界要覆盖业务 SLA,比如承诺 99% 请求
- 如果服务有多个 endpoint,记得加
by(le, endpoint)避免不同路径延迟互相干扰
告警里不带 service 和 instance 标签,Alertmanager 就收不到
Alertmanager 路由依赖标签做分组和静默,如果规则里没显式声明 service 和 instance,它默认只看到 job,无法区分是哪个微服务、哪台实例出问题。
正确做法是在 alert.rules.yml 的 labels 块里补全:
labels:
service: "payment"
instance: "{{ $labels.instance }}"
trace_id: "{{ $labels.trace_id }}"
这样 Webhook 模板里才能取到:{{ .Labels.service }}/{{ .Labels.trace_id }}。否则钉钉消息里只有“HighRequestLatency 报警”,根本没法定位。
还要注意:
- 别在 Go 代码里硬编码
service值,应从环境变量读取,避免多环境部署时标签混乱 -
instance标签通常由 Prometheus 的target自动注入,但如果你用了 Pushgateway 或自定义 exporter,得手动确保它存在
同一个告警每分钟刷屏?检查 repeat_interval 和 for
刚上线的告警规则常出现“同一错误连续发 60 条钉钉”,根本原因是 for 和 repeat_interval 没对齐。比如规则设了 for: 2m,但 Alertmanager 配了 repeat_interval: 1m,只要状态持续 firing,每分钟就重发一次。
合理配置:
-
for设为 2–5 分钟,给系统留出自我恢复窗口 -
repeat_interval至少设为for的 2 倍,比如for: 3m→repeat_interval: 6m - 高频抖动类告警(如瞬时 CPU 尖刺)建议关掉
repeat_interval,改用group_interval控制聚合频率
真正难处理的不是规则怎么写,而是每个指标背后是否对应明确的业务动作——比如 “支付失败率突增” 要能立刻关联到“风控策略变更”或“下游渠道超时”,这需要在打点时就把 reason、channel 这类 label 埋进去,而不是等告警来了再翻日志。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











