实战前的准备
两个例子共用同一套前提:数据源已连通(Prometheus、Loki 均在 Connections → Data sources 里 Save & test 通过);已建好一个 Slack 或 Webhook 联系点并 Test 成功;你是所在文件夹的 Editor。心智模型回顾见Grafana 告警体系总览。
例子一:CPU 阈值告警(Prometheus)
场景:任一主机的 CPU 使用率连续 5 分钟超过 80% 就通知值班群。
- Alerting → Alert rules → New alert rule,放入一个评估组(如 1m 间隔)。
- Query A 选 Prometheus 数据源,输入:
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
- Reduce B:对 A 取 Last;Threshold C:
IS ABOVE 80,选为最终条件。 - Evaluate for 设
5m——没有它,单次采样毛刺就会告警。 - 加标签
severity=warning、team=infra;加注解summary:{{ $labels.instance }} CPU 使用率 {{ $value | printf "%.1f" }}%。 - 保存后到规则详情看预览:每个
instance一个实例,状态从 Normal/Pending/Firing 实时可见。
提示: 注解里的
$value、$labels只在规则的 label/annotation 模板里可用,与通知模板(Go template)是两套上下文,别混用。
例子二:错误日志突增告警(Loki count_query)
场景:过去 5 分钟内 ERROR 级别日志条数超过 50 即告警。
- 同样新建规则,Query A 选 Loki 数据源。日志告警必须使用能返回数值的指标型查询(count query),且以即时(instant)方式执行——纯日志行查询不能触发告警。
- 输入 LogQL:
sum(count_over_time({job="payments"} |= "ERROR" [5m]))
- Threshold B:
IS ABOVE 50,设为最终条件;for给 2m 防抖。 - 想在通知里带上日志线索,把查询改为按服务分组
by (service),通知模板里{{ range .Alerts }}就能逐服务列出。
常见疑问:为什么 Explore 里有日志、告警里却说 NoData?十有八九是查询没包在 count_over_time 这类聚合里、返回的不是数值序列。日志侧的查询写法见探索日志。
排错清单
通知没按时到达时,沿链路从上往下逐环节确认:
| 环节 | 检查点 |
|---|---|
| 规则 | 是否被暂停;预览状态是 Normal 还是根本没评估 |
| 评估组 | 间隔是否太长;组是否因规则过多而评估延迟 |
| 查询 | 时间范围内确实有数据;for 时长大于查询缓冲 |
| 无数据/错误 | NoData、Error 的状态处理是否符合预期 |
| 标签 | severity 等路由标签是否拼写正确、有没有漏打 |
| 路由 | 在 Alerting → Notification policies 用模拟匹配确认落点 |
| 静默 | Silences 页是否有未过期的静默误伤 |
| 联系点 | 用 Test 按钮验证凭据与网络 |
注意: 排查「告警不触发」时,优先看规则详情里的实例状态历史,它能告诉你卡在了哪一步;仍无头绪再对照故障排查手册。
下一步
- 规则各字段的完整语义,读告警规则。
- 分发节奏调优,读通知策略与路由树。
- Loki 侧配置细节,看Loki 日志数据源。