告警规则指南

本指南涵盖告警规则系统:基于条件→动作的告警处理自动化。


1. 告警规则概念

告警规则对传入的告警进行条件评估并触发动作。

收到告警 → 条件检查 → 动作执行

核心思想:每条规则都有一个 condition(匹配什么)和一个 action(匹配时做什么)。

规则按优先级从上到下评估。第一个匹配的规则生效。


2. 创建规则

规则定义包含:

  • name:唯一标识符
  • condition:匹配条件(严重级别、标签、名称模式、团队)
  • filters:额外细化条件
  • actions:匹配时执行的动作
  • priority:更高数字 = 更先评估(默认:0)

示例 — 将数据库团队的严重告警路由到 Slack #db-alerts

name: route-db-critical
condition:
  severity: critical
  team: database
action:
  type: notify
  channel: "#db-alerts"
priority: 10

示例 — 在维护窗口期间抑制所有 node 告警:

name: suppress-maintenance-node
condition:
  label_exists: maintenance
  name_pattern: "node.*"
action:
  type: suppress
priority: 100

3. 规则条件

严重级别匹配

按严重级别匹配告警。

condition:
  severity: critical   # critical | warning | info | debug

标签匹配

匹配具有特定标签(key=value)或标签键存在的告警。

# 标签必须等于值
condition:
  label:
    environment: production

# 标签键必须存在(任意值)
condition:
  label_exists: maintenance

示例:当存在 maintenance=true 标签时抑制所有 node 告警:

name: suppress-node-maintenance
condition:
  label:
    maintenance: "true"
  name_pattern: "node.*"
action:
  type: suppress

名称模式

使用 glob/regex 模式匹配告警名称。

condition:
  name_pattern: "cpu.*|memory.*"   # 匹配 cpu_high、memory_low 等
condition:
  name_pattern: "disk.*"           # 匹配 disk_full、disk_slow 等

团队匹配

按团队标签路由。

condition:
  team: database    # 匹配带有标签 team=database 的告警

组合条件

所有条件必须满足(AND 逻辑)。

condition:
  severity: warning
  label:
    environment: production
  team: backend
  name_pattern: "http.*"

4. 规则动作

notify

向频道或收件人发送通知。

action:
  type: notify
  channel: "#alerts"           # Slack 频道
  # 或者
  recipient: "[email protected]"
  message: "Alert triggered: {{alert.name}}"

create_incident

为告警开启一个新事件。

action:
  type: create_incident
  severity: derived            # 从告警继承或设置固定值
  assign_to: "oncall-primary"
  title: "Incident: {{alert.name}}"

suppress

静默丢弃告警(无通知、无事件)。

action:
  type: suppress
  reason: "Maintenance window active"

route_to_channel

将告警路由到特定频道而不抑制。

action:
  type: route_to_channel
  channel: "#{{alert.team}}-alerts"   # 从团队标签动态获取频道

5. 规则优先级

优先级更高的规则会被更先评估。默认优先级为 0。

  • 优先级 100:关键覆盖规则(例如,维护期间的抑制)
  • 优先级 10:特定路由规则
  • 优先级 0:默认后备规则

评估顺序:规则按优先级降序排序。第一个匹配的规则被执行。

规则 A (优先级 100) → 规则 B (优先级 50) → 规则 C (优先级 0)

重要:如果没有规则匹配,告警将保持不变(默认行为)。


6. 抑制(告警静默)

抑制在其他告警已活跃时静默告警。这可以防止告警风暴。

模式:当告警 X 触发时抑制告警 Y

按标签抑制

当存在 maintenance=true 的告警时,抑制所有 component=node 的告警:

name: inhibit-node-during-maintenance
condition:
  label_exists: maintenance
action:
  type: suppress
  scope:
    label:
      component: node

按名称模式抑制

host_down 告警触发时抑制 disk_full 告警:

name: inhibit-disk-when-host-down
condition:
  name_pattern: "host_down"
action:
  type: suppress
  scope:
    name_pattern: "disk_full"

时间抑制

在维护窗口开始后抑制告警 30 分钟:

name: suppress-maintenance-30min
condition:
  label_exists: maintenance
action:
  type: suppress
  ttl: 30m

常见示例

场景 条件 动作
当 maintenance=true 时抑制 node 告警 label_exists: maintenance + name_pattern: node.* suppress
当主机宕机时抑制 disk 告警 name_pattern: host_down suppress scope: name_pattern: disk.*
抑制维护中服务的所有告警 label: maintenance=true suppress

7. 自动解决

自动解决在条件清除时自动关闭告警。

name: auto-resolve-cpu
condition:
  name_pattern: "cpu_high"
action:
  type: notify
  channel: "#alerts"
auto_resolve:
  enabled: true
  check_interval: 1m
  threshold: 3              # 连续 3 次健康检查后解决
  healthy_condition:
    name_pattern: "cpu_normal"

工作原理

  1. 告警触发,auto_resolve 已启用
  2. 系统定期检查 healthy_condition
  3. 如果健康条件连续满足 threshold 次,告警被解决
  4. 如果在满足阈值前不健康条件返回,计数器重置

8. 测试规则(发送测试告警)

在将规则部署到生产环境之前,用合成告警测试它们。

通过 CLI 发送测试告警

alerta send --severity critical --resource web-01 --event cpu_high \
  --environment production --service web --text "Test alert for CPU"

测试特定规则

alerta rule test --name route-db-critical \
  --alert '{"severity":"critical","resource":"db-01","event":"query_slow","labels":{"team":"database"}}'

试运行模式

测试但不执行动作:

alerta rule test --name suppress-node-maintenance --dry-run \
  --alert '{"name":"node_down","labels":{"maintenance":"true"}}'

预期输出显示哪条规则会匹配以及会采取什么动作。


9. 规则统计

跟踪规则的表现。

# 查看所有规则统计
alerta rule stats

# 输出示例:
# NAME                     MATCHES   SUPPRESSED   ROUTED   INCIDENTS   LAST HIT
# route-db-critical        1523      0            1523     23          2026-04-12 17:30
# suppress-node-maintenance 445     445          0        0           2026-04-12 16:00
# auto-resolve-cpu         89        0            89      12          2026-04-12 15:45
# 查看特定规则的统计
alerta rule stats --name route-db-critical

# 重置统计
alerta rule stats --reset

关键指标

  • matches:针对此规则评估的告警数量
  • suppressed:被此规则静默的告警
  • routed:转发到频道的告警
  • incidents:创建的事件

10. 导入 / 导出规则

导出规则

# 导出所有规则为 JSON
alerta rule export --format json > rules.json

# 导出所有规则为 YAML
alerta rule export --format yaml > rules.yaml

# 导出特定规则
alerta rule export --name "route-db-critical" --name "suppress-maintenance" > specific-rules.yaml

导入规则

# 从文件导入(与现有规则合并)
alerta rule import --file rules.json

# 覆盖导入(用同名规则替换现有规则)
alerta rule import --file rules.json --overwrite

# 从 stdin 导入
cat rules.yaml | alerta rule import --format yaml

批量操作

# 备份所有规则
alerta rule export > backup-$(date +%Y%m%d).json

# 从备份恢复
alerta rule import --file backup-20260412.json --overwrite

# 导入前验证规则
alerta rule import --file rules.yaml --dry-run

规则文件格式(YAML)

rules:
  - name: route-db-critical
    priority: 10
    condition:
      severity: critical
      team: database
    action:
      type: notify
      channel: "#db-alerts"

  - name: suppress-node-maintenance
    priority: 100
    condition:
      label_exists: maintenance
      name_pattern: "node.*"
    action:
      type: suppress

快速参考

任务 命令
创建规则 alerta rule create --file rule.yaml
列出规则 alerta rule list
更新规则 alerta rule update --name <name> --file rule.yaml
删除规则 alerta rule delete --name <name>
测试规则 alerta rule test --name <name> --alert '{...}'
导出规则 alerta rule export > rules.json
导入规则 alerta rule import --file rules.json
查看统计 alerta rule stats