prometheus jmx-exporter 暴漏HTTP服务端口无法获取监控数据

文章描述了一个通过-javaagent方式使用的jmx_prometheus_javaagent-0.15.0.jar在OpenJDK1.8.0_242上遇到的问题,表现为无法获取监控数据,原因是CPU占用过高,由一个死循环引起。分析发现该问题可能与JDK的NativeMethod相关,且在JDKbug库中找到类似问题。解决方案包括重启应用和升级JDK到11.0.8以上版本。同时,文中还提及Sentinel组件存在相同问题,提供了相应的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 问题描述

  通过 -javaagent 方式挂载的 jmx_prometheus_javaagent-0.15.0.jar 代理包对接prometheus监控,通过暴露的HTTP服务端口无法获取监控数据。

OpenJDK:1.8.0_242-b08
jmx_prometheus_javaagent:0.15.0

2. 问题分析

  1. netstat 查看服务端口状态,发现存在大量的 CLOSE_WAIT状态的连接;
    在这里插入图片描述
  2. 通过 top 命令发现应用进程比正常情况下占用高;
  3. 通过 top -o +%CPU -Hp {PID} 查看进程线程信息,发现 prometheus-http 线程 CPU占用 99%;
  4. printf ‘%x\n’ {PID} 将十进制线程ID转换为十六进制,注意此PID为第3步占用CPU高的线程ID;
  5. jstack -l {PID} > jstack.txt,注意此 PID 为Java进程ID;
  6. 打开 jstack.txt,搜索第4步中得到的十六进制的线程ID;
    在这里插入图片描述
    此线程名称为 prometheus-http-1-4 的守护线程(daemon),状态为 RUNNABLE,正在执行 sun.management.OperatingSystemImpl.getSystemCpuLoad(Native Method) 获取系统CPU负载信息,
  7. 查看JDK源码,发现当 fgetc(f) != ‘\n’ 时就会进入死循环状态,我们知道死循环会导致CPU过高,这可能就是无法获取监控数据的元凶
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  8. 在JDK bug库中碰碰运气,看有没有类似bug,看看是否在哪个JDK 版本已经修复
    https://github.com/openjdk/jdk/pull/4378
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    https://bugs.openjdk.org/browse/JDK-8268361
    在这里插入图片描述
    https://bugs.java.com/bugdatabase/view_bug?bug_id=8268361
    在这里插入图片描述

3. 解决方法

临时解决方法:重启应用
永久解决方法:升级JDK版本到 11.0.8 或更高版本

4. 其它

在排查问题的过程中发现 sentinel-system 组件存在同样的问题。
https://github.com/alibaba/Sentinel/issues/2885
https://github.com/alibaba/Sentinel/issues/1206

解决方法1:把获取CPU负载信息的插槽去掉
解决方法2:升级JDK版本到11.0.8或更高版本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值