真正有效的prometheus报警需围绕“问题可定位、告警不骚扰、响应有依据”展开,核心是清晰逻辑、合理阈值与完整上下文,每条规则须明确异常类型、持续时长及责任人。

Prometheus 报警配置不是堆参数,而是围绕“问题可定位、告警不骚扰、响应有依据”展开的一套工程实践。真正有效的报警,不靠数量取胜,而靠逻辑清晰、阈值合理、上下文完整。
告警规则的核心三要素
每条规则必须明确回答三个问题:什么异常?持续多久才算真问题?谁来处理?
-
expr(表达式):用 PromQL 精准描述异常状态。例如 CPU 使用率,推荐用
100 - avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100,而非简单取平均;内存压力优先看node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes,比MemFree更反映真实可用性 - for(持续时间):避免瞬时抖动误报。网络延迟突增1秒不用告警,但持续2分钟以上就值得介入。常见设置:警告级 5–10 分钟,严重级 2–5 分钟
-
labels + annotations:
severity(critical/warning/info)、service、team是 Alertmanager 路由的基础;summary一句话说清现象,description补充上下文(如“当前值 {{ $value }}%,实例 {{ $labels.instance }}”),runbook_url直指排查文档
典型资源告警的实用写法
照搬模板容易,但适配实际负载才关键。以下写法已在多个生产环境验证:
- CPU 高负载告警:区分核心业务与后台任务。对 Web 实例设 85% 持续 8 分钟;对批处理节点放宽至 95% 持续 15 分钟
-
内存压力告警:不只看使用率。同时配置两条:
- alert: MemoryPressure<br> expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) for: 5m<br> labels: severity: warning
- alert: OOMRisk<br> expr: node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes for: 2m<br> labels: severity: critical
-
磁盘空间预测告警:比“已满”更进一步。用
predict_linear(node_filesystem_free_bytes{mountpoint="/"}[6h], 4*3600) 提前 4 小时预警,并加 <code>for: 30m过滤毛刺
Alertmanager 的关键治理动作
Prometheus Server 只负责“发现异常”,Alertmanager 才决定“怎么通知”。跳过这步,再准的规则也会变成噪音源:
- 分组(group_by):将同一台机器的 CPU、内存、磁盘告警合并为一条通知,避免单节点故障触发 5 条消息
-
抑制(inhibit_rules):当节点
Down时,自动抑制其上所有HighCPUUsage、HighMemoryUsage告警,防止根因未解决前被子问题干扰 -
静默(silence):运维窗口期、压测阶段、已知缺陷修复中,用标签匹配临时屏蔽,比如
severity=critical AND service=payment -
路由(route):按
severity和team自动分流——critical发企业微信+电话,warning仅发钉钉群,info写入内部日志
配置落地的几个硬性建议
很多团队卡在“能跑起来”和“真好用”之间,往往差在这几处细节:
- 规则文件按模块拆分:
host.rules.yml、k8s.rules.yml、business.rules.yml,避免单文件超 500 行难以维护 - 所有 expr 必须先在 Prometheus Graph 页面手动验证:是否返回预期结果?是否有空值或 NaN?是否跨实例聚合正确?
- 新规则上线前,先设
for: 1m观察 24 小时,确认无误后再调回正式值;告警级别首次统一设为warning,避免直接触发critical引发误操作 - 每个告警必须带
runbook_url,且链接指向可执行的排查步骤(如:“检查 nginx 日志 last 5 分钟 error 数量”、“登录机器执行 free -h 查剩余内存”)











