通过pushgateway 推送的一批机器的nodeexporter,怎么判断这批机器是否有宕机的,已解决
上回说到,即使你的监控已经下线,prometheus 还会拉取到旧的监控数据,需要手动清理 pushgateway 不要的数据。
但是这样并不符合我们监控的预期,尤其是对于pushgateway获取的机器如果宕机的话,就会收不到告警,本文针对此问题做一个处理
给node-exporter增加一个告警项,unix时间戳,这里采用node-exporter的文件扩展方式,详情参考:
https://www.cnblogs.com/jasmine456/p/18305866
这里不再赘述,
node-exporter --collector.textfile.directory=/host/data/exporter/key/
1. 定义unix时间戳监控项,test_pwd_node_exporter_up
cat /opt/workerdir/node_exporter/key/test_runner
#!/bin/bash
echo test_pwd_node_exporter_up `date +%s`
2. 定义一个定时任务,每分钟执行一次
echo "* * * * * /bin/bash /opt/workerdir/node_exporter/key/test_runner > /opt/workerdir/node_exporter/key/test.prom" >> /var/spool/cron/crontabs/root
3. 查询node-exporter是否拿到该数据
curl -s 127.0.0.1:9100/metrics| grep test
node_textfile_mtime_seconds{file="/host/opt/workerdir/node_exporter/key/test.prom"} 1.721370181e+09
# HELP test_pwd_node_exporter_up Metric read from /host/opt/workerdir/node_exporter/key/test.prom
# TYPE test_pwd_node_exporter_up untyped
test_pwd_node_exporter_up 1.721370181e+09
确定拿到之后,可以去prometheus去验证下,
4. 再rule配置告警rule文件
表达式:
time() - test_pwd_node_exporter_up > 300 or up ==0
获取到时间戳大于5min,告警或者 prometheus自定义的up函数 为0,告警
groups:
- name: 实例存活报警
rules:
- alert: 服务器宕机报警
# expr: up == 0
expr: time() - test_pwd_node_exporter_up > 300 or up ==0
for: 1m
labels:
severity: emergency
level: critical
annotations:
# description: '服务器 {{ $labels.instance }}宕机'
summary: "Node {{ $labels.instance }} down"
description: "Node {{ $labels.instance }} has been down for more than 5 minutes."
5. 重载prometheus配置
curl -X POST http://10.20.6.115:9090/-/reload
收到告警,至此解决了pushgateway 推送后端的nodeexporter,不能监控宕机的问题。
之前一直在纠结不能使用up函数,官方其实也知道这个问题,但是搜了一圈没有好的解决方案,
官方讨论链接:https://github.com/prometheus/pushgateway/discussions/543
有兴趣的小伙伴可以参与讨论下