Grafana Alerting 进阶:统一告警架构、通知策略树与告警降噪实战

Grafana Alerting 把"监控数据"与"告警发送"统一到一张面板里:一条告警规则可以直接基于 Prometheus 的 PromQL、Loki 的 LogQL 或任意数据源写查询,命中后进入通知策略树,按规则分组、路由到邮件/Slack/钉钉/Webhook,还能静默 …

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 升级)。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「Observability」更多文章

  1. 可观测性成本治理:采样降噪、数据生命周期与存储成本优化实战
  2. 生成式 AI 可观测性:LLM 调用追踪、Token 成本监控、质量与安全评估
  3. 服务网格可观测性:Istio 遥测、Kiali 拓扑与全链路追踪实战