监控告警是运维体系里「最容易配、也最容易配废」的一环。规则写松了,线上真出事没人知道;写紧了,值班群半夜刷屏几百条,久而久之所有人都开始无视告警。而 Prometheus 的告警配置又横跨 PromQL 表达式、YAML 规则文件、Alertmanager 路由树三套语法,新手往往抄一份模板改改就上线,直到故障发生才发现规则根本没生效。近两年一批「AI 监控告警配置生成工具」开始流行:用一句话描述监控诉求,直接输出可落地的 rules.yml 和 alertmanager.yml。本文横向实测 6 款免费方案,并给出一套「生成即校验」的完整流程,确保 AI 写出来的规则真的能在故障时叫醒你。
一、为什么告警配置特别适合交给 AI
手写告警规则的痛点和写 Dockerfile、K8s 清单不太一样,它的难点不在语法,而在「表达式语义」和「工程约定」两层叠加:
- PromQL 反直觉:
rate()、irate()、increase()三者的适用场景完全不同,选错了曲线会出现毛刺或直接为空,但配置本身语法完全合法,promtool也不会报错。 - 阈值靠经验:CPU 超过多少算异常?内存剩余低于多少要告警?这些数字散落在各家博客里,缺乏统一参照。
- 路由规则是隐形炸弹:
group_wait、repeat_interval、抑制规则写错不会导致启动失败,只会在真出故障那一刻表现为「告警风暴」或者「一条都没收到」。 - 验证成本高:你不可能为了测试一条磁盘告警,真的把生产盘写满。
AI 的价值恰恰在于把前三条的「群体经验」快速固化成初稿,把你的精力留给第四条——验证。这条思路和容器、编排、流水线环节的提效是一脉相承的,可以对照 AI Dockerfile 生成工具免费推荐、AI Kubernetes YAML 生成工具免费推荐 与 AI CI/CD 流水线配置生成工具免费推荐 三篇,把「构建 → 部署 → 编排 → 监控」整条链路都自动化起来。
二、先搞清楚:告警配置的三层结构
很多人向 AI 提问时得不到可用结果,根本原因是没说清楚要的是哪一层。Prometheus 告警体系实际分三层,职责完全独立:
| 层级 | 配置文件 | 核心字段 | 解决什么问题 |
|---|---|---|---|
| 采集层 | prometheus.yml 的 scrape_configs |
job_name、scrape_interval、targets |
指标从哪来、多久采一次 |
| 规则层 | rules/*.yml(由 rule_files 引入) |
groups、alert、expr、for、labels、annotations |
什么条件、持续多久算异常 |
| 路由层 | alertmanager.yml |
route、receivers、inhibit_rules |
告警发给谁、怎么合并去噪 |
关键认知:Prometheus 只负责「判断异常并发出告警」,它自己不发邮件也不发钉钉;Alertmanager 只负责「收到告警后怎么通知」,它完全不懂 PromQL。提问时明确说「我要规则层的 rules.yml」或「我要路由层的 alertmanager.yml」,AI 输出的准确率会有质的提升。
三、6 款免费工具横向实测
1. DeepSeek(网页版 / API)
类型:国产大模型,推理能力突出
免费额度:网页端不限次
在这批工具里,DeepSeek 对 PromQL 语义的理解最扎实。让它写「磁盘 4 小时内预计写满就告警」这种需要用到 predict_linear() 的复合表达式,它能一次给对,并主动说明为什么要用 predict_linear(node_filesystem_avail_bytes[6h], 4*3600) 而不是简单比较剩余百分比。
实测亮点:把一段 PromQL 贴给它问「这条规则在什么情况下会漏报」,它能指出诸如「分母为 0 时结果为 NaN,比较运算直接失效」这类隐蔽问题。这是本次测试中唯一能主动发现 NaN 陷阱的工具。
短板:对小众 Exporter 的指标名会有幻觉,需要用下文的「指标白名单」手段约束。
2. 通义灵码(IDE 插件)
类型:IDE 内嵌 AI 助手,支持 VS Code / JetBrains
免费额度:个人版免费
最大优势是上下文感知。当你的仓库里已经有 rules/ 目录和若干现成规则文件时,它会自动沿用你已有的 labels 约定(比如团队统一用 severity: P1/P2/P3 而非默认的 critical/warning),生成的新规则能直接融入现有体系,不用手工改标签。
实测亮点:在 YAML 文件里边写边补全,缩进从不出错——这点比网页端大模型复制粘贴后再修缩进省事得多。
短板:脱离项目上下文单独提问时,表现回落到普通水平。
3. awesome-prometheus-alerts 规则库 + AI 改写
类型:开源规则模板库(samber/awesome-prometheus-alerts)
免费额度:完全免费开源
这是本文最推荐的「组合技」,也是多数教程会漏掉的一步。该项目按 Exporter 分类收录了数百条经过生产验证的告警规则,覆盖 Node Exporter、MySQL、Redis、Nginx、Kafka、JVM、Kubernetes 等主流组件。
正确用法:不要让 AI 凭空创作,而是先从规则库里取对应组件的规则,连同你的实际情况一起丢给大模型,让它做「改写」而不是「创作」。例如:
以下是 awesome-prometheus-alerts 中 MySQL 的标准告警规则(粘贴原文)。
请基于它改写,要求:
1. 我们的 MySQL 是主从架构,主库 job=mysql-master,从库 job=mysql-slave
2. 从库延迟告警阈值放宽到 300 秒,主库保持严格
3. severity 标签改用我们的 P1/P2/P3 体系
4. annotations 里补充中文的处置建议
5. 不要引入原文中没有出现过的指标名
这样得到的规则,指标名一定是真实存在的(因为来自验证过的模板),同时又贴合你的实际架构。幻觉率相比让 AI 从零生成能下降一个数量级。
4. Grafana Alerting(内置告警 UI)
类型:可视化告警配置界面
免费额度:开源版完全免费;Grafana Cloud 免费套餐含告警额度
Grafana 的统一告警(Unified Alerting)允许你在图表上直接框选阈值线来生成告警规则,所见即所得。对于「先看曲线、再定阈值」的场景,它比让 AI 猜数字靠谱得多——毕竟只有你自己的监控数据才知道业务的正常波动区间在哪。
推荐工作流:用 Grafana 看历史曲线确定合理阈值 → 把「指标名 + 阈值 + 持续时间」交给大模型生成标准 YAML → 纳入 Git 版本管理。这样既避免了 AI 拍脑袋定阈值,又保留了配置即代码的可追溯性。
短板:UI 创建的规则默认存在 Grafana 自己的数据库里,与 Git 管理的规则文件形成两套体系,团队协作时容易失控,建议统一导出为文件管理。
5. Cursor / Continue(AI 原生编辑器)
类型:AI 原生代码编辑器
免费额度:Cursor 有免费档;Continue 开源,可接本地模型
这类工具的独特能力是跨文件批量重构。典型场景:团队决定把所有告警的 severity 标签体系从 critical/warning 迁移到 P1/P2/P3,涉及 rules/ 下十几个文件,同时 alertmanager.yml 的路由匹配条件也要同步改。手工改极易遗漏某个文件,导致部分告警掉进兜底路由。用 Cursor 的 Composer 模式一次性描述需求,它能同时修改规则文件和路由配置并保持一致。
短板:批量修改必须逐文件 review,不要直接全部接受。
6. promtool + amtool(官方校验工具链)
类型:Prometheus / Alertmanager 官方自带命令行工具
免费额度:完全免费,随安装包附带
严格说这两个不是「生成」工具,而是「AI 生成之后必须跑」的工具。它们是整套流程里唯一能给出确定性答案的环节——前面五款工具再强也只是概率输出,只有这两个能告诉你配置到底合不合法。详细用法见下一节。
四、横向对比总表
| 工具 | 核心优势 | 最适合的环节 | 幻觉风险 |
|---|---|---|---|
| DeepSeek | PromQL 语义理解最强,能发现 NaN 等隐患 | 复杂表达式推导、规则审查 | 中(小众指标名) |
| 通义灵码 | 读得懂项目已有规则,沿用团队标签约定 | 在已有体系中新增规则 | 低 |
| awesome-prometheus-alerts + AI | 指标名来自生产验证模板 | 主流组件的规则冷启动 | 极低 |
| Grafana Alerting | 基于真实曲线定阈值 | 阈值决策 | 无(不依赖生成) |
| Cursor / Continue | 跨文件批量重构保持一致 | 规则体系迁移 | 中 |
| promtool / amtool | 确定性校验与单元测试 | 上线前把关 | 无(不依赖生成) |
五、AI 生成告警规则最容易踩的 5 个坑
这一节是本文的核心。以下五类错误语法全部合法,promtool 静态检查也能通过,但会在真实故障时让你的告警彻底失效。
坑 1:漏写 for,导致抖动刷屏
AI 经常生成这样的规则:
- alert: HighCpuUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
labels:
severity: warning
问题在于没有 for 字段。CPU 瞬时冲高到 81% 立刻触发,掉回 79% 立刻恢复,一分钟内可能收到几十条告警和恢复通知。正确做法是加上 for: 5m,表示持续 5 分钟满足条件才真正告警。
另外要注意:for 的值应当是 evaluation_interval(默认 1 分钟)的整数倍。写 for: 90s 而评估周期是 60s,实际生效时间会被拉到 120s,与预期不符。
坑 2:rate / irate / increase 用错
三者的正确适用场景:
rate():计算区间内的平均每秒增长率,适合大多数告警场景,曲线平滑。irate():只取区间内最后两个数据点计算瞬时速率,曲线敏感,适合排查而非告警。用在告警里会因为过于灵敏而频繁误报。increase():计算区间内的总增量,适合「5 分钟内错误数超过 100 次」这类绝对数量判断。
还有一条硬性约束经常被 AI 忽略:时间窗口至少要是 scrape_interval 的 4 倍。如果采集间隔是 30s,写 rate(xxx[1m]) 窗口内只有 2 个点,一旦有一次采集失败就会返回空值,告警静默失效。稳妥写法是 [2m] 起步。
坑 3:忘记 by (instance),丢失故障定位信息
对比这两条:
# 错误:所有机器的内存被聚合成一个数
avg(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) < 0.2
# 正确:保留 instance 维度,能告诉你是哪台机器
avg by (instance) (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) < 0.2
第一种写法在 100 台机器里坏了 3 台时,平均值可能还很健康,直接漏报;即使触发了,告警内容也不告诉你是哪台机器。凡是用了聚合函数(sum / avg / max / min),必须显式带上 by (instance) 或其他区分维度。
坑 4:分母为 0 产生 NaN
这是最隐蔽的一个。计算错误率的经典写法:
sum(rate(http_requests_total{status=~"5.."}[5m])) by (job)
/
sum(rate(http_requests_total[5m])) by (job) > 0.05
如果某个服务在这 5 分钟内完全没有请求,分母为 0,结果是 NaN。而 NaN > 0.05 的结果是 false,不会告警——这本身没问题。但反过来,如果你写的是「成功率低于 99% 就告警」,NaN 同样不触发,于是「服务完全挂掉、一个请求都进不来」这个最严重的场景反而不会告警。
解法是补一条独立的「流量归零」告警,用 absent() 或直接判断请求总数:
- alert: ServiceNoTraffic
expr: sum(rate(http_requests_total[5m])) by (job) == 0
for: 3m
坑 5:Alertmanager 用了废弃的 match 语法
大量训练语料里的 alertmanager.yml 还在用旧写法:
routes:
- match:
severity: critical
receiver: 'pagerduty'
- match_re:
service: ^(mysql|redis).*
receiver: 'dba-team'
match 和 match_re 在新版 Alertmanager 中已标记为废弃,官方推荐统一使用 matchers 语法:
routes:
- matchers:
- severity = "critical"
receiver: 'pagerduty'
- matchers:
- service =~ "mysql|redis"
receiver: 'dba-team'
旧语法目前仍能运行,但会在启动日志里打出 deprecation 警告,且未来版本可能移除。让 AI 生成时务必显式要求使用 matchers。
六、约束式提示词模板
直接说「帮我写个 CPU 告警」得到的一定是通用模板。把下面这段作为提示词骨架,逐项填空,输出质量会完全不同:
请生成 Prometheus 告警规则文件,严格遵守以下要求:
【环境信息】
- Prometheus 版本:2.x,evaluation_interval 为 1m,scrape_interval 为 30s
- 监控对象:3 台 Node Exporter(job=node)、1 个 MySQL 主库(job=mysql-master)
- 团队 severity 体系:P1(立即处理)/ P2(当天处理)/ P3(观察)
【硬性要求】
1. 只能使用 Node Exporter 和 mysqld_exporter 官方文档中真实存在的指标名,
不确定的指标一律不要使用,宁可少写一条规则
2. 每条规则必须有 for 字段,且为 1m 的整数倍
3. 所有聚合函数必须带 by (instance)
4. 时间窗口不得小于 2m(scrape_interval 的 4 倍)
5. annotations 必须包含 summary 和 description,
description 中用 {{ $labels.instance }} 和 {{ $value }} 带出上下文
6. description 用中文,并写明建议的处置动作
7. 涉及除法的表达式,必须说明分母为 0 时的行为
8. 输出后请单独列出:本规则用到的全部指标名清单,供我逐一核对
【告警需求】
(在这里用大白话描述你要监控什么)
第 1 条和第 8 条是压制幻觉的关键:要求 AI 主动列出用到的指标名清单,你只需拿这份清单去 Prometheus 的 /graph 页面逐个搜索验证,几十秒就能确认有没有编造的指标。这个技巧同样适用于其他配置生成场景,思路可参考 AI Nginx 配置生成工具免费推荐 中的约束式写法。
七、上线前的四道校验流水线
AI 生成的配置一律不要直接 reload 到生产。按下面四步走,可以拦住绝大多数问题。
第一道:promtool 静态检查
# 校验规则文件语法
promtool check rules rules/node-alerts.yml
# 校验主配置,顺便检查重复规则
promtool check config prometheus.yml --lint=duplicate-rules
这一步能查出 YAML 缩进错误、PromQL 语法错误、字段名拼写错误。通过后只能说明「合法」,不代表「正确」。
第二道:promtool 规则单元测试(最容易被跳过,但最有价值)
这是整套流程中唯一能验证「规则在故障时真的会触发」的手段,却是绝大多数团队完全没用起来的功能。你可以喂给它一段构造的时序数据,断言告警是否按预期触发:
# test-node-alerts.yml
rule_files:
- rules/node-alerts.yml
evaluation_interval: 1m
tests:
- interval: 1m
input_series:
# 构造一台机器可用内存持续偏低的场景
- series: 'node_memory_MemAvailable_bytes{instance="10.0.0.1:9100"}'
values: '1+0x10'
- series: 'node_memory_MemTotal_bytes{instance="10.0.0.1:9100"}'
values: '10+0x10'
alert_rule_test:
- eval_time: 6m
alertname: NodeMemoryLow
exp_alerts:
- exp_labels:
severity: P2
instance: "10.0.0.1:9100"
执行:
promtool test rules test-node-alerts.yml
其中 values: '1+0x10' 表示起始值 1、每步增加 0、共 10 个点,即保持恒定。eval_time: 6m 配合规则里的 for: 5m,正好验证「持续 5 分钟后触发」的行为是否成立。
实用技巧:让 AI 在生成规则的同时,一并生成对应的测试文件。提示词加一句「请同时输出 promtool test rules 格式的单元测试,覆盖触发和不触发两种场景」即可。这一步做完,你才真正知道规则有没有用。
第三道:Alertmanager 配置与路由校验
# 校验配置合法性
amtool check-config alertmanager.yml
正常输出类似:
Checking 'alertmanager.yml' SUCCESS
Found:
- global config
- route
- 1 inhibit rules
- 2 receivers
- 1 templates
注意核对 receivers 和 inhibit rules 的数量是否与你的预期一致——数量对不上说明有配置块没被解析到。
更进一步,用路由测试确认某条告警会落到哪个接收人,这一步能直接暴露「兜底路由吃掉所有告警」的问题:
amtool config routes test --config.file=alertmanager.yml \
severity=P1 service=mysql
它会打印出这条告警最终命中的 receiver 名称。建议对每个 severity 等级都跑一遍,确保 P1 真的走到了电话渠道而不是邮件。
第四道:人工五项清单
工具查不出来的部分,靠这份清单兜底:
- 阈值是否符合业务实际:拿 Grafana 翻一下过去 30 天曲线,确认这个阈值不会在业务高峰期天天误报。
- repeat_interval 是否合理:默认 4h 通常够用。写成 5m 会把值班手机打爆,写成 24h 又可能让人忘记还有故障没处理。
- 抑制规则的 equal 字段是否正确:
inhibit_rules中的equal决定了「哪些标签相同才抑制」。如果一台机器宕机,本该只发一条 InstanceDown,而不是连带发出 CPU、内存、磁盘等十几条。equal里必须包含instance,否则抑制不会生效。 - 是否有兜底接收人:路由树最外层的
receiver必须配置有效渠道,否则不匹配任何子路由的告警会静默消失。 - 是否真的测过一次:手动把某个 Exporter 停掉,确认告警在预期时间内送达手机。没有做过端到端演练的告警系统,等同于没有告警系统。
八、三个真实踩坑记录
案例一:抑制规则漏写 equal,宕机时收到 87 条告警
某次单台机器断电,值班同学在 30 秒内收到 87 条告警,涵盖该机器上所有服务。排查发现抑制规则写成了:
inhibit_rules:
- source_matchers: [ severity = "P1" ]
target_matchers: [ severity = "P2" ]
# 缺少 equal 字段
缺了 equal,Alertmanager 无法判断「这些 P2 告警和那条 P1 是不是同一台机器的」,于是抑制逻辑形同虚设。补上 equal: ['instance'] 后,同样场景只发出 1 条主告警。
案例二:AI 编造了一个不存在的指标名
让大模型写 Redis 内存告警,它输出了 redis_memory_usage_percent。这个名字看起来非常合理,YAML 校验也通过,规则文件顺利上线。三个月后 Redis 真的内存打满,告警一声没响——因为 redis_exporter 根本没有这个指标,实际应该用 redis_memory_used_bytes / redis_memory_max_bytes 自己算。
这就是为什么提示词模板里第 8 条要求「列出全部指标名清单」。表达式为空值时 Prometheus 不会报错,只会安静地永不触发,属于最危险的一类故障。
案例三:规则文件放对了目录,但没被加载
新增的 rules/mysql-alerts.yml 语法完全正确,promtool check rules 也通过,但告警始终不生效。原因是 prometheus.yml 里的 rule_files 写的是精确文件名列表,新文件没被加进去:
# 原配置:只加载了两个文件
rule_files:
- "rules/node-alerts.yml"
- "rules/nginx-alerts.yml"
# 改为通配符,避免遗漏
rule_files:
- "rules/*.yml"
改完后记得触发热加载(需要启动时带 --web.enable-lifecycle 参数):
curl -X POST http://localhost:9090/-/reload
验证方式:打开 Prometheus Web UI 的 Status → Rules 页面,确认新规则出现在列表里且状态为 ok。这个页面是排查「规则没生效」的第一站,比翻日志快得多。日志排查的系统方法可参考 AI 日志分析工具免费推荐。
九、推荐的完整工作流
- 定阈值:先在 Grafana 看目标指标过去 30 天的曲线,确定正常波动区间和合理阈值。
- 取模板:去 awesome-prometheus-alerts 找对应组件的标准规则作为基底。
- AI 改写:用第六节的提示词模板,让 DeepSeek 或通义灵码基于模板改写,同时要求输出指标名清单和单元测试文件。
- 核对指标:拿指标清单去 Prometheus
/graph页面逐个搜索,确认全部真实存在且有数据。 - 四道校验:promtool check → promtool test → amtool check-config + routes test → 人工五项清单。
- 灰度上线:新规则先把 severity 设为最低等级、只发到测试群,观察一周确认无误报后再提到正式等级。
- 端到端演练:手动制造一次故障,确认告警真的能送达。
整个流程里,AI 承担的是第 3 步的初稿工作,大约能省下 70% 的编写时间;但第 4 到第 7 步的验证责任无法也不应该转移给 AI。命令行操作不熟练的话,可以配合 AI 命令行助手工具免费推荐 里的工具用大白话生成 promtool、amtool 命令。
十、总结
选型建议按场景收敛为三句话:
- 主流组件冷启动 → awesome-prometheus-alerts 规则库 + AI 改写,幻觉率最低。
- 已有规则体系中新增 → 通义灵码,能自动沿用团队标签约定。
- 复杂表达式与规则审查 → DeepSeek,PromQL 语义理解最强。
无论用哪款,都请记住这条底线:告警配置的价值不在于「写出来了」,而在于「故障时真的响了」。AI 能把编写时间从两小时压缩到十分钟,但省下来的时间应该投入到 promtool 单元测试和端到端演练上,而不是直接下班。一条从未被验证过的告警规则,比没有告警更危险——因为它会让你误以为自己有监控。
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论