大家好,我是小斐呀。
这次起因是在某个朋友和我吐槽,之前公司使用 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"
0alertmanager.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"
2WeChat.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 的参数设置,如:聚合,分组,抑制,路由,去重等可查看官网文档:
如果觉得写这样的告警通知配置文件很麻烦,希望有一个可视化告警配置操作,这里也强烈建议夜莺的告警模块,通过夜莺去接管告警,可以很好的避免写繁杂的配置文件实现告警需求。
个人建立了个星球圈子,主要去分享关于可观测性领域的实践,以及一些可靠的开源解决方案和架构,有兴趣的可以私信给我,我拉你进来。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……



 
		 
		 
		 
		

还没有评论,来说两句吧...