零基础搭建Prometheus告警:从规则配置到钉钉通知
为什么需要Prometheus告警
Prometheus 本身只负责采集和存储指标,真正让运维“睡个安稳觉”的是告警功能。
当服务器 CPU 飙高、磁盘快满或服务宕机时,Prometheus告警能第一时间通过钉钉、邮件或 Slack 通知你。
本文带零基础的同学走完完整流程:安装 Alertmanager、编写告警规则、接入钉钉机器人,并验证告警能否正常触发。
前置准备:你需要什么
- 一台已安装 Prometheus 的 Linux 服务器(可参考官方文档或我们之前的 Prometheus 安装教程)
- 一个钉钉群,并创建一个自定义机器人(Webhook URL)
- 基本的命令行操作能力(会使用
vim或nano编辑文件)
确保 Prometheus 已正常启动,且能通过 http://服务器IP:9090 访问到 UI 界面。
第一步:安装并启动 Alertmanager
Alertmanager 是 Prometheus 生态系统中的告警处理组件,负责接收告警并发送通知。
# 下载最新版(以Linux amd64为例)
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
# 解压并进入目录
tar -zxvf alertmanager-0.26.0.linux-amd64.tar.gz
cd alertmanager-0.26.0.linux-amd64
# 创建配置文件目录(可选)
mkdir -p /etc/alertmanager
# 将默认的alertmanager.yml复制到配置目录
cp alertmanager.yml /etc/alertmanager/
启动 Alertmanager:
./alertmanager --config.file=/etc/alertmanager/alertmanager.yml &
访问 http://服务器IP:9093 可看到 Alertmanager 的 UI 界面(默认端口 9093)。
第二步:配置告警规则(以 CPU 使用率为例)
在 Prometheus 服务器上,编辑 Prometheus 配置文件 prometheus.yml,添加规则文件路径。
# 在 prometheus.yml 中添加 rule_files 字段
rule_files:
- "rules/*.yml"
创建规则文件 rules/cpu_alerts.yml:
groups:
- name: cpu_alerts
rules:
- alert: HighCpuUsage
expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 2m
labels:
severity: warning
annotations:
summary: "Instance {{ $labels.instance }} CPU 使用率过高"
description: "当前CPU使用率已超过80%,持续2分钟。"
这段规则的含义:当某个实例的 CPU 使用率(通过 node_exporter 指标计算)超过 80% 且持续 2 分钟,则触发告警。
重启 Prometheus 使规则生效:
# 如果 Prometheus 已启动,使用 SIGHUP 信号重新加载配置
kill -HUP $(pidof prometheus)
# 或者直接重启 prometheus 进程
在 Prometheus UI 的 Alerts 页面,应该能看到 HighCpuUsage 规则处于 Pending 或 Inactive 状态。
第三步:配置 Alertmanager 发送到钉钉
我们需要编辑 Alertmanager 配置文件 /etc/alertmanager/alertmanager.yml,添加钉钉接收器。
首先,安装 prometheus-webhook-dingtalk(一个将 Alertmanager 告警转换为钉钉消息格式的桥接服务),或者使用钉钉支持的通用 Webhook。
推荐使用 prometheus-webhook-dingtalk:
docker run -d -p 8060:8060 \
-e PROXY_URL="你的钉钉机器人Webhook地址" \
timonwong/prometheus-webhook-dingtalk
然后在 alertmanager.yml 中配置路由:
route:
receiver: 'dingtalk'
group_wait: 10s
group_interval: 30s
repeat_interval: 5m
receivers:
- name: 'dingtalk'
webhook_configs:
- url: 'http://localhost:8060/dingtalk/hook'
重启 Alertmanager:
pkill alertmanager
./alertmanager --config.file=/etc/alertmanager/alertmanager.yml &
第四步:验证告警是否触发
手动触发 CPU 使用率升高(使用 stress 工具):
# 安装 stress
apt install stress -y # Ubuntu/Debian
yum install stress -y # CentOS
# 启动4个CPU压力线程,持续5分钟
stress --cpu 4 --timeout 300 &
等待 2 分钟(规则中的 for: 2m),观察 Alertmanager UI 中告警状态变为 Firing。
同时,钉钉群应该收到一条告警消息。
如果没收到,检查以下几点:
- Prometheus 是否能看到 node_exporter 的指标?确认
up{job="node"}返回 1。 - Alertmanager 的日志是否有错误(启动时查看输出)。
- 钉钉机器人 Webhook 是否正确?可在命令行用 curl 测试:
curl -X POST -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"测试告警"}}' 你的Webhook地址
避坑指南:新手最容易踩的3个坑
- 规则语法错误:YAML 缩进必须严格,
expr中的 PromQL 最好先在 Prometheus UI 的 Graph 页面测试。 - Alertmanager 未成功接收告警:检查 Prometheus 的
prometheus.yml中alerting部分是否配置了 Alertmanager 地址(如localhost:9093)。 - 时间同步问题:Prometheus 和 Alertmanager 所在机器的时间必须一致(使用 NTP 服务),否则告警状态更新可能异常。
总结
本文让你从零搭建了一套完整的 Prometheus告警 体系,并成功将 CPU 过载告警推送到钉钉。
你可以根据同样的思路添加磁盘、内存、网络等告警规则。
关键在于掌握规则编写、Alertmanager 配置和桥接服务的使用。
如果在配置中遇到其他问题,欢迎在评论区留言,我会尽力帮你排查。
(字数:约 1430 字,已超目标?
需要控制在800左右。
实际前面内容太长,需精简。
重新调整:将步骤压缩,删除docker方式,直接用dingtalk webhook方式。
并且整体压缩到800字左右。
)