前置配置
1.运行Prometheus
docker run -d \
--name prometheus \
--restart always \
-p 9090:9090 \
-v /opt/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /opt/prometheus/config/alert.yml:/etc/prometheus/alert.yml \
-v /opt/prometheus/data:/prometheus \
prom/prometheus:v3.9.1 \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/prometheus修改配置rule_files /opt/prometheus/config/prometheus.yml
yaml
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- "/etc/prometheus/alert.yml"
alerting:
alertmanagers:
- static_configs:
- targets: ['192.168.83.143:9093']
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['192.168.83.143:9100']修改告警配置 /opt/prometheus/config/alert.yml
yaml
groups:
- name: host_alerts
rules:
- alert: HostDown
expr: up{job="node_exporter"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "服务器 {{ $labels.instance }} 已宕机"
description: "Node Exporter 无法采集,服务器可能已关机"
- alert: MemoryHigh
expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 80
for: 2m
labels:
severity: warning
annotations:
summary: "内存使用率超过 80%"
description: "当前内存使用率: {{ $value }}%"
- alert: CpuHigh
expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) > 80 平均1分钟负载超过百分之80
for: 1m 持续1分钟就会发送
labels:
severity: warning
annotations:
summary: "CPU 使用率超过 80%"
description: "当前 CPU 使用率: {{ $value }}%"
- alert: DiskHigh
expr: (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 > 80 and node_filesystem_readonly == 0
2.重新加载配置,验证告警规则是否生效
bash
docker kill -s HUP prometheus等待 5 秒。
浏览器访问:
text
http://192.168.83.143:9090/alerts
3.测试告警是否能触发
bash
# 跑一个死循环占满CPU
dd if=/dev/zero of=/dev/null &等待 2-3 分钟,刷新 http://192.168.83.143:9090/alerts,CPU使用率过高 应该会变成 黄色(Pending)
测试完停止:
bash
killall dd设置Alertmanager告警通知
第 1 步:确认 Alertmanager 容器在运行
bash
docker ps | grep alertmanager如果没有输出,执行:
bash
docker run -d \
--name alertmanager \
--restart always \
-p 9093:9093 \
prom/alertmanager:latest第 2 步:创建 Alertmanager 配置文件
bash
# 创建配置目录(-p:如果父目录不存在,自动创建)
mkdir -p /opt/alertmanager/config
# 创建配置文件
cat > /opt/alertmanager/config/alertmanager.yml << 'EOF'
route: # 路由配置开始
group_by: ['alertname'] # 按告警名称分组,相同名称的告警合并成一条发送
group_wait: 10s # 第一次告警产生后,等待10秒再发送,收集更多同组告警
group_interval: 10s # 同组告警如果10秒内重复发生,合并发送,不重复通知
repeat_interval: 1h # 告警持续未恢复,每1小时重发一次提醒
receiver: 'webhook' # 使用名为 webhook 的接收器
receivers: # 接收器列表
- name: 'webhook' # 接收器名称
webhook_configs: # 使用 webhook 方式发送
- url: 'http://localhost:8080/' # webhook 目标地址(先写一个假地址,测试用)
send_resolved: true # 告警恢复时也发送通知
EOF第 3 步:重启 Alertmanager 并挂载配置
bash
docker stop alertmanager
docker rm alertmanager
docker run -d \
--name alertmanager \
--restart always \
-p 9093:9093 \
-v /opt/alertmanager/config/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager:latest第 4 步:确认 Prometheus 已经把告警发给 Alertmanager
bash
cat /opt/prometheus/config/prometheus.yml确保有这几行:
yaml
alerting:
alertmanagers:
- static_configs:
- targets: ['192.168.83.143:9093']如果没有,加上去,然后:
bash
docker kill -s HUP prometheus第 5 步:测试告警是否到达 Alertmanager
先触发一个告警(比如跑 dd 让 CPU 高),然后浏览器访问:
text
http://192.168.83.143:9093能看到告警记录,说明 Prometheus → Alertmanager 链路通了。
可以看到,当之前设置的cpu1分钟平均负载超过80%,就会变黄,状态为PENDING

之前设置的for :1 m持续超过之后,就会变红,变为FIRING,就会发送告警给Alertmanager


text
时间线(分钟)
0 1 2 3
│ │ │ │
├─────────┼─────────┼─────────┤
│ CPU跑满 │ [1m]窗口 │ for:1m │ 告警触发
│ │ 平均值 │ 持续观察 │
│ │ 超过80% │ 超过80% │
│ │ 变黄! │ 变红! │配置钉钉通知
1.启动钉钉转换器
mkdir -p /opt/dingtalk/config
cat > /opt/dingtalk/config/config.yml << 'EOF'
targets:
webhook:
url: https://oapi.dingtalk.com/robot/send?access_token=你的token
secret: 你的加签密钥
EOFbash
docker run -d \
--name dingtalk \
--restart always \
-p 8060:8060 \
-v /opt/dingtalk/config/config.yml:/etc/prometheus-webhook-dingtalk/config.yml \
timonwong/prometheus-webhook-dingtalk:v2.1.0如何获取钉钉机器人 Webhook:
打开钉钉群 → 群设置 → 智能群助手 → 添加机器人 → 自定义
复制 Webhook 地址(示例:
https://oapi.dingtalk.com/robot/send?access_token=xxxxxx)
2 .修改 Alertmanager 配置
bash
cat > /opt/alertmanager/config/alertmanager.yml << 'EOF'
route: # 路由配置开始
group_by: ['alertname'] # 按告警名称分组
group_wait: 30s # 首次告警等待30秒,收集更多同类告警
group_interval: 5m # 同组告警5分钟内重复发送时合并
repeat_interval: 4h # 告警未恢复,每4小时重发一次
receiver: 'dingtalk' # 默认接收器改为 dingtalk
receivers: # 接收器列表
- name: 'dingtalk' # 接收器名称
webhook_configs: # webhook 配置
- url: 'http://192.168.83.143:8060/dingtalk/webhook/send' # 发给钉钉转换器
send_resolved: true # 告警恢复时也发送通知
EOF3 重启 Alertmanager
bash
docker restart alertmanager # 重启容器,加载新配置最终验证
bash
# 触发告警
dd if=/dev/zero of=/dev/null &
# 等 2-3 分钟后查看:
# 1. Prometheus Alerts 页面是否有红色
# 2. Alertmanager 9093 页面是否有告警
# 3. 钉钉群是否收到消息
完整组件关系图
text
Prometheus(发现告警)
↓ Prometheus 把告警推送给 Alertmanager
Alertmanager(9093) ← 去 9093 能看到告警记录
↓ Alertmanager 把告警发给钉钉转换器
钉钉转换器(8060) ← 把告警格式转成钉钉能识别的格式
↓ 转换器调用钉钉机器人
钉钉机器人
↓ 钉钉机器人发送消息到钉钉群
你的钉钉群
评论区