整套告警体系的核心是 Prometheus 发现异常,Alertmanager 统一处理和发送通知。我把从零开始搭建的完整流程拆解成5步,跟着操作就行:
第一步:安装 Alertmanager
Alertmanager 需要作为独立服务安装,并让它与 Prometheus 通信。
下载与安装:
bash
# 创建专用用户
sudo useradd -M -r -s /bin/false alertmanager
# 下载并解压(去官网找最新版本替换链接)
wget https://github.com/prometheus/alertmanager/releases/download/v0.28.0/alertmanager-0.28.0.linux-amd64.tar.gz
tar xvfz alertmanager-0.28.0.linux-amd64.tar.gz
sudo cp alertmanager-0.28.0.linux-amd64/alertmanager /usr/local/bin/
sudo cp alertmanager-0.28.0.linux-amd64/alertmanager.yml /etc/alertmanager/
创建 Systemd 服务:
bash
sudo vim /etc/systemd/system/alertmanager.service
写入以下内容:
ini
[Unit]
Description=Prometheus Alertmanager
Wants=network-online.target
After=network-online.target
[Service]
User=alertmanager
Group=alertmanager
Type=simple
ExecStart=/usr/local/bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/var/lib/alertmanager/
[Install]
WantedBy=multi-user.target
启动并验证:
bash
sudo systemctl daemon-reload
sudo systemctl enable alertmanager
sudo systemctl start alertmanager
# 访问 http://你的IP:9093,能看到 Alertmanager 界面就成功
第二步:配置 Prometheus,让它找到 Alertmanager
修改 Prometheus 的配置文件 prometheus.yml,在 alerting 部分添加 Alertmanager 的地址。
yaml
alerting:
alertmanagers:
- static_configs:
- targets: ["localhost:9093"] # 如果不在同一台机器,换IP
重启 Prometheus 使配置生效,并通过 systemctl restart prometheus 重启。
第三步:在 Prometheus 中定义告警规则
创建告警规则文件,例如 node_alerts.yml,定义在什么情况下触发告警。
yaml
groups:
- name: node_alerts
rules:
- alert: HighCPUUsage
expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m # 持续5分钟才触发,防止误报
labels:
severity: critical
annotations:
summary: "High CPU usage detected on {{ $labels.instance }}"
description: "CPU usage is above 80% for 5 minutes."
在 Prometheus 主配置文件 prometheus.yml 中引用这个规则文件:
yaml
rule_files:
- "node_alerts.yml"
再次重启 Prometheus。在它的 Web 界面“Alerts”页面,能看到刚配置的规则就对了。
第四步:配置 Alertmanager 发送通知
修改 Alertmanager 的配置文件 /etc/alertmanager/alertmanager.yml,配置通知渠道。
方式一:邮件告警
配置 SMTP 服务器信息,这是最通用的方式。
yaml
route:
group_by: ['alertname', 'instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'multi-receiver'
receivers:
- name: 'multi-receiver'
email_configs:
- to: '接受邮件@qq.com'
from: '来自邮件@qq.com'
smarthost: 'smtp.qq.com:465'
auth_username: '授权邮箱@qq.com'
auth_password: '邮件授权码'
send_resolved: true
require_tls: false
webhook_configs:
- url: 'http://127.0.0.1:5001/'
send_resolved: true
inhibit_rules:
- source_matchers: ['severity="critical"']
target_matchers: ['severity="warning"']
equal: ['instance']
方式二:钉钉告警(适合国内团队)
Alertmanager 不直接支持钉钉,需要借助 prometheus-webhook-dingtalk 这个转发工具。
获取钉钉机器人的 Webhook URL:
在钉钉群里添加一个“自定义机器人”,安全设置建议选择“加签”。
完成后,复制机器人的 Webhook 地址。
部署转发工具:
bash
# 创建配置文件
cat > dingtalk.yaml <<EOF
targets:
webhook1:
url: https://oapi.dingtalk.com/robot/send?access_token=你的_token
EOF
# 启动容器
docker run -d --name dingtalk-webhook -p 8060:8060 -v $(pwd)/dingtalk.yaml:/etc/prometheus-webhook-dingtalk/config.yml --restart always timonwong/prometheus-webhook-dingtalk:latest
配置 Alertmanager 调用这个工具:
yaml
route:
receiver: 'dingtalk'
receivers:
- name: 'dingtalk'
webhook_configs:
- url: 'http://你的IP:8060/dingtalk/webhook1/send'
send_resolved: true
第五步:启动并验证整个链路
重启 Alertmanager 让配置生效:
bash
sudo systemctl restart alertmanager
验证连通性:在 Prometheus 界面 “Status” -> “Targets” 里,检查 Alertmanager 是否正常显示。执行类似 prometheus_notifications_alertmanagers_discovered 的查询,返回 1 就表示连通了。
触发一次测试:可以手动把告警规则的阈值调低,或者等待 CPU 使用率超限。当告警状态变为 Firing 时,就应该能收到钉钉或邮件通知了。
几个关键注意事项
告警通道需要监控:告警链路本身也可能出问题,可以额外配置一条规则,监控 Alertmanager 自身是否正常。
钉钉配置的地址:prometheus-webhook-dingtalk 服务必须能被 Alertmanager 访问。如果它们都在同一台机器,url 里可以用 http://127.0.0.1:8060/...,但要注意容器网络隔离问题。
邮件配置:使用企业或个人邮箱时,密码那一栏通常要填写 SMTP 授权码,而不是邮箱的登录密码
第三步:检查存储目录权限
Alertmanager 需要读写 /var/lib/alertmanager/ 目录:
bash
# 创建目录并设置权限
sudo mkdir -p /var/lib/alertmanager
sudo chown root:root /var/lib/alertmanager
sudo chmod 755 /var/lib/alertmanager
第四步:手动前台启动看报错
这是最直接的办法,可以实时看到错误输出:
bash
sudo -u root /usr/local/bin/alertmanager \
--config.file=/etc/alertmanager/alertmanager.yml \
--storage.path=/var/lib/alertmanager
前台启动时,如果配置文件有问题,会直接在终端打印详细的错误信息(比如 yaml: line X: did not find expected key)。看到具体错误后,按 Ctrl+C 退出,修复后再试。
第五步:修复后重新加载并启动
bash
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 重置失败状态
sudo systemctl reset-failed alertmanager
# 启动服务
sudo systemctl start alertmanager
# 查看状态
sudo systemctl status alertmanager
第六步:验证是否成功
bash
# 本地测试
curl http://localhost:9093/-/healthy
如果返回 Healthy,说明 Alertmanager 已正常运行。然后浏览器访问 http://你的IP:9093,应该能看到 Alertmanager 的 Web UI。
如果还是失败
把以下命令的输出发给我,我帮你精准定位:
bash
# 1. 配置文件内容
cat /etc/alertmanager/alertmanager.yml
# 2. 完整错误日志
sudo journalctl -u alertmanager -n 50 --no-pager
# 3. 手动启动的错误输出
sudo -u root /usr/local/bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/var/lib/alertmanager 2>&1 | head -20