更新时间:2025 年 6 月
版本:alertmanager 0.28.1
组件下载地址:Download | Prometheus
⚠️ 重要配置更新说明
从 Alertmanager v0.22.0 开始,以下配置项已被标记为 DEPRECATED(过时):
match
/match_re
source_match
/target_match
/target_match_re
新版本应该使用
matchers
、source_matchers
、target_matchers
语法
简介
Alertmanager 是 Prometheus 官方生态中的告警管理组件,专门用于接收来自 Prometheus 服务端的告警,并对其进行分类、去重、分组、抑制(抑制重复或相关告警)以及最终的通知发送
Alertmanager 支持将告警推送到多个通知渠道,包括:
- Webhook
- Slack
- PagerDuty
- 微信、钉钉等自定义 webhook
它允许灵活配置告警的接收人、告警级别(如 critical、warning)、静默时间窗口等,是构建稳定、高效告警系统的核心工具
与 Prometheus 的关系
- Prometheus 负责生成告警(Alert):
通过配置alerting rules
(告警规则),Prometheus 根据监控指标判断是否满足触发条件 - Alertmanager 负责处理告警(Alert management):
Prometheus 将告警推送给 Alertmanager,后者进行分组、抑制、路由,然后发送到指定的通知端 - 两者解耦:
Prometheus 专注于数据采集与告警生成;Alertmanager 专注于告警的后续处理与通知分发
主要功能
分组(Grouping)
作用
分组可以将相似或相关的警报合并为单个通知
这在大规模故障期间非常有用,当时许多系统同时失败,可能同时触发数百到数千个警报。分组可以避免警报洪泛,提升处理效率
警报的分组、分组通知的时间以及接收者由配置文件中的路由树进行配置
原理
- 标签匹配:根据
group_by
配置的标签(如alertname
,cluster
,service
)对警报分组。例如,同一服务的多个实例故障会被合并 - 时间窗口控制:
group_wait
:等待时间,用于收集初始触发的警报(如:30秒内收到的同类警报合并)group_interval
:同一组发送新警报的最小间隔(如:5分钟)repeat_interval
:重复发送相同警报的间隔(如:3小时)
示例
group_by
指定按照 alertname
和 cluster
标签进行分组
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'cluster']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'admin@example.com'
抑制(Inhibition)
作用
抑制用于在特定其他警报已触发时,抑制其他某些警报的提醒
原理
-
条件匹配
source_match
:定义触发抑制的源警报(如severity=critical
)target_match
:定义被抑制的目标警报(如severity=warning
)equal
:要求源和目标警报的某些标签必须一致(如cluster
)
-
逻辑:若源警报存在,则符合条件的目标警报会被静默
示例
当 severity=critical
的 ClusterDown
警报触发时,抑制同一集群内所有 severity=warning
的节点级警报
inhibit_rules:
- source_matchers:
- name: severity
value: 'critical'
- name: alertname
value: 'ClusterDown'
target_matchers:
- name: severity
value: 'warning'
equal: ['cluster'] # 要求集群标签相同
静默(Silences)
作用
手动临时屏蔽特定警报的通知,适用于计划维护或已知问题
原理
- 匹配规则:基于标签(如
alertname
,instance
)设置静默条件 - 时间范围:指定静默的起始时间和持续时间
- 管理方式:通过 Alertmanager 的 Web UI 或 API 创建/管理
高可用
Alertmanager 支持配置集群以实现高可用性。通过集群部署,可以确保在单个节点故障时警报系统仍然可用,并且通过分布式状态同步避免重复告警。
安装主机准备
主机准备
主机名 | 操作系统 | 架构 | IP | 安装软件 |
---|---|---|---|---|
alertmanager-01.monitor.local | AlmaLinux 9.6 | x86_64 | 192.168.111.198 | alertmanager |
时间设置
设置时区
timedatectl set-timezone Asia/Shanghai
设置主机名
hostnamectl set-hostname alertmanager-01.monitor.local
防火墙及 SELinux
安装后配置
内核模块设置(Docker 需要)
加载 br_netfilter
模块
modprobe br_netfilter
echo 'br_netfilter' > /etc/modules-load.d/br_netfilter.conf
系统参数
资源限制
PAM 模块
PAM 模块 pam_limits 对用户会话中可以获得的系统资源设置了限制,可以使用 ulimit 命令进行修改,或者直接将修改的值写入配置文件 /etc/security/limits.conf
和 /etc/security/limits.d/*.conf
# 备份原有的设置
find /etc/security/limits.d -type f -name *.conf -exec mv {} {}.bak.`date +"%Y%m%d"` \;
# 设置限制
cat > /etc/security/limits.d/sys.conf <<EOF
* - core unlimited
* - nproc unlimited
* - nofile 1048576
* - memlock unlimited
* - msgqueue unlimited
* - stack unlimited
EOF
systemd
systemd 有独立于 PAM 的资源限制(setrlimit
),若服务通过 systemd 启动也需要设置
###### 修改用户级默认配置 ######
# 备份原有的文件或创建目录
[ -f /etc/systemd/user.conf.d/ ] && find /etc/systemd/user.conf.d/ -type f -name *.conf -exec mv {} {}.bak.`date +"%Y%m%d"` \; || mkdir -p /etc/systemd/user.conf.d
# 修改配置
cat > /etc/systemd/user.conf.d/sys.conf << EOF
[Manager]
DefaultLimitCORE=infinity
DefaultLimitNPROC=infinity
DefaultLimitNOFILE=1048576
DefaultLimitMEMLOCK=infinity
DefaultLimitMSGQUEUE=infinity
EOF
###### 修改系统级默认配置 ######
# 备份原有的配置
cp /etc/systemd/system.conf /etc/systemd/system.conf.bak`date +"%Y%m%d"`
# 修改配置
grep -q '^#* *DefaultLimitCORE.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitCORE).*@\1=infinity@' /etc/systemd/system.conf || echo "DefaultLimitCORE=infinity" >> /etc/systemd/system.conf
grep -q '^#* *DefaultLimitNPROC.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitNPROC).*@\1=infinity@' /etc/systemd/system.conf || echo "DefaultLimitNPROC=infinity" >> /etc/systemd/system.conf
grep -q '^#* *DefaultLimitNOFILE.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitNOFILE).*@\1=1048576@' /etc/systemd/system.conf || echo "DefaultLimitNOFILE=1048576" >> /etc/systemd/system.conf
grep -q '^#* *DefaultLimitMEMLOCK.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitMEMLOCK).*@\1=infinity@' /etc/systemd/system.conf || echo "DefaultLimitMEMLOCK=infinity" >> /etc/systemd/system.conf
grep -q '^#* *DefaultLimitMSGQUEUE.*' /etc/systemd/system.conf && sed -ri 's@^#* *(DefaultLimitMSGQUEUE).*@\1=infinity@' /etc/systemd/system.conf || echo "DefaultLimitMSGQUEUE=infinity" >> /etc/systemd/system.conf
# 重启 systemd 生效
systemctl daemon-reexec
内核参数
cat >/etc/sysctl.d/99-sysctl.conf <<EOF
###### TCP 连接快速释放设置 ######
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
###### TIME_WAIT 过多时设置 ######
net.ipv4.tcp_tw_reuse = 1
#net.ipv4.tcp_tw_recycle = 0
# 限制 TIME_WAIT 最大值,默认 8192
net.ipv4.tcp_max_tw_buckets=5000
###### 端口相关设置 ######
# 设定允许系统主动打开的端口范围,根据需要设置,默认 32768 60999
net.ipv4.ip_local_port_range = 32768 65530
###### 防 SYNC 攻击设置 ######
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_max_syn_backlog=8192
# 配置 TCP 重传的最大次数减少到 5 次,超时时间约为 6 秒,方便及时发现节点故障
# net.ipv4.tcp_retries2=5
###### 其他 TCP 设置 ######
# 系统当前因后台进程无法处理的新连接而溢出,则允许系统重置新连接
net.ipv4.tcp_abort_on_overflow=1
####### nf_conntrack 相关设置(k8s、docker 防火墙的 nat) #######
net.netfilter.nf_conntrack_max = 262144
net.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 3600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
####### socket 相关设置 ######
net.core.somaxconn = 32768
net.core.netdev_max_backlog = 32768
###### 其他设置 #######
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
#
net.ipv4.conf.all.forwarding=1
net.ipv6.conf.all.forwarding=1
###### 内存相关设置 #######
vm.swappiness = 0
vm.max_map_count = 655360
vm.overcommit_memory = 0
# vm.min_free_kbytes = 1048576
###### 文件相关 #######
fs.file-max = 6573688
fs.nr_open = 1048576
fs.aio-max-nr = 1048576
####### K8S 相关设置 ######
# 必须先加载 br_netfilter 模块
# 二层的网桥在转发包时也会被 arptables/ip6tables/iptables 的 FORWARD 规则所过滤
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
###### 进程相关 #######
# 最大进程 id,默认值为 32768,最大值根据发行版有所不同
kernel.pid_max = 132768
kernel.threads-max = 123342
EOF
sysctl --system
单机安装
二进制方式
部署
基础变量设置
ALERTMANAGER_VERSION=0.28.1
ALERTMANAGER_OS=linux
ALERTMANAGER_ARCH=amd64
ALERTMANAGER_HOME=/opt/alertmanager
ALERTMANAGER_CONF=/etc/alertmanager
ALERTMANAGER_DATA=/data/alertmanager
ALERTMANAGER_USER=alertmanager
ALERTMANAGER_USER_GROUP=alertmanager
# 创建目录
mkdir -p ${ALERTMANAGER_HOME}/bin
mkdir -p ${ALERTMANAGER_CONF}/template
mkdir -p ${ALERTMANAGER_DATA}
# 创建用户和组
groupadd --system ${ALERTMANAGER_USER}
useradd -s /sbin/nologin --system -g ${ALERTMANAGER_USER_GROUP} ${ALERTMANAGER_USER}
下载解压
# 下载
curl -x http://192.168.111.1:10811 \
-o /usr/local/src/alertmanager-${ALERTMANAGER_VERSION}.${ALERTMANAGER_OS}-${ALERTMANAGER_ARCH}.tar.gz \
-L https://github.com/prometheus/alertmanager/releases/download/v${ALERTMANAGER_VERSION}/alertmanager-${ALERTMANAGER_VERSION}.${ALERTMANAGER_OS}-${ALERTMANAGER_ARCH}.tar.gz
# 解压
tar -xf /usr/local/src/alertmanager-${ALERTMANAGER_VERSION}.${ALERTMANAGER_OS}-${ALERTMANAGER_ARCH}.tar.gz \
-C /usr/local/src/
# 复制到对应目录
\cp /usr/local/src/alertmanager-${ALERTMANAGER_VERSION}.${ALERTMANAGER_OS}-${ALERTMANAGER_ARCH}/{alertmanager,amtool} ${ALERTMANAGER_HOME}/bin
\cp /usr/local/src/alertmanager-${ALERTMANAGER_VERSION}.${ALERTMANAGER_OS}-${ALERTMANAGER_ARCH}/alertmanager.yml ${ALERTMANAGER_CONF}
授权
chown -R ${ALERTMANAGER_USER}:${ALERTMANAGER_USER_GROUP} ${ALERTMANAGER_HOME}
chown -R ${ALERTMANAGER_USER}:${ALERTMANAGER_USER_GROUP} ${ALERTMANAGER_CONF}
chown -R ${ALERTMANAGER_USER}:${ALERTMANAGER_USER_GROUP} ${ALERTMANAGER_DATA}
配置
配置程序
默认配置
$ cat ${ALERTMANAGER_CONF}/alertmanager.yml
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/'
inhibit_rules:
- source_matchers:
- name: severity
value: 'critical'
target_matchers:
- name: severity
value: 'warning'
equal: ['alertname', 'dev', 'instance']
配置环境变量
cat > /etc/profile.d/alertmanager.sh << EOF
export ALERTMANAGER_HOME=${ALERTMANAGER_HOME}
export ALERTMANAGER_CONF=${ALERTMANAGER_CONF}
export ALERTMANAGER_DATA=${ALERTMANAGER_DATA}
export ALERTMANAGER_USER=${ALERTMANAGER_USER}
export ALERTMANAGER_USER_GROUP=${ALERTMANAGER_USER_GROUP}
export PATH=\${PATH}:\${ALERTMANAGER_HOME}/bin
EOF
source /etc/profile
配置 systemd 管理
cat > /usr/lib/systemd/system/alertmanager.service << EOF
[Unit]
Description=Alertmanager Server
Documentation=https://prometheus.io/docs/alerting/latest/overview/
After=network.target
[Service]
User=${ALERTMANAGER_USER}
Group=${ALERTMANAGER_USER_GROUP}
WorkingDirectory=${ALERTMANAGER_DATA}
Type=simple
ExecStart=${ALERTMANAGER_HOME}/bin/alertmanager \
--config.file=${ALERTMANAGER_CONF}/alertmanager.yml \
--storage.path=${ALERTMANAGER_DATA} \
--web.listen-address=0.0.0.0:9093 \
--log.level=info
Restart=on-failure
RestartSec=5s
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
配置 firewalld 和 SELinux
# 临时禁止 SELinux
setenforce 0
# 永久禁止 SELinux
sed -ri 's/^(SELINUX).*/\1=disabled/g' /etc/selinux/config && sed -ri 's/^SELINUX(.*)/\1=disabled/g' /etc/sysconfig/selinux
firewall-cmd --permanent --new-service=alertmanager
firewall-cmd --permanent --service=alertmanager --add-port=9093/tcp
firewall-cmd --permanent --zone=public --add-service=alertmanager
firewall-cmd --reload
启动
测试启动
cd ${ALERTMANAGER_DATA}
sudo -u ${ALERTMANAGER_USER} \
${ALERTMANAGER_HOME}/bin/alertmanager \
--config.file=${ALERTMANAGER_CONF}/alertmanager.yml \
--storage.path=${ALERTMANAGER_DATA} \
--web.listen-address=0.0.0.0:9093 \
--log.level=info
启动并设置开机启动
systemctl enable --now alertmanager
测试
curl http://localhost:9093
Docker 方式
dockerhub 地址:prom/alertmanager - Docker Image | Docker Hub
基础变量设置
ALERTMANAGER_VERSION=v0.28.1
ALERTMANAGER_CONF=/etc/prometheus
ALERTMANAGER_DATA=/data/prometheus
# 创建目录
mkdir -p ${ALERTMANAGER_CONF}/templates
mkdir -p ${ALERTMANAGER_DATA}
# 注:如果不想用 root 用户启动容器,需要将数据目录权限给到 nobody
chown -R nobody:nobody ${ALERTMANAGER_DATA}
# 配置环境变量
cat > /etc/profile.d/prometheus.sh << EOF
export ALERTMANAGER_VERSION=${ALERTMANAGER_VERSION}
export ALERTMANAGER_CONF=${ALERTMANAGER_CONF}
export ALERTMANAGER_DATA=${ALERTMANAGER_DATA}
EOF
source /etc/profile
复制配置文件
docker run -d --name tmp_alertmanager prom/alertmanager:${ALERTMANAGER_VERSION}
# 默认镜像中只有一个配置文件
docker cp tmp_alertmanager:/etc/alertmanager/alertmanager.yml ${ALERTMANAGER_CONF}/alertmanager.yml
docker rm -f tmp_prometheus
修改配置
vim ${ALERTMANAGER_CONF}/alertmanager.yml
启动
$ docker run -d --name=alertmanager --restart=always \
-p 9093:9093 \
-v ${ALERTMANAGER_CONF}:/etc/alertmanager \
-v ${ALERTMANAGER_DATA}:/alertmanager \
--restart=always \
--cpus 0.5 \
--memory 500M \
prom/alertmanager:${ALERTMANAGER_VERSION} \
--config.file=/etc/alertmanager/alertmanager.yml \
--storage.path=/alertmanager \
--web.listen-address=0.0.0.0:9093 \
--log.level=info
防火墙设置
停止 Docker
systemctl stop docker
重建 iptables 的 DOCKER-USER 链
firewall-cmd --permanent --direct --remove-chain ipv4 filter DOCKER-USER
firewall-cmd --permanent --direct --remove-rules ipv4 filter DOCKER-USER
firewall-cmd --permanent --direct --add-chain ipv4 filter DOCKER-USER
添加 iptables 规则
# 序号越小,优先级越高
# 允许已建立的连接(ESTABLISHED/RELATED),优先级 1
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
-m conntrack \
--ctstate RELATED,ESTABLISHED -j RETURN \
-m comment --comment 'Allow pre-existing connections (do not break active streams)'
# 允许容器相互访问,优先级 1
# 172.17.0.0/16 为 Docker 容器的 CIDR
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
-j RETURN \
-s 172.17.0.0/16 \
-m comment --comment 'allow docker-container internal communication'
# 默认拒绝所有其他流量,优先级 999
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 999 \
-j REJECT -m comment --comment 'reject all other traffic to DOCKER-USER'
允许某端口暴露
注:永久配置需要加
--permanent
选项
注:此处的 80 端口应该是容器侧的端口,例如 8080 端口映射到容器 80 端口,此处应该写 80 端口(-p 8080:80)。原因:
iptables
的PREROUTING
链的nat
表在filter
表之前,nat
表已经完成了 DNAT 转换。查看nat
表:iptables -nvL -t nat
# 暴露给指定 IP
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 2 \
-p tcp -m multiport --dports 9093 \
-s 192.168.111.1/32 -j RETURN
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 2 \
-p tcp -m multiport --dports 9093 \
-s 192.168.111.197/32 -j RETURN
# 暴露给指定网段
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 2 \
-p tcp -m multiport --dports 9093 \
-s 172.17.0.0/16 -j RETURN
加载永久配置
firewall-cmd --reload
启动 Docker
systemctl enable --now docker
测试
浏览器访问:http://192.168.111.198:9093/
Prometheus 配置
Prometheus 需要配置连接 Alertmanager,才能将告警正常发送到 Alertmanager
$ vim ${PROMETHEUS_CONF}/prometheus.yml
......
##### Alertmanager 配置
alerting:
alertmanagers:
- static_configs:
- targets:
# alertmanager 的 IP 或者域名,如果是集群需要配置每个节点
- 192.168.111.198:9093
......
#
附录
管理 API
健康检查
GET /-/healthy
HEAD /-/healthy
此端点始终返回 200,并应用于检查 Alertmanager 的健康状态
就绪检查
GET /-/ready
HEAD /-/ready
当 Alertmanager 准备服务流量(即响应查询)时,此端点返回 200
重新加载
POST /-/reload
此端点触发 Alertmanager 配置文件的重新加载
触发配置重新加载的另一种方式是将 SIGHUP
发送到 Alertmanager 进程