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端口监控
posted @ 2025-04-25 09:32  cumybride  阅读(140)  评论(0)    收藏  举报