求助:Telegraf的Jolokia插件监控Java应用JMX属性遇多类错误
我们一步步拆解你遇到的核心问题,逐个击破:
1. 启动应用时JavaAgent加载失败的问题
你遇到的启动错误:
Error opening zip file or JAR manifest missing : ../lib/jolokia-core-java-1.3.7.jar
Error occurred during initialization of VM agent library failed to init: instrument
问题根源:你写错了Jolokia Agent的Jar包名称!
从你的CLASSPATH配置能看到,实际Jar包是jolokia-core-1.3.7.jar,但你在JOLOKIA_OPTS里误写成了jolokia-core-java-1.3.7.jar(多了-java后缀),导致JVM找不到正确的Jar文件。
修复步骤:
- 修改
JOLOKIA_OPTS的Jar文件名,去掉多余的-java:JOLOKIA_OPTS=-javaagent:$LIB_PATH/jolokia-core-1.3.7.jar=port=8778,host=0.0.0.0 - 额外确认:
$LIB_PATH必须是正确的绝对路径,或者相对于应用启动目录的有效相对路径。比如如果应用在/opt/wr-core/bin目录启动,../lib对应/opt/wr-core/lib,要确保这个目录下确实存在jolokia-core-1.3.7.jar。
2. 为什么用JMX端口1998连接Telegraf会报错?
你看到的JSON解码错误:
Error decoding JSON response: invalid character '\x00' looking for beginning of value
问题根源:Telegraf的Jolokia插件是基于HTTP协议与Jolokia Agent通信的,而1998是你的应用的JMX RMI端口(二进制协议),两者完全不兼容。Jolokia插件无法解析RMI端口返回的二进制数据,自然会出现JSON解码失败的错误。
结论:永远不要把Telegraf Jolokia插件的port配置成JMX的RMI端口,必须使用Jolokia Agent提供的HTTP端口(也就是你配置的8778)。
3. 配置Telegraf与Jolokia Agent的正确流程
第一步:确保Jolokia Agent启动成功
修复JavaAgent配置后,启动应用,用curl测试Jolokia的HTTP接口:
curl http://192.168.100.175:8778/jolokia/
如果返回类似下面的JSON响应,说明Agent启动正常:
{ "request":{ "type":"version" }, "value":{ "agent":"1.3.7", "protocol":"7.2", "config":{}, "info":{} }, "timestamp":1718000000, "status":200 }
再测试能否读取目标MBean属性:
curl http://192.168.100.175:8778/jolokia/read/wr-core:type=monitor,name=execution/MessageSendSuccessCount
如果返回包含MessageSendSuccessCount数值的JSON,说明MBean能被Jolokia正确读取。
第二步:修正Telegraf配置
修改/etc/telegraf/telegraf.conf中的Jolokia配置,确保端口是8778:
[[inputs.jolokia]] context = "/jolokia/" [[inputs.jolokia.servers]] name = "wr-core" host = "192.168.100.175" port = "8778" # 这里改成Jolokia Agent的HTTP端口,不是JMX的1998 [[inputs.jolokia.metrics]] name = "send_success" mbean = "wr-core:type=monitor,name=execution" attribute = "MessageSendSuccessCount"
第三步:重启Telegraf并验证
重启Telegraf服务:
sudo systemctl restart telegraf
查看Telegraf日志,如果没有报错,说明配置成功。你也可以用测试命令快速验证:
telegraf --test --config /etc/telegraf/telegraf.conf
额外建议
- 移除pom.xml中的
jolokia-client-java和jolokia-core依赖:因为你用的是JavaAgent模式,不需要在应用代码中引入这些依赖,避免潜在的版本冲突。 - 如果Jolokia Agent启动后仍无法访问8778端口,检查服务器防火墙是否开放了该端口,或者确认应用是否绑定了正确的IP(你配置了
host=0.0.0.0,理论上没问题)。
内容的提问来源于stack exchange,提问作者Zeinab Abbasimazar

