17.7.6 告警维护与静默机制

告警维护与静默机制#

告警维护与静默机制用于在变更窗口内抑制噪音但不破坏监控体系。核心能力包括 Silence(静默)Inhibit(抑制),前者完全停止通知,后者保留告警状态但压制下游告警的通知。

机制原理草图#

文章图片

安装与工具准备(amtool)#

# 以二进制方式安装 amtool(与 alertmanager 版本一致)
wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz
tar -xf alertmanager-0.27.0.linux-amd64.tar.gz
sudo cp alertmanager-0.27.0.linux-amd64/amtool /usr/local/bin/
amtool --version

Silence 创建与管理(命令示例)#

# 1) 创建静默(作用 2 小时)
# 说明:--match 指定标签,--duration 设定时长,--comment 记录原因
amtool --alertmanager.url=http://127.0.0.1:9093 \
  silence add \
  --match='env="prod"' \
  --match='job=~"mysql|nginx"' \
  --match='instance=~"10.0.1.(10|11):9100"' \
  --duration=2h \
  --comment="发布窗口,工单#CHG-20240101"

# 2) 列出静默并查看状态
amtool --alertmanager.url=http://127.0.0.1:9093 silence list

# 3) 过期/生效过滤
amtool --alertmanager.url=http://127.0.0.1:9093 silence list --active
amtool --alertmanager.url=http://127.0.0.1:9093 silence list --expired

# 4) 解除静默(用列表中的 silence ID)
amtool --alertmanager.url=http://127.0.0.1:9093 silence expire a1b2c3d4e5f6

Alertmanager 配置示例(抑制策略)#

# /etc/alertmanager/alertmanager.yml
inhibit_rules:
  - source_match:
      alertname: InstanceDown
    target_match_re:
      alertname: "CPUHigh|MemoryHigh|DiskFull"
    equal: ["instance", "job", "env"]

route:
  group_by: ["alertname", "job", "env"]
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 2h
  receiver: "ops-email"

receivers:
  - name: "ops-email"
    email_configs:
      - to: "ops@example.com"

API 方式创建静默(适合 CI/CD)#

# 通过 REST API 创建静默
curl -X POST http://127.0.0.1:9093/api/v2/silences \
  -H 'Content-Type: application/json' \
  -d '{
    "matchers":[
      {"name":"env","value":"prod","isRegex":false},
      {"name":"job","value":"mysql|nginx","isRegex":true}
    ],
    "startsAt":"2024-01-01T10:00:00Z",
    "endsAt":"2024-01-01T12:00:00Z",
    "createdBy":"jenkins",
    "comment":"发布流水线自动静默"
  }'

维护窗口管理流程(示例)#

# 维护开始前自动静默(示例脚本片段)
export AM_URL="http://127.0.0.1:9093"
export DURATION="90m"
amtool --alertmanager.url=$AM_URL silence add \
  --match='env="prod"' \
  --match='service="payment"' \
  --duration=$DURATION \
  --comment="支付服务变更窗口"

# 维护后验证告警是否恢复(查询活动告警)
amtool --alertmanager.url=$AM_URL alert query --severity=critical

常见排错与验证#

  1. 静默未生效
    - 排查:标签不匹配或大小写不一致
    - 验证命令:
    bash amtool --alertmanager.url=http://127.0.0.1:9093 alert query --active
  2. 静默范围过大
    - 排查:正则过宽
    - 建议:用 instance 或 service 精确匹配
  3. 静默过期后仍未恢复通知
    - 排查:抑制规则仍在生效
    - 验证:
    bash amtool --alertmanager.url=http://127.0.0.1:9093 status | grep -i inhibit -A3

练习#

  1. amtoolenv=prodnginx 静默 30 分钟,设置注释并截图保存静默 ID。
  2. 添加一个抑制规则:当 ServiceDown 触发时抑制 LatencyHighErrorRateHigh
  3. 使用 API 创建静默并用 amtool silence list --active 验证其生效。