当我使用命令将以下作为 javaagent 添加到我的独立 jar 中时,我已经能够使用 jmx prometheus 导出器成功提取 JMX 指标
-javaagent:./jmx_prometheus_javaagent-0.15.0.jar=8089:config.yaml -jar myjar.jar
但是当我将它作为 VM 选项添加到 tomcat 服务器时。它给出以下错误并且无法提取任何 jmx 信息:
严重 [prometheus-http-1-4] io.prometheus.jmx.shaded.io.prometheus.jmx.JmxCollector.collect JMX 抓取失败:java.io.IOException:无法检索 RMIServer 存根:javax.naming.NoInitialContextException:不能实例化类:org.apache.naming.java.javaURLContextFactory [根异常是 java.lang.ClassNotFoundException:org.apache.naming.java.javaURLContextFactory] 在 javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:369 ) 在 javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:270) 在 io.prometheus.jmx.shaded.io.prometheus.jmx.JmxScraper.doScrape(JmxScraper.java:94) 在 io.prometheus.jmx。 shaded.io.prometheus.jmx.JmxCollector.collect(JmxCollector.java:547) at io.prometheus.jmx.shaded.io.prometheus.client.CollectorRegistry$MetricFamilySamplesEnumeration.findNextElement(CollectorRegistry.java:207) 在 io.prometheus.jmx.shaded.io.prometheus.client.CollectorRegistry$MetricFamilySamplesEnumeration.nextElement( CollectorRegistry.java:161) 在 io.prometheus.jmx.shaded.io.prometheus.client.exporter.common.TextFormat.write004(TextFormat.java:65) 在 io.prometheus.jmx.shaded.io.prometheus.client。 com.sun.net 上 io.prometheus.jmx.shaded.io.prometheus.client.exporter.HTTPServer$HTTPMetricHandler.handle(HTTPServer.java:72) 上的 exporter.common.TextFormat.writeFormat(TextFormat.java:47)。 httpserver.Filter$Chain.doFilter(Filter.java:79) 在 sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:83) 在 com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java: 82) 在 sun.net.httpserver.ServerImpl$Exchange$LinkHandler。handle(ServerImpl.java:675) at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79) at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:647) at java .util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run(Thread.java:748) 引起作者:javax.naming.NoInitialContextException:无法实例化类:org.apache.naming.java.javaURLContextFactory [根异常是 java.lang.ClassNotFoundException:org.apache.naming.java.javaURLContextFactory] 在 javax.naming.spi.NamingManager。 getInitialContext(NamingManager.java:674) 在 javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313) 在 javax.naming.InitialContext.init(InitialContext.java:244) 在 javax.naming.InitialContext.(InitialContext.java:216) 在 javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnector.java:1953) 在 javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.java:1922) 在 javax.management.remote.rmi.RMIConnector .connect(RMIConnector.java:287) ... 18 更多原因:java.lang.ClassNotFoundException: org.apache.naming.java.javaURLContextFactory at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java。 lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在 java.lang.Class .forName0(Native Method) at java.lang.Class.forName(Class.java:348) at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:72) at com.sun.naming.internal.VersionHelper12 javax.naming.spi 中的 .loadClass(VersionHelper12.java:61)。NamingManager.getInitialContext(NamingManager.java:672)