一、序言
本篇将根据官网手册来学习Alertmanager 告警工具,并结合其他教程来完善。
官网手册:https://prometheus.io/docs/alerting/latest/overview/#required-for-focus
Alertmanager 介绍:
Alertmanager 处理客户端应用程序(如 Prometheus 服务器)发送的警报。它负责去重、分组,并将它们路由到正确的接收器集成,例如电子邮件、PagerDuty 或 OpsGenie。它还负责警报的静音和抑制。
以下是对 Alertmanager 更详细的介绍:
分组:
分组将性质相似的警报分类为单个通知。这在大型故障期间特别有用,当时许多系统同时失效,可能同时触发数百到数千个警报。
示例: 当发生网络分区时,您的集群中有数十个或数百个服务实例正在运行。您服务的一半实例无法再访问数据库。Prometheus 中的告警规则被配置为,如果服务实例无法与数据库通信,则针对每个服务实例发送告警。结果,数百个告警被发送到 Alertmanager。
作为用户,您只想获取一个页面,同时仍能确切看到哪些服务实例受到影响。因此,您可以配置 Alertmanager 按其 cluster 和 alertname 对告警进行分组,以便它发送一个紧凑的通知。
告警的分组、分组通知的发送时间以及接收这些通知的接收者,在配置文件中的路由树中进行配置
抑制:
抑制是一个概念,当某些其他警报已经触发时,它会抑制某些特定警报的通知。
示例: 有一个警报正在触发,告知整个集群无法访问。Alertmanager 可以配置为,如果该特定警报正在触发,则静音所有其他与此集群相关的警报。这可以防止数百或数千个与实际问题无关的触发警报的通知。
抑制通过 Alertmanager 的配置文件进行配置。
静默:
静默是一种简单的方法,可以暂时屏蔽警报。静默的配置基于匹配器,就像路由树一样。传入的警报会检查它们是否匹配所有活跃静默中的等式或正则表达式匹配器。如果匹配,则不会为该警报发送通知。
静默在 Alertmanager 的 Web 界面中配置。
二、安装Alertmanager
1. 下载Alertmanager
下载页面:https://prometheus.io/download/,找到Alertmanager进行下载
Alertmanager手册地址:https://github.com/prometheus/alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.28.1/alertmanager-0.28.1.linux-amd64.tar.gz
tar -zxvf alertmanager-0.28.1.linux-amd64.tar.gz
ll
drwxr-xr-x 3 1001 1002 4096 Aug 22 15:54 ./
drwxr-xr-x 8 root root 4096 Aug 22 15:53 ../
-rwxr-xr-x 1 1001 1002 38948743 Mar 7 23:06 alertmanager*
-rw-r--r-- 1 1001 1002 356 Mar 7 23:07 alertmanager.yml
-rwxr-xr-x 1 1001 1002 30582387 Mar 7 23:06 amtool*
drwxr-xr-x 2 root root 4096 Aug 22 16:36 data/
-rw-r--r-- 1 1001 1002 11357 Mar 7 23:07 LICENSE
-rw-r--r-- 1 1001 1002 311 Mar 7 23:07 NOTICE
alertmanager
:二进制可执行文件alertmanager.yml
:核心配置文件amtool
:Alertmanager 的命令行工具,与 Alertmanager 进行交互。data
:存储 Alertmanager 的数据,在Alertmanager 重启时,可以从这个目录中读取之前保存的数据。
启动alertmanager :
./alertmanager --config.file=alertmanager.yml
9093端口访问web告警页面:
2. Alertmanager 菜单栏功能介绍:
Alerts
:查看当前活跃的告警分组
(1)筛选与分组
Filter
:通过标签筛选告警(如 env=“production” 只显示生产环境的告警)。Group
:按配置的 group_by 规则(如 alertname、cluster)展示分组后的告警。
(2)状态筛选
Receiver: All
:筛选特定接收者的告警。Receiver: web.hook
:仅显示与 web.hook 接收者关联的告警Silenced
:仅显示被 “静默规则” 屏蔽的告警。Inhibited
:仅显示被 “抑制规则” 屏蔽的告警(由主故障引发的次生告警)。Muted
:仅显示被 “mute 规则” 屏蔽的告警(部分定制场景)。
Silences
:管理 “静默规则”(临时屏蔽指定告警,避免通知干扰)
(1)顶部按钮
New Silence
:创建新的静默规则(指定匹配条件、生效时间、注释)。
(2)筛选栏
Filter
:通过标签筛选静默规则(如 env=“production” 只显示生产环境的静默规则)。
(3)状态标签
Active
:正在生效的静默规则(当前屏蔽告警)。Pending
:即将生效的静默规则(未来某个时间开始屏蔽)。Expired
:已过期的静默规则(历史记录,可用于审计)。
Settings
:选择周一或者周日作为一周的第一天。
3. 配置systemd系统服务(可选)
cat > /lib/systemd/system/alertmanager.service << EOF
[Unit]
Description=Receive alerts from Prometheus and route them to the designated receiver.
Documentation=https://github.com/prometheus/alertmanager
[Service]
Restart=on-failure
EnvironmentFile=/etc/default/alertmanager
ExecStart=/usr/bin/alertmanager \$ARGS
ExecReload=/bin/kill -HUP \$MAINPID
TimeoutStopSec=20s
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
EOF
移动配置文件和二进制文件到指定的位置:
cp alertmanager amtool /usr/bin/
mkdir /etc/alertmanager && cp alertmanager.yml /etc/alertmanager/
touch /etc/default/alertmanager && echo 'ARGS="--config.file=/etc/alertmanager/alertmanager.yml --storage.path=/var/lib/alertmanager"' > /etc/default/alertmanager
创建存储位置:
mkdir /var/lib/alertmanager
加载systemd配置并启动alertmanager:
systemctl daemon-reload
systemctl start alertmanager
4. 使用docker部署(可选)
镜像使用参考docker-hub: https://hub.docker.com/r/prom/alertmanager
拉取镜像:
镜像加速器:https://quay-pull.ygxz.in
docker pull quay.io/prometheus/alertmanager
查看镜像构建过程
quay.io/prometheus/alertmanager --no-trunc
IMAGE CREATED CREATED BY SIZE COMMENT
sha256:91c01b3cec9b5b3071454a5bf13814e64127ed1601b9afd3b932559945fc9a5e 5 months ago CMD ["--config.file=/etc/alertmanager/alertmanager.yml" "--storage.path=/alertmanager"] 0B buildkit.dockerfile.v0
<missing> 5 months ago ENTRYPOINT ["/bin/alertmanager"] 0B buildkit.dockerfile.v0
<missing> 5 months ago WORKDIR /alertmanager 0B buildkit.dockerfile.v0
<missing> 5 months ago VOLUME [/alertmanager] 0B buildkit.dockerfile.v0
<missing> 5 months ago EXPOSE map[9093/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 5 months ago USER nobody 0B buildkit.dockerfile.v0
<missing> 5 months ago RUN |2 ARCH=amd64 OS=linux /bin/sh -c mkdir -p /alertmanager && chown -R nobody:nobody etc/alertmanager /alertmanager # buildkit 356B buildkit.dockerfile.v0
<missing> 5 months ago COPY examples/ha/alertmanager.yml /etc/alertmanager/alertmanager.yml # buildkit 356B buildkit.dockerfile.v0
<missing> 5 months ago COPY .build/linux-amd64/alertmanager /bin/alertmanager # buildkit 38.9MB buildkit.dockerfile.v0
<missing> 5 months ago COPY .build/linux-amd64/amtool /bin/amtool # buildkit 30.6MB buildkit.dockerfile.v0
<missing> 5 months ago ARG OS=linux 0B buildkit.dockerfile.v0
<missing> 5 months ago ARG ARCH=amd64 0B buildkit.dockerfile.v0
<missing> 5 months ago LABEL org.opencontainers.image.source=https://github.com/prometheus/alertmanager 0B buildkit.dockerfile.v0
<missing> 5 months ago LABEL maintainer=The Prometheus Authors <prometheus-developers@googlegroups.com> 0B buildkit.dockerfile.v0
<missing> 20 months ago COPY /rootfs / # buildkit 1.54MB buildkit.dockerfile.v0
<missing> 20 months ago MAINTAINER The Prometheus Authors <prometheus-developers@googlegroups.com> 0B buildkit.dockerfile.v0
<missing> 21 months ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 21 months ago /bin/sh -c #(nop) ADD file:ee9bb8755ccbdd689b434d9b4ac7518e972699604ecda33e4ddc2a15d2831443 in / 1.24MB
截取主要内容:
- 完整启动命令:
/bin/alertmanager--config.file=/etc/alertmanager/alertmanager.yml --storage.path=/alertmanager
- 声明的一个卷,挂载到
/alertmanager
- 声明使用的端口号为:
9093
启动容器:
docker run --name alertmanager -d -p 9093:9093 quay.io/prometheus/alertmanager
三、Alertmanager配置
1. 告警流程了解
在告警概述中有描述:https://prometheus.io/docs/alerting/latest/overview/
使用 Prometheus 进行告警分为两个部分。Prometheus 服务器中的告警规则将告警发送到 Alertmanager。Alertmanager 然后管理这些告警,包括静音、抑制、聚合和 通过电子邮件、待命通知系统和聊天平台等方式发送通知。
设置告警和通知的主要步骤是:
- 设置并配置 Alertmanager
- 配置 Prometheus 以与 Alertmanager 通信
- 在 Prometheus 中创建告警规则
Prometheus告警和通知的流程:
prometheus设置告警规则 --> 触发告警 --> 满足触发时间 --> prometheus向alertmanager发送Firing 告警 --> alertmanager对告警进行分组|聚合|抑制|静默 --> 将告警路由到指定接收器 --> 接收器发送给指定接收人(告警|恢复)。
- 接收器指的是告警媒体,比如邮件,微信,钉钉等
2. 根据告警流程来配置
2.1. 配置alertmanager
alertmanager完整配置官网介绍:https://prometheus.io/docs/alerting/latest/configuration
alertmanager配置可以分为5个模块如下:
模块名称 | 作用 | 详细说明 |
---|---|---|
global | 全局设置 | 全局配置指定在所有其他配置上下文中有效的参数,它们也作为其他配置部分的默认值。 |
route | 路由相关的设置 | 与路由相关的设置允许根据时间配置警报的路由、聚合、节流和静音。 |
inhibit_rule | 抑制相关设置 | 抑制允许根据另一组告警的存在来静音一组告警。这允许在系统或服务之间建立依赖关系,以便在故障期间只发出一组相互关联告警中最相关的告警。 |
receivers | 通用接收器相关设置 | 接收器是一个包含一个或多个通知集成的命名配置。 |
templates | 通知模板 | 导入一个或多个通知模板 |
官网配置示例:https://github.com/prometheus/alertmanager/blob/main/doc/examples/simple.yml
配置示例如下:
使用promtool
检查你的配置文件:
promtool check config /etc/prometheus/prometheus.yml
下面的配置文件中不包含templates
告警通知模板,templates
将单独一篇文章介绍
global:
# 全局 SMTP 配置(所有邮件接收器可共用)
smtp_from: "example@qq.com" # 发件人邮箱
smtp_smarthost: "smtp.qq.com:465" # QQ邮箱SMTP服务器地址及端口
smtp_hello: "qq.com" # 向SMTP服务器标识的主机名
smtp_auth_username: "example@qq.com" # 发件人邮箱账号
smtp_auth_password: "yuhjzmwanwkaddge" # QQ邮箱SMTP授权码
smtp_require_tls: false # QQ邮箱465端口使用SSL而非STARTTLS,需设为false
route:
group_by: ['alertstype'] # 按告警标签进行分组,多个告警包含这个标签时会被分为一组告警
group_wait: 30s # 首次分组等待时间
group_interval: 5m # 同组告警更新间隔
repeat_interval: 1h # 未恢复告警的重复通知间隔
receiver: 'IT部门' # 告警接收对象
receivers:
- name: 'IT部门'
email_configs:
- send_resolved: true # 告警恢复时发送通知
to: "recipient@163.com" # 收件人邮箱(可多个逗号分隔)
tls_config:
insecure_skip_verify: false # 生产环境建议保持false,验证证书
headers:
Subject: "Prometheus 告警通知" # 自定义邮件主题
inhibit_rules:
- source_match: # 匹配源告警,当源告警被触发会抑制,包含相同标签的 target_match告警将会被抑制
severity: 'critical'
target_match:
severity: 'warning'
equal: ['instance','project','env'] # 相同标签的告警才会被抑制
2.2. 配置 Prometheus 以与 Alertmanager 通信
修改prometheus配置文件alerting
部分配置文件:
alerting:
alertmanagers:
- static_configs:
- targets:
- 127.0.0.1:9093
添加alertmanagers告警地址并重新加载prometheus配置。
2.3. 创建Prometheus告警规则
告警规则的配置可以参考我之前的文章:https://blog.csdn.net/qq_50247813/article/details/150492677
使用amtool 检查你的配置文件:
amtool check-config alertmanager.yml
/etc/prometheus/alerting_rules.yml:
groups:
#创建记录规则(计算并存储cpu使用率)
- name: cpu_recording_rules
rules:
- record: instance:node_cpu_seconds:avg_rate5m
expr: 100 - (avg by (instance,project,env) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
labels:
metric_type: derived
#创建告警规则(引用记录规则)
- name: cpu_alerts
rules:
- alert: HighCpuUsage
expr: instance:node_cpu_seconds:avg_rate5m > 80
for: 2m
labels:
severity: warning
alertstype: NodeCpuAlerts #添加alertstype标签,alertmanager使用包含这个标签的告警作为一组告警
annotations:
summary: "实例 {{ $labels.instance }} CPU使用率过高"
description: "CPU使用率已达 {{ $value | humanize }}%(阈值80%)"
- alert: CriticalCpuUsage
expr: instance:node_cpu_seconds:avg_rate5m > 95
for: 1m
labels:
severity: critical
alertstype: NodeCpuAlerts #添加alertstype标签,alertmanager使用包含这个标签的告警作为一组告警
annotations:
summary: "实例 {{ $labels.instance }} CPU使用率临界"
description: "CPU使用率已达 {{ $value | humanize }}%(阈值95%),系统可能无响应!"
- 在告警配置文件中,主要是通过表达式进行获取数据,并对数据进行分组计算:
100 - (avg by (instance,project,env) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
以看出上述表达式计算cpu 5分钟内的使用率,并使用标签instance
,project
,env
进行分组,除了·instance
其他两个都是在添加主机时添加的,上面配置alertmanager
配置的时候就有使用到这3标签作为抑制条件。
2.4. 在Prometheus配置文件中导入告警规则
rule_files:
- '/etc/prometheus/alerting_rules.yml'
重新加载prometheus配置文件
3. 测试告警
对cpu进行压测提高使用率:
stress --cpu 2 --timeout 600s
两个告警规则CriticalCpuUsage
只有被发送给alertmanager ,HighCpuUsage
被抑制了。
查看alertmanager 告警,告警被分组发送给“IT部门”这个对象了。
查看邮件告警:
查看告警恢复:
告警恢复中,包含了HighCpuUsage
告警。
4. 配置静默告警
在服务器需要维护关机的时候,或者已知会告警,但是需要忽略的时候,可以配置静默告警。
配置方法:
4.1. 使用web界面配置
alertmanager 默认自带了web ui :http://alertmanager:9093/’
点击 New Silence
进入到配置界面
窗口介绍:
- Start :开始介绍
- Duration: 持续时间
- End:结束时间
- Matchers Alerts affected by this silence : 通过标签来静默告警
- Creator:静默规则创建人
- Comment:描述
- Preview Alerts:预览告警
- Create:创建告警
- Reset:重置告警
点击创建后:
点击Expire使静默规则失效
4.2 使用amtool创建静默规则
amtool silence add \
--alertmanager.url=http://localhost:9093 \
--start=2025-08-28T08:45:39.061Z \
--end=2025-08-28T08:55:24.343Z \
--comment="这是一个测试" \
alertstype=NodeCpuAlerts
- start:开始时间使用的是UTC时间,换成北京时间需要+8
- end: 结束时间
T
用来区分日期与时间,Z
表明是UTC时间- alertstype=NodeCpuAlerts:匹配告警标签
在web界面查看规则:
使用amtool查看:
amtool silence --alertmanager.url=http://localhost:9093
amtool 取消静默规则:
amtool silence expire 8f131e67-1046-4897-bc4d-5a10117262ab --alertmanager.url=http://localhost:9093
8f131e67-1046-4897-bc4d-5a10117262ab
: 规则id
4.3. cpu压测查看效果
stress --cpu 2 --timeout 600s
prometheus 中 已经触发了告警
在alertmanager 中没有告警,
5. alertmanager route详细学习
alertmanager route 路由原理是通过匹配标签来决定如何发送告警,从根路由触发一级一级匹配。
通过路由细分来学习:
下面通过实验来完成图上路由细分:
(1) 创建两个告警cpu_alerts
,memory_alerts
,如下:
/etc/prometheus/alerting_rules.yml:
groups:
# 记录规则
#保存cpu使用率
- name: cpu_usage_rules
rules:
- record: instance:node_cpu_seconds:avg_rate5m
expr: 100 - (avg by (instance,target_type,env) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
labels:
metric_type: derived
#保存内存使用率
- name: memory_usage_rules
rules:
- record: instance:node_memory:avg
expr: avg by (instance,target_type,env) (100 - ((node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) / node_memory_MemTotal_bytes) * 100)
labels:
metric_type: derived
# 告警规则
- name: cpu_alerts
rules:
- alert: HighCpuUsage
expr: instance:node_cpu_seconds:avg_rate5m > 80
for: 2m
labels:
severity: warning
alertstype: NodeCpuAlerts
annotations:
summary: "实例 {{ $labels.instance }} CPU使用率过高"
description: "CPU使用率已达 {{ $value | humanize }}%(阈值80%)"
- alert: CriticalCpuUsage
expr: instance:node_cpu_seconds:avg_rate5m > 95
for: 1m
labels:
severity: critical
alertstype: NodeCpuAlerts
annotations:
summary: "实例 {{ $labels.instance }} CPU使用率临界"
description: "CPU使用率已达 {{ $value | humanize }}%(阈值95%),系统可能无响应!"
- name: memory_alerts
rules:
- alert: HighMemoryUsage
expr: instance:node_memory:avg > 80
for: 2m
labels:
severity: warning
alertstype: NodeMemoryAlerts
annotations:
summary: "实例 {{ $labels.instance }} 内存使用率过高"
description: "memory使用率已达 {{ $value | humanize }}%(阈值80%)"
- alert: CriticalMemoryUsage
expr: instance:node_memory:avg > 95
for: 1m
labels:
severity: critical
alertstype: NodeMemoryAlerts
annotations:
summary: "实例 {{ $labels.instance }} 内存使用率临界"
description: "memory使用率已达 {{ $value | humanize }}%(阈值95%),请尽快处理!"
(2)配置路由:
alertmanager配置文件:
/etc/alertmanager/alertmanager.yml:
global:
# 全局 SMTP 配置(所有邮件接收器可共用)
smtp_from: "2734542837@qq.com" # 发件人邮箱
smtp_smarthost: "smtp.qq.com:465" # QQ邮箱SMTP服务器地址及端口
smtp_hello: "qq.com" # 向SMTP服务器标识的主机名
smtp_auth_username: "2734542837@qq.com" # 发件人邮箱账号
smtp_auth_password: "yuhjzmwanwkaddge" # QQ邮箱SMTP授权码
smtp_require_tls: false # QQ邮箱465端口使用SSL而非STARTTLS,需设为false
#根路由,根路由的配置会被子路由继承
route:
group_by: ['instance','target_type','env'] # 按告警名称分组
group_wait: 30s # 首次分组等待时间
group_interval: 5m # 同组告警更新间隔
repeat_interval: 1h # 未恢复告警的重复通知间隔
receiver: 'IT负责人' # 告警接收对象
routes:
#下级路由
- receiver: '运维组'
matchers:
- env="prod" # 匹配标签env="prod"
continue: true # 匹配完继续向下匹配,默认是false
#在下级路由
routes:
- receiver: '张三'
matchers:
- alertstype="NodeMemoryAlerts"
# 告警对象配置
receivers:
- name: 'IT负责人'
email_configs:
- send_resolved: true # 告警恢复时发送通知
to: "example01@163.com"
tls_config:
insecure_skip_verify: false # 生产环境建议保持false,验证证书
headers:
Subject: "Prometheus 告警通知" # 自定义邮件主题
- name: '运维组'
email_configs:
- send_resolved: true # 告警恢复时发送通知
to: "example02@qq.com"
tls_config:
insecure_skip_verify: false
headers:
Subject: "Prometheus 告警通知"
- name: '张三'
email_configs:
- send_resolved: true
to: "example03@163.com"
tls_config:
insecure_skip_verify: false
headers:
Subject: "Prometheus 告警通知"
# 告警抑制配置
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['instance','target_type','env'] # 相同标签的告警才会被抑制
内存压测:
stress --vm 2 --vm-bytes 1.5G --vm-keep --timeout 1000s
example02@qq.com 和 example03@163.com 会同时收到告警。
6. 告警静音配置
适用场景在与,非工作日时,不重要的告警将会被静音,不发送告警;
例如:
在非工作日时,将告警级别为warning
的静音,修改alertmanager
配置文件:
# 配置静音时间
mute_time_intervals:
- name: weekends # 自定义静音规则名称
time_intervals: # 时间间隔定义
- times: # 覆盖全天(00:00 至 24:00)
- start_time: 00:00
end_time: 24:00
weekdays: # 明确指定周六和周日(使用名称,不支持数字)
- Saturday # 周六
- Sunday # 周日
location: Local # 使用 Alertmanager 所在机器的本地时间(可选,默认 UTC)
#根路由
route:
group_by: ['instance','target_type','env'] # 按告警名称分组
group_wait: 30s # 首次分组等待时间
group_interval: 5m # 同组告警更新间隔
repeat_interval: 1h # 未恢复告警的重复通知间隔
receiver: 'IT负责人' # 告警接收对象
#下级路由
routes:
- receiver: '运维组'
matchers:
- env="prod" # 匹配标签env="prod"
- severity="warning" # 匹配告警级别
mute_time_intervals:
- weekends # 调用静音规则,会传递给下面的子路由
continue: true # 匹配完继续向下匹配,默认是false
#在下级路由
routes:
- receiver: '张三'
matchers:
- alertstype="NodeMemoryAlerts
- 匹配上
- env="prod"
,- severity="warning"
周末将会被静音,我这边是实验使用- env="prod"
,正常环境应该test或者dev