Grafana Alerting 把"监控数据"与"告警发送"统一到一张面板里:一条告警规则可以直接基于 Prometheus 的 PromQL、Loki 的 LogQL 或任意数据源写查询,命中后进入通知策略树,按规则分组、路由到邮件/Slack/钉钉/Webhook,还能静默、抑制、升级。相比分散在各后端的告警系统,Grafana Alerting 的核心价值是**“统一”**——一条规则管所有数据源,一套通知策略管所有渠道。本指南深入 Grafana Alerting 架构,覆盖告警规则设计、模板化通知、通知策略树、集群高可用、告警降噪,并给出端到端配置示例。
一、统一告警架构
1.1 核心组件
Alert Rule(规则)
│ 基于数据源查询,评估是否触发
▼
Rule Evaluator(评估器)
│ 周期性执行(默认 1m),产生 Alert
▼
Notification Policy Tree(通知策略树)
│ 分组、路由、抑制、静默
▼
Contact Point(联系点)
│ 邮件/Slack/钉钉/Webhook/PagerDuty...
▼
通知送达
| 组件 | 职责 |
|---|---|
| Alert Rule | 定义"什么情况报警"(PromQL/LogQL/Threshold) |
| Contact Point | 定义"发给谁"(渠道 + 接收人) |
| Notification Policy | 定义"怎么发"(路由/分组/抑制) |
| Silence | 临时不打扰(变更窗口、已知问题) |
| Rule Group | 规则的组织单位,独立评估频率 |
1.2 与旧版告警的演进
旧架构(≤7.x):
· 每数据源独立告警(Prometheus 自带 Alertmanager、Loki 无)
· 无统一模板,配置分散在数据源里
新架构(8.x+,Grafana Alerting):
· 所有数据源统一用 Grafana 评估(数据源无关)
· 内置 Alertmanager(可选外接 Prometheus AM)
· 模板化通知(Go template)统一邮件/IM 格式
· 通知策略树支持复杂路由与抑制
二、告警规则设计
2.1 基于 PromQL 的规则
# 规则:服务 5xx 比例超过 1% 且持续 5m
groups:
- name: availability.rules
rules:
- alert: HighErrorRate
expr: |
sum(rate(http_requests_total{code=~"5.."}[5m])) by (service)
/ sum(rate(http_requests_total[5m])) by (service) > 0.01
for: 5m
labels:
severity: critical
team: backend
annotations:
summary: "服务 {{ $labels.service }} 错误率超阈值"
runbook_url: "https://wiki.example.com/runbooks/high-error-rate"
2.2 基于 LogQL 的规则
# 日志告警:5 分钟内 ERROR 日志超 50 条
groups:
- name: log.rules
rules:
- alert: LogErrorSurge
expr: |
sum(count_over_time(
{job="payment-service"} |= "ERROR"
[5m]
))
for: 3m
labels:
severity: warning
annotations:
summary: "日志错误数量突增"
2.3 Grafana 原生规则(数据源无关)
Grafana 原生规则支持:
· 阈值类(count / min / max / avg / sum)
· 数学表达式(A-B / A*100)
· 多查询组合(分阶段)
· 时间范围类(reduce + threshold)
· 数据源:Prometheus、Loki、Elasticsearch、CloudWatch、Graphite...
适合:跨数据源聚合、非 Prometheus 场景
三、模板化通知
3.1 基础模板语法
{{/* 通知标题 */}}
{{ if eq .Status "firing" }}[FIRING]{{ else }}[RESOLVED]{{ end }}
{{ range .Alerts.Firing }}
- {{ .Labels.alertname }} ({{ .Labels.severity }})
服务: {{ .Labels.service }}
详情: {{ .Annotations.summary }}
开始: {{ .StartsAt }}
{{ end }}
3.2 邮件模板
{{ if eq .Status "firing" }}🟥 告警触发{{ else }}🟩 已恢复{{ end }}
{{ range .Alerts }}
### {{ .Labels.alertname }}
- 严重级别:`{{ .Labels.severity }}`
- 服务:`{{ .Labels.service }}`
- 当前值:`{{ .ValueString }}`
- 详情:{{ .Annotations.summary }}
- 处理文档:{{ .Annotations.runbook_url }}
{{ end }}
时间:{{ .StartsAt.Format "2006-01-02 15:04:05" }}
3.3 模板函数与字段
# 常用字段
.Status # firing / resolved
.Alerts # 所有告警集合
.Alerts.Firing # 触发中的
.Alerts.Resolved # 已恢复的
.GroupLabels # 分组标签
.CommonLabels # 公共标签
.CommonAnnotations
# 常用函数
{{ humanizeDuration 2160 }} # "1h"
{{ $value := humanize .Value }}
{{ index .Labels "service" }}
{{ if .Alerts.Firing }}...{{ end }}
四、通知策略树:路由的艺术
4.1 策略树结构
根策略(默认)
├── 按 team 路由
│ ├── team: backend → Slack #backend-alerts(分组按 severity)
│ └── team: frontend → 邮件 frontend@
├── 按 severity 路由
│ ├── severity: critical → PagerDuty + 升级
│ └── severity: warning → Slack #ops(合并成一条)
└── 默认策略 → 邮件 ops@
4.2 配置示例(YAML 导出)
# 根策略
routes:
- matchers: [] # 根,匹配所有
receiver: default-email
group_by: ['grafana_folder'] # 按文件夹分组
group_wait: 30s
group_interval: 5m
repeat_interval: 4h # 相同告警 4h 重发一次
routes:
# 子路由 1:critical 走 PagerDuty
- matchers:
- severity="critical"
receiver: pagerduty
continue: false # 命中后不继续下钻
routes:
- matchers:
- team="oncall" # 特定团队再升级
receiver: pagerduty-high-priority
# 子路由 2:warning 走 Slack
- matchers:
- severity="warning"
receiver: slack-ops
group_by: ['service']
4.3 分组、等待与重复
关键参数:
group_wait 分组首条告警等待时长(合并风暴)
group_interval 同一组两次通知最小间隔
repeat_interval 同一告警重复通知间隔(防刷屏但要避免漏报)
最佳实践:
· 风暴场景:group_wait 30-60s,把同一服务的并发告警合并成一条
· 按 severity 分组:critical 独立、warning 合并
· repeat_interval 设 4-8h,避免深夜刷屏
五、静默与抑制
5.1 Silence(静默)
# 静默:变更窗口 / 已知问题 / 维护期
# 匹配条件(matcher):
matchers:
- severity="warning"
- service="payment"
# 时间范围:开始/结束(最长可预设计划)
# 状态:Active / Expired / Pending
5.2 抑制(Inhibition)
抑制规则:A 告警抑制 B 告警
例:节点宕机(node_down) 抑制该节点上所有服务告警
· 避免"节点挂了 + 上面 20 个服务全报错"的二次轰炸
· Grafana 内置 Alertmanager 支持抑制配置
5.3 静默管理 API
# 创建静默(API)
curl -X POST http://grafana:9093/api/v2/silences \
-H "Content-Type: application/json" \
-d '{
"matchers": [{"name": "service", "value": "payment", "isRegex": false}],
"startsAt": "2026-09-26T00:00:00+08:00",
"endsAt": "2026-09-27T00:00:00+08:00",
"comment": "支付服务计划变更窗口"
}'
# 查询活跃静默
curl -s http://grafana:9093/api/v2/silences?state=active | jq .
六、集群高可用
6.1 内置 Alertmanager 的 HA
Grafana Alerting 高可用:
· 多 Grafana 实例共用同一数据源(配置同步)
· Alertmanager 持久化状态(状态文件挂盘)
· 通知重复:内置 dedupe(同一告警多实例只发一次)
· 推荐:单集群 2-3 个 Grafana 实例 + 共享 SQLite/Postgres
6.2 外接 Prometheus Alertmanager
场景:已有 Prometheus Alertmanager 体系
· Grafana 规则评估后可转给外接 AM(Firing 状态转发)
· 保留 Prometheus 原告警 + Grafana 新增告警的统一出口
· 配置:Grafana Alerting → 外接 Alertmanager 地址
6.3 故障时的行为
评估器故障 / 数据源不可达:
· 规则评估失败 → 保留上次状态(默认不误报)
· 可配 onError 策略:Error 也发通知(适合高风险)
· 数据源查询超时 → 该轮不更新,等恢复
七、告警降噪实践
7.1 降噪三板斧
1. 综合(Reduction):同一原因合并成一条
· group_by 按 service/severity 分组
· 风暴时"1 条代表 + N 条细节"
2. 分层(Tiering):
· P1 critical → 立即 PagerDuty + 升级
· P2 warning → Slack,合并发送
· P3 info → 面板上红点,不打扰
3. 期限(for):持续 N 分钟才报警
· for: 5m 过滤瞬时抖动,避免"闪报"
7.2 黄金告警清单
每个服务应有的基础告警:
· 错误率(5xx/error ratio)> 阈值
· 延迟(p95/p99)突破 SLO
· 资源饱和(CPU/内存/磁盘/连接数)
· 可用性(探活失败 / 副本数不足)
· 队列积压 / 消费停滞
· 安全(登录失败突增、异常流量)
反模式:
· 只报"值超阈值"不给上下文(无 service 标签)
· 一报警就来 N 条重复(没分组/没 repeat 控制)
· 告警没有处理人(无 team 标签)
7.3 用元数据增强告警
告警应携带的元数据:
· severity(P1-P3)— 决定路由与升级
· team(owner)— 决定通知对象
· runbook_url — 处理人点开就有文档
· summary — 一句话说清"什么坏了"
· dashboard 链接 — 一键跳转排查面板
八、值班与升级(Grafana OnCall 集成)
8.1 OnCall 值班轮换
Grafana OnCall 提供:
· 值班排班(日历、轮换规则)
· 升级链(一级没人接 → 二级/经理)
· 确认/解决动作
· 与 Grafana Alerting 深度集成
通知链示例:
Slack 提醒 → 5 分钟未确认 → 电话/PagerDuty → 经理升级
8.2 升级链配置
# 告警规则 annotation 配置升级链
annotations:
# 一级值班(OnCall 当前 oncall 用户)
oncall_waiting_interval: 5m
oncall_escalation_chain: "default-chain"
九、端到端告警链路示例
9.1 完整场景
场景:支付服务 p99 延迟超 SLO
流程:
1. PromQL 规则命中(p99 > 500ms,持续 5m)
2. 规则评估 → 触发 Alert
3. 通知策略树路由:
severity=critical + team=backend → PagerDuty 高优
4. 模板渲染通知:
"支付服务 p99 延迟 812ms,已超 500ms SLO"
+ runbook 链接 + dashboard 链接
5. OnCall 接收 → 确认 → 处理 → 解决
6. 恢复后 Grafana 自动发 [RESOLVED]
9.2 推荐告警规则模板
groups:
- name: latency-slo.rules
rules:
- alert: ServiceLatencySLO
expr: |
histogram_quantile(0.99,
sum by (le, service) (rate(http_request_duration_seconds_bucket[5m]))
) by (service) > 0.5
for: 5m
labels:
severity: critical
team: backend
slo: latency-p99
annotations:
summary: "{{ $labels.service }} p99 延迟 {{ $value | humanize }}s 超 SLO 0.5s"
runbook_url: "https://runbooks.example.com/latency-slo"
dashboard_url: "http://grafana/d/payment-latency"
9.3 健康自检
告警系统本身要可观测:
· 规则评估状态(firing/error 计数)
· 通知发送成功率(Alertmanager 指标)
· 静默/抑制数量
· 关键规则从未触发 = 可能配置错了(配"心跳"告警验证链路)
心跳告警:
· 每条规则打上 version 标签
· 定期验证 Webhook 回环(ping 自己)
总结:Grafana Alerting 要点
| 环节 | 关键动作 |
|---|---|
| 规则 | 数据源无关 + for 消抖 + 元数据(severity/team/runbook) |
| 模板 | Go template 统一格式,带上下文链接 |
| 策略树 | 分层路由 + 分组风暴 + repeat 控频 |
| 降噪 | 综合 / 分层 / 期限三招 |
| HA | 多实例 + 共享状态 + 外接 AM 兼容 |
| 升级 | OnCall 值班链,未确认自动升级 |
好的告警体系不是"报得多",而是**“报得准、报得少、报得动”**——该报的秒级到达、带上上下文和处理手册;噪音合并成一条;没人理自动升级。Grafana Alerting 的价值就在把这几件事统一起来。落地时记住:规则要有元数据(谁负责/多严重/去哪处理),策略要有分层(P1 直呼、P2 合并、P3 入面板),告警要有兜底(for 消抖、repeat 控频、OnCall 升级)。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。