添加 jmx_prometheus_javaagent.jar 导致错误

时间:2021-02-20 09:13:41

标签: tomcat prometheus jmx prometheus-node-exporter jmx-exporter

当我使用命令将下面作为 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) 在 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:240) 在 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.exporter.common.TextFormat.writeFormat(TextFormat.java:47) 在 io.prometheus.jmx.shaded.io.prometheus.client.exporter.HTTPServer$HTTPMetricHandler.handle(HTTPServer.java:72) 在 com.sun.net.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) 在 com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79) 在 sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:647) 在 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 在 java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在 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) 在 java.lang.Class.forName(Class.java:348) 在 com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:72) 在 com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:61) 在 javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:672)

2 个答案:

答案 0 :(得分:1)

摆弄了一下,我发现我需要从我的 config.yml 中删除 jmxUrl。在与本地 JVM 通信时,它不需要任何 jmxUrl 和主机端口

答案 1 :(得分:0)

jmx_exporter 代码:

JmxCollector.java 第 138 行:

    if (yamlConfig.containsKey("hostPort")) {
          if (yamlConfig.containsKey("jmxUrl")) {
            throw new IllegalArgumentException("At most one of hostPort and jmxUrl must be provided");
          }
          cfg.jmxUrl ="service:jmx:rmi:///jndi/rmi://" + (String)yamlConfig.get("hostPort") + "/jmxrmi";
   } else if (yamlConfig.containsKey("jmxUrl")) {
          cfg.jmxUrl = (String)yamlConfig.get("jmxUrl");
   }

JmxScraper.java 第 79 行:

    if (jmxUrl.isEmpty()) {
          beanConn = ManagementFactory.getPlatformMBeanServer();
    } 

因此,我从 config.yml 文件中删除了 jmxUrl 和主机端口配置。未发生类未找到异常

相关问题