为了利用 Prometheus 对 nginx-prometheus-exporter 实例的服务状态进行全面监控,并在出现异常时及时响应,我这里引入Alertmanager作为警报管理系统。
Alertmanager 不仅能够接收来自 Prometheus 的警报,还能依据预设策略对警报进行聚合、抑制和静默处理。在此基础上,我特别配置了内置的email-receiver接收器,用来实现关键警报信息的即时邮件通知,确保运维团队能够在第一时间收到警报,快速定位并解决问题,从而有效提升系统的稳定性和响应速度。
部署alertmanager
[root@dev-centos7-shanghai-area1 packages]# wget https://github.com/prometheus/alertmanager/releases/download/v0.23.0/alertmanager-0.23.0.linux-amd64.tar.gz
[root@dev-centos7-shanghai-area1 packages]# tar -zxvf alertmanager-0.23.0.linux-amd64.tar.gz
[root@dev-centos7-shanghai-area1 packages]# mv alertmanager-0.23.0.linux-amd64 /data/app/
[root@dev-centos7-shanghai-area1 packages]# cd /data/app/alertmanager-0.23.0.linux-amd64
[root@dev-centos7-shanghai-area1 alertmanager-0.23.0.linux-amd64]# ll -h
总用量 53M
-rwxr-xr-x 1 alertmanager alertmanager 30M 8月 25 2021 alertmanager
-rwxr-xr-x 1 alertmanager alertmanager 1.1K 7月 10 14:50 alertmanager.yml
-rwxr-xr-x 1 alertmanager alertmanager 348 7月 10 10:14 alertmanager.yml.bak
-rwxr-xr-x 1 alertmanager alertmanager 23M 8月 25 2021 amtool
drwxr-xr-x 2 alertmanager alertmanager 35 7月 10 11:10 data
-rwxr-xr-x 1 alertmanager alertmanager 12K 8月 25 2021 LICENSE
-rwxr-xr-x 1 alertmanager alertmanager 457 8月 25 2021 NOTICE
[root@dev-centos7-shanghai-area1 alertmanager-0.23.0.linux-amd64]#
配置alertmanager服务
[root@dev-centos7-shanghai-area1 alertmanager-0.23.0.linux-amd64]# groupadd alertmanager
[root@dev-centos7-shanghai-area1 alertmanager-0.23.0.linux-amd64]# useradd -r -g alertmanager -s /sbin/nologin alertmanager
[root@dev-centos7-shanghai-area1 alertmanager-0.23.0.linux-amd64]# chown -R alertmanager:alertmanager /data/app/alertmanager-0.23.0.linux-amd64/
[root@dev-centos7-shanghai-area1 alertmanager-0.23.0.linux-amd64]# chmod +x -R /data/app/alertmanager-0.23.0.linux-amd64/
[root@dev-centos7-shanghai-area1 ~]# vim /etc/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager Service
After=network.target
[Service]
User=alertmanager
Group=alertmanager
Type=simple
ExecStart=/data/app/alertmanager-0.23.0.linux-amd64/alertmanager --config.file=/data/app/alertmanager-0.23.0.linux-amd64/alertmanager.yml --cluster.advertise-address=198.51.100.128:9093
Restart=on-failure
RestartSec=5s
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
[root@dev-centos7-shanghai-area1 alertmanager-0.23.0.linux-amd64]# systemctl enable alertmanager.service --now
配置alertmanager.yml
# alertmanager.yml - Alertmanager configuration file
global:
# 这里指定Alertmanager的通告地址和端口
# cluster_advertise: 198.51.100.128:9093
# 如果报警在5分钟后不再触发,则自动关闭报警,在这段时间内,即使报警再次触发也不会重新发送通知
resolve_timeout: 5m
# 配置邮件接收器,定义报警的路由逻辑,所有报警都会被路由到email-receiver接收器
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: email-receiver
# 定义接收器,email_configs 包含了邮件配置
receivers:
- name: 'email-receiver'
email_configs:
- to: 'richard@ponfey.com'
send_resolved: true
from: 'alert@ponfey.com'
smarthost: 'smtp.feishu.cn:465' # 飞书邮件服务器(SMTP)
auth_identity: 'alert@ponfey.com'
auth_secret: 'r0k5KCs!EX#a' # 生成报警专用的客户端授权码
# require_tls: true
require_tls: false # 修改为 false,这里需要注意飞书邮件服务器 SMTP 465 不支持STARTTLS
# 配置抑制规则和路由规则可以在这里添加
inhibit_rules: []
prometheus.yml 新增配置 Alertmanager
# prometheus.yml - Prometheus server configuration file
global:
scrape_interval: 15s # 定义抓取目标频率,单位是秒,配置每15秒抓取一次数据
evaluation_interval: 15s # 定义规则评估频率,单位是秒,配置每15秒评估一次报警规则
# 抓取配置,用于定义如何抓取监控目标的数据
scrape_configs:
- job_name: 'Prometheus_Service_Port_9090' # 定义了一个名为Prometheus_Service_Port_9090的抓取任务
static_configs: # 静态配置的目标列表,目标是直接抓取数据的地方
- targets: ['localhost:9090'] # 目标列表,将抓取本地主机上运行在9090端口上的Prometheus服务器自身的指标
- job_name: 'Nginx_Prometheus_Exporter_Port_9113' # 定义了抓取Nginx Prometheus Exporter的任务
static_configs:
- targets: ['203.0.113.128:9113'] # 目标列表,抓取远程主机上运行在9113端口上的Nginx Prometheus Exporter的指标
# 规则文件配置,用于加载自定义的告警规则
rule_files:
- "/etc/prometheus/rules/alert_rules.yml" # 引用告警规则文件
# 配置Alertmanager,Prometheus将警报发送给Alertmanager
alerting:
alertmanagers:
- static_configs:
- targets:
# - "alertmanager_host:198.51.100.128:9093" # Alertmanager的实际地址和端口号
- "localhost:9093" # Alertmanager 在同一台主机上运行,并且监听在默认端口 9093
在 rules/alert_rules.yml 新增配置
# alert_rules.yml - Prometheus alerting rules configuration file
groups:
- name: NginxAlerts # 规则组名称
rules:
# 当Nginx Prometheus Exporter服务不可用时触发报警
- alert: NginxExporterDown # 报警名称
expr: up{job="Nginx_Prometheus_Exporter_Port_9113"} == 0 # 表达式,检测Nginx Prometheus Exporter的up指标是否为0
for: 30s # 如果表达式结果为真,需持续30秒才会触发报警
labels: # 报警标签
severity: critical # 报警严重程度
annotations: # 报警注释
summary: "Nginx Prometheus Exporter is down on {{ $labels.instance }}" # 报警摘要
description: "The Nginx Prometheus Exporter has been down for more than 30 seconds." # 报警详细描述
alertmanager-0.23.0.linux-amd64 相关问题记录
1、配置alertmanager服务前手动运行遇到问题:
[root@dev-centos7-shanghai-area1 alertmanager-0.23.0.linux-amd64]# ./alertmanager --config.file=./alertmanager.yml
level=info ts=2024-07-10T02:29:06.418Z caller=main.go:225 msg="Starting Alertmanager" version="(version=0.23.0, branch=HEAD, revision=61046b17771a57cfd4c4a51be370ab930a4d7d54)" level=info ts=2024-07-10T02:29:06.418Z caller=main.go:226 build_context="(go=go1.16.7, user=root@e21a959be8d2, date=20210825-10:48:55)" level=warn ts=2024-07-10T02:29:06.424Z caller=cluster.go:177 component=cluster err="couldn't deduce an advertise address: no private IP found, explicit advertise addr not provided" level=error ts=2024-07-10T02:29:06.427Z caller=main.go:250 msg="unable to initialize gossip mesh" err="create memberlist: Failed to get final advertise address: No private IP address found, and explicit IP not provided"
分析:问题在于Alertmanager尝试自动发现网络接口的私有IP地址时失败了。可能是因为系统上没有配置任何网络接口,或者Alertmanager未能识别出有效的网络接口。
思路:Alertmanager的配置文件中显式地指定一个通告地址(advertise address)。这并不意味着Alertmanager会使用这个地址进行网络通信,而是告诉Alertmanager当其他实例尝试加入集群时,它们应该使用哪个地址来找到当前的Alertmanager实例。
解决方式:阅读release,熟悉版本特性,使用 cluster.advertise-address 参数
[root@dev-centos7-shanghai-area1 alertmanager-0.23.0.linux-amd64]# ./alertmanager --config.file=./alertmanager.yml --cluster.advertise-address=198.51.100.128:9093