大家好,我是小斐呀。
这次起因是在某个朋友和我吐槽,之前公司使用 Alertmanager
没有完成彻底领悟到位,导致一个重大告警没有发出来,造成了一些故障,很是头疼,那这篇就聊聊关于 Alertmanager
的那些事。
上篇简单介绍如何写告警规则,当告警规则中的 for
等待时间到了后,告警状态就由 pending
变为 firing
也就是告警已经触发,告警消息已经生成发送出去,那么在告警消息触发后,由谁来接收告警消息的各种处理呢?业界用的比较多的就是 Alertmanager
。
Prometheus
和 VictoriaMetrics
自身不具备告警能力,因此需要结合第三方告警程序来实现监控指标告警。
Alertmanager
是一款不错的告警程序,首先由 Prometheus
或 VictoriaMetrics
体系下的 vmalert
配置并加载告警规则,当告警规则触发后,会把告警信息推送给 Altermanager
, Alertmanager
收到告警之后再根据配置的路由,根据报警级别不同分别发送给不同的 receive
(收件人), Alertmanager
可以实现邮件、企业微信、钉钉、飞书等报警。
Prometheus
和 vmalert
作为客户端, Alertmanager
负责处理由客户端发来的告警通知,对告警通知进行分组、去重后,根据路由规则将其路由到不同的 receiver
,下面是其简单的逻辑架构图:
告警逻辑
首先要配置 Prometheus
或 vmalert
成为 Alertmanager
的告警客户端;同时 Alertmanager
也是应用程序,它自身同样应该纳入 Prometheus
或 VictoriaMetrics
的监控目标; Alertmanager
也通过默认端口 9093
和 metrics
路径暴露自身的指标,新版本的默认开启集群模式,监听地址为:--cluster.listen-address=0.0.0.0:9093
,如果需要开启集群:
步骤 1:高可用性配置
1、启用集群
使用 --cluster.listen-address
参数指定集群监听的端口,默认是0.0.0.0:9094
。如果不需要启用高可用性,可以将 --cluster.listen-address
设置为空字符串。
# 启用集群
./alertmanager --config.file=alertmanager.yml --cluster.listen-address="0.0.0.0:9094"
2、设置节点间通信
使用 --cluster.peer 参数指定集群中其他 Alertmanager 实例的地址。 对于每个额外的节点,重复此参数。
./alertmanager --config.file=alertmanager.yml --cluster.listen-address="0.0.0.0:9094" --cluster.peer="192.168.1.2:9094" --cluster.peer="192.168.1.3:9094"
3、设置广告地址
如果实例没有符合 RFC 6890 且带有默认路由的 IP 地址,需使用 --cluster.advertise-address
参数指定该实例供其他节点通信的地址。
./alertmanager --config.file=alertmanager.yml --cluster.listen-address="0.0.0.0:9094" --cluster.advertise-address="192.168.1.1:9094"
步骤 2:调整集群参数
你可以通过以下 --cluster.*
参数微调集群的行为:
参数 | 用途 | 默认值 |
---|---|---|
--cluster.peer-timeout | 通信超时时间 | 15s |
--cluster.gossip-interval | 消息传播的时间间隔 | 200ms |
--cluster.pushpull-interval | 集群状态同步的时间间隔 | 1m0s |
--cluster.settle-timeout | 等待集群稳定后再开始通知评估的时间 | 无限 |
--cluster.tcp-timeout | TCP 操作的超时时间 | 10s |
--cluster.probe-timeout | 等待节点探测确认的时间 | 500ms |
--cluster.probe-interval | 节点探测的时间间隔 | 1s |
--cluster.reconnect-interval | 尝试重新连接丢失节点的时间间隔 | 10s |
--cluster.reconnect-timeout | 尝试重新连接丢失节点的最大持续时间 | 6h0m0s |
./alertmanager --config.file=alertmanager.yml --cluster.listen-address="0.0.0.0:9094" --cluster.peer="192.168.1.2:9094" --cluster.gossip-interval="300ms"
步骤 3:防火墙与容器注意事项
防火墙: 确保防火墙为集群监听端口(默认 9094)打开 TCP
和UDP
协议。容器: 如果 Alertmanager
在容器中运行,确保暴露集群端口9094
的TCP
和UDP
。
步骤 4:配置 Prometheus 指向 Alertmanager 集群
在 prometheus.yml
中,将所有Alertmanager
实例列入alerting > alertmanagers > static_configs
。
示例:
# Prometheus 对接 Alertmanager 集群
alerting:
alert_relabel_configs:
[ - <relabel_config> ... ]
alertmanagers:
- static_configs:
- targets:
- alertmanager1:9093
- alertmanager2:9093
- alertmanager3:9093
# vmalert 对接 Alertmanager 集群
./bin/vmalert
-rule=/etc/vmalert/alert.rules
-datasource.url=http://localhost:8428
-notifier.url=http://alertmanager1:9093
-notifier.url=http://alertmanager2:9093
-notifier.url=http://alertmanager3:9093
-remoteWrite.url=http://localhost:8428
-remoteRead.url=http://localhost:8428
-external.label=cluster=east-1
-external.label=replica=a
如果是单台 Alertmanager 对接,可以这样配置:
# Prometheus 对接 Alertmanager 单节点
alerting:
alert_relabel_configs:
[ - <relabel_config> ... ]
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
# vmalert 对接 Alertmanager 单节点
./bin/vmalert
-rule=/etc/vmalert/alert.rules
-datasource.url=http://localhost:8428
-notifier.url=http://alertmanager:9093
-remoteWrite.url=http://localhost:8428
-remoteRead.url=http://localhost:8428
-external.label=cluster=east-1 # 多集群场景,可用标签来标识来自那个集群
-external.label=replica=a # 多副本或多实例场景,可以用来标识来自那个副本或实例
重要提示: 不要使用负载均衡器在 Prometheus 和 Alertmanager 之间分发流量。Prometheus 必须向所有 Alertmanager 实例发送所有警报,以确保高可用性。
步骤 5:禁用高可用性
如果你希望运行单实例的 Alertmanager(不启用高可用性),可以将 --cluster.listen-address 设置为空字符串:
./alertmanager --config.file=alertmanager.yml --cluster.listen-address=""
高可用模式的告警逻辑架构图:
部署 Alertmanager
Altermanager
是一个独立的 go
二进制程序,需要独立部署及维护,部署方式可以是本地化,也可以是容器化部署,这里分别介绍下本地化部署和容器化部署,这篇文章截止目前是 v0.27.0
版本。
# 本地化二进制部署
wget -c https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz
# 创建目标目录
sudo mkdir -pv /opt/alertmanager
# 解压压缩包
tar -xzf alertmanager-0.27.0.linux-amd64.tar.gz -C /opt/alertmanager --strip-components=1
# 验证安装
cd /opt/alertmanager
./alertmanager --version
# 如果输出 Alertmanager 的版本信息,说明安装成功
# 配置 Alertmanager 下面会具体讲解 Alertmanager 的配置文件
##创建systemd启动脚本
cat << EOF >/etc/systemd/system/alternatives.service
[Unit]
Description=alternatives
After=network.target
[Service]
Type=simple
ExecStart=/opt/alertmanager/alertmanager --config.file=/opt/alertmanager/alertmanager.yml
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
docker 部署
docker run --name alertmanager -d -p 127.0.0.1:9093:9093 quay.io/prometheus/alertmanager
Alertmanager 其他启动参数:
参数 | 用途 | 默认值 |
---|---|---|
--config.file | 指定 Alertmanager 的配置文件路径 | alertmanager.yml |
--storage.path | 存储数据(例如静音规则和通知日志)的目录路径 | data/ |
--data.retention | 数据保留时间,例如静音和通知日志的过期时间(默认 120 小时) | 120h |
--data.maintenance-interval | 垃圾回收和将静音、通知日志写入磁盘的间隔时间 | 15m |
--alerts.gc-interval | 清理过期告警的时间间隔 | 30m |
--web.listen-address | 指定用于 Web 界面和指标暴露的监听地址和端口 | :9093 |
--web.config.file | 指定一个配置文件路径,用于启用 TLS 或身份验证(参考 Exporter Toolkit 文档) | 空 |
--web.external-url | 设置 Alertmanager 的外部 URL(如通过反向代理访问时)。用于生成相对或绝对的链接 | 空 |
--web.route-prefix | 内部 HTTP 路由的前缀 | 与 --web.external-url 一致 |
--web.get-concurrency | 设置最大并发处理的 GET 请求数量,默认值为 CPU 核心数的两倍 | 动态计算 |
--web.timeout | 设置 HTTP 请求的超时时间,负值或 0 表示没有超时 | 无 |
配置文件介绍
我们首先来了解下配置文件的布局和全局设置
# global 节点包含了所有通知渠道的默认设置,以及其他与通知相关的全局参数
global:
# 默认的 SMTP 邮件的 From 地址(邮件发件人)
smtp_from: "[email protected]"
# 用于发送邮件的 SMTP 服务器地址,通常包括端口号
smtp_smarthost: "smtp.163.com:465"
# 用于向 SMTP 服务器标识主机名 默认 localhost
smtp_hello: ""
# SMTP 身份验证的用户名,用于支持 LOGIN 和 PLAIN 方式的认证
smtp_auth_username: "[email protected]"
# SMTP 身份验证的用户名密码
smtp_auth_password: "Hello@111"
# 可以通过文件提供 SMTP 密码
# smtp_auth_password_file: "/opt/alertmanager/passwd.txt"
# SMTP 身份验证的身份标识,通常与用户名相同
smtp_auth_identity: "[email protected]"
# 用于 CRAM-MD5 认证的密钥
smtp_auth_secret:
# 是否要求使用 TLS 加密连接
smtp_require_tls: "true"
# HTTP 配置
http_config: <http_config>
# 告警在未收到更新时,默认多长时间后被标记为已解决
# 对于 Prometheus,通常不会用到,因为 Prometheus 会始终发送 EndsAt 时间
# 告警解决超时时间 默认值是 5m(5分钟)
resolve_timeout: 5m
# 自定义通知模板的文件路径列表,
# 支持使用通配符(如 templates/*.tmpl)
templates:
[ - <filepath> ... ]
# 定义路由规则的根节点,控制告警的分组和通知路径
route: <route>
# 定义通知接收器列表,包括邮件、Slack、Webhook 等
receivers:
- <receiver> ...
# 定义告警的抑制规则,用于在某些告警条件下禁止其他告警发送
inhibit_rules:
[ - <inhibit_rule> ... ]
# 代替 mute_time_intervals,更灵活地定义路由的静音或激活时间
time_intervals:
[ - <time_interval> ... ]
下面需要展开讲讲关于 templates
、 route
、 receivers
、 inhibit_rules
、 time_interval
这些层级的配置说明。
templates
接收器集成设置而言,就国内来说 Alertmanager
集成的邮箱和企业微信我们会用到,其他的基本上都需要基于第三方的插件或者组件去完成,像什么 Pagerduty
、 VictorOps
这些 On-Call
产品国内几乎很少企业用,像什么 Discord
、 Slack
、 Microsoft Teams
、 Microsoft Teams
、 Discord
等等都很少用到,如果要使用国内 On-Call
产品,真心推荐使用 FlashDuty
,符合国人的操作习惯,对接各种告警数据源。
国内主要用到的通知媒介有:邮箱、企业微信应用、企业微信/钉钉/飞书这三个国内主流的工作IM平台的群机器人(webhook),至于更高优先级的短信或者语音电话那就是另外的事情了。
这里展示下企业微信应用的部署:
假如 alertmanager
部署在 /opt/alertmanager
目录下,如下所示:
./alertmanager --config.file=alertmanager.yml --cluster.listen-address="0.0.0.0:9094" --cluster.peer="192.168.1.2:9094" --cluster.peer="192.168.1.3:9094"
0
alertmanager.yml
配置文件:
./alertmanager --config.file=alertmanager.yml --cluster.listen-address="0.0.0.0:9094" --cluster.peer="192.168.1.2:9094" --cluster.peer="192.168.1.3:9094"
1
编写发送企业微信告警模板
./alertmanager --config.file=alertmanager.yml --cluster.listen-address="0.0.0.0:9094" --cluster.peer="192.168.1.2:9094" --cluster.peer="192.168.1.3:9094"
2
WeChat.tmpl
模板文件
./alertmanager --config.file=alertmanager.yml --cluster.listen-address="0.0.0.0:9094" --cluster.peer="192.168.1.2:9094" --cluster.peer="192.168.1.3:9094"
3
邮件模板:
./alertmanager --config.file=alertmanager.yml --cluster.listen-address="0.0.0.0:9094" --cluster.peer="192.168.1.2:9094" --cluster.peer="192.168.1.3:9094"
4
比较全面的 alertmanaer.yml
配置查看:
./alertmanager --config.file=alertmanager.yml --cluster.listen-address="0.0.0.0:9094" --cluster.peer="192.168.1.2:9094" --cluster.peer="192.168.1.3:9094"
5
后续补充下关于如何定义钉钉、飞书、企业微信等机器人的 webhook
告警。
关于更多 Alertmanager
的参数设置,如:聚合,分组,抑制,路由,去重等可查看官网文档:
如果觉得写这样的告警通知配置文件很麻烦,希望有一个可视化告警配置操作,这里也强烈建议夜莺的告警模块,通过夜莺去接管告警,可以很好的避免写繁杂的配置文件实现告警需求。
个人建立了个星球圈子,主要去分享关于可观测性领域的实践,以及一些可靠的开源解决方案和架构,有兴趣的可以私信给我,我拉你进来。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...