告警规则指南
本指南涵盖告警规则系统:基于条件→动作的告警处理自动化。
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: "admin@example.com"
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"
工作原理:
- 告警触发,
auto_resolve已启用 - 系统定期检查
healthy_condition - 如果健康条件连续满足
threshold次,告警被解决 - 如果在满足阈值前不健康条件返回,计数器重置
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 |