Prometheus收集自定义监控指标
背景说明:第三方服务厂商反馈因“黑盒监控Blackbox_exporter频繁通过GET请求”发送到对应端口服务,导致服务无预兆+无日志掉线(罕见需求),因此这里使用已安装的node_exporter来实现端口监控
参考链接:https://github.com/prometheus/blackbox_exporter/blob/master/blackbox.yml
环境说明:这里主机监控node_exporter已部署且接入Prometheus
使用textfile收集自定义监控指标
自定义监控思路:
① 通过用Linux系统自身命令将监控指标写到textfile目录下
② 在node_exporter启动方式指定好对应textfile文件路径——将收集到的自定义监控指标由node_exporter一并发送给prometheus
实际解决方案:
① 使用 netstat / ss 命令来检查自身端口监听情况;
② 使用 curl 命令收集返回代码(但这跟黑盒监控Blackbox_exporter一样都会请求到服务去,这里不用)
编写监控脚本
mkdir -p /data/node_exporter/
vim /data/node_exporter/check_port.sh
#!/bin/bash
# 确保textfile目录已创建
mkdir -p /data/node_exporter/textfile
# Textfile 输出目录,采集的监控数据会放在这
OUTPUT_FILE="/data/node_exporter/textfile/port_status.prom"
# 确保每次采集监控数据时已清空旧数据
echo > "$OUTPUT_FILE"
# 定义需要监控的端口列表
PORTS=(1028 5070 5071 5096 9170)
# 遍历所有端口并检查端口监听情况
for port in "${PORTS[@]}"; do
if netstat -tuln | grep -q ":$port " || ss -tuln | grep -q ":$port "; then
status=1 # 端口存活
else
status=0 # 端口关闭
fi
# 写入 Prometheus 格式的指标
echo "# HELP node_port_${port}_status Whether port $port is listening (1=UP, 0=DOWN)" >> "$OUTPUT_FILE"
echo "# TYPE node_port_${port}_status gauge" >> "$OUTPUT_FILE"
echo "node_port_status{port=\"$port\"} $status" >> "$OUTPUT_FILE"
done
添加执行权限
chmod +x /data/node_exporter/check_port.sh
修改node_exporter启动方式
vim /etc/systemd/system/multi-user.target.wants/node_exporter.service
... ...
ExecStart=/usr/local/bin/node_exporter --collector.textfile.directory=/data/node_exporter/textfile
... ...
重载/重启
systemctl daemon-reload && systemctl restart node_exporter &&systemctl status node_exporter
设置定时任务
crontab -e
# 该脚本用于监控端口监听情况
*/1 * * * * bash /data/node_exporter/check_port.sh
验证
访问Prometheus验证即可(因为是现成的node_exporter和prometheus,因此不需要在配置prometheus去找node_exporter)
PromSQL验证
node_port_status
| Monitor index/监控指标 | value/值 |
|---|---|
| node_port_status{instance="xx.xx.xx.205:9100", job="consul-prometheus", node_name="zk-205", port="5070"} | 1 |
| node_port_status{instance="xx.xx.xx.205:9100", job="consul-prometheus", node_name="zk-205", port="5071"} | 1 |
| node_port_status{instance="xx.xx.xx.205:9100", job="consul-prometheus", node_name="zk-205", port="5096"} | 1 |
这里能查出来指标和对应监控值即可
添加告警
# vim prometheus/prometheusRule/xxxx-port.yml
... ...
- name: "xxxx端口告警"
rules:
- alert: "xxxx端口检测异常"
expr: node_port_status != 1
for: 1m
labels:
severity: critical
annotations:
summary: "主机 ({{ $labels.instance }}) xx端口 {{ $labels.port }} 检测异常,请及时处理"
description: "主机 ({{ $labels.instance }}) xx端口 {{ $labels.port }} 检测异常,请及时处理"
# kubectl replace -f prometheus/prometheusRule/xxxx-port.yml
将原黑盒监控下线
curl --request PUT http://[$IP]:[$Port]/v1/agent/service/deregister/205-xx9170
告警测试
随便加个不存在的端口,看看过会他告不告警即可,示例:
vim /data/node_exporter/check_port.sh
... ...
PORTS=(... ... 12345) # 添加12345端口监控

浙公网安备 33010602011771号