摘要:Grafana 再好看,也得有人看。这篇讲清 Prometheus 告警规则怎么写:
expr/for/labels/annotations四个字段各管什么、告警的三个状态inactive → pending → firing怎么走、ALERTS指标怎么用 PromQL 查;再给你三条可以直接抄的常用规则(CPU / 内存 / 磁盘)和一条必配的up == 0。最后是一个很真实的坑——一个肉眼看不见的U+00A0,让整个规则文件加载失败。承接上篇:Grafana 装好了,Dashboard 也导入了,CPU、内存、磁盘、网络都能看了。
一、Grafana 好看,但没人看
周一早上,小林打开 Grafana,看着自己配的 Dashboard,CPU、内存、磁盘曲线一路平稳。
「周哥,你看,监控配好了。」
老周走过来,看了一眼:「好看。」
「那当然。」
「但我问你一个问题。」老周说,「你周六晚上在干嘛?」
「打游戏啊。」
「那周六晚上,你博客 CPU 飙到 90%,你知道吗?」
小林愣住了:「我……不知道。」
「对。」老周说,「Grafana 再好看,也得有人看。没人看,它就是一张画。你不能 24 小时盯着屏幕,但你得知道服务器什么时候出问题。这就需要告警。」
「那告警谁来发?」
「Prometheus。」老周说,「你给它定规则,它自己判断。条件满足了,它就『喊人』。」
「喊谁?」
「先喊 Alertmanager,Alertmanager 再决定怎么通知你。」老周说,「但今天,你先学怎么让 Prometheus『判断』。」
二、告警规则长什么样?
「告警规则,就是一个 YAML 文件。」老周说,「你在里面写:什么条件下,触发什么告警。」
老周拿过小林的笔记本,写了一个例子:
groups:-name:examplerules:-alert:HighCpuUsageexpr:1-avg(rate(node_cpu_seconds_total{mode="idle"}[1m]))>0.8for:2mlabels:severity:warningannotations:summary:"CPU 使用率超过 80%"description:"实例 { { $labels.instance }} 的 CPU 使用率已持续 2 分钟超过 80%,当前值 { { $value }}"「一行一行解释。」
groups:规则组。一个文件可以有多个组,每组一个name;rules:规则列表。一组可以有多个规则;alert:告警名称。HighCpuUsage,你自己起;expr:表达式。PromQL,条件满足就触发;for:持续时间。条件满足后,持续多久才真正触发。2m表示 2 分钟;labels:标签。severity: warning,表示告警级别;annotations:注释。summary和description,告警内容,支持模板变量。
「那{ { $labels.instance }}是啥?」
「模板变量。」老周说,「$labels是当前告警的标签,$value是当前值。你写{ { $labels.instance }},告警发出来时,会替换成具体的实例名。」
小林在笔记本上画了个表:
| 字段 | 作用 |
|---|---|
alert | 告警名称 |
expr | PromQL 表达式,条件 |
for | 持续时间,条件满足多久才触发 |
labels | 告警标签,如severity |
annotations | 告警内容,支持模板变量 |
三、写第一条规则
「现在写第一条。」老周说,「你先建一个规则文件。」
「放哪?」
「Prometheus 配置目录下,建个rules文件夹。」
sudomkdir-p/etc/prometheus/rulessudonano/etc/prometheus/rules/node_rules.yml「写什么?」
「写一条『CPU 超过 80% 持续 2 分钟』的告警。」
小林写:
groups:-name:node_alertsrules:-alert:HighCpuUsageexpr:1-avg(rate(node_cpu_seconds_total{mode="idle"}[1m]))>0.8for