1

当我使用命令将以下作为 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)

4

2 回答 2

2

摆弄了一下,我发现我需要从我的 config.yml 中删除 jmxUrl。在与本地 JVM 对话时,它不需要任何 jmxUrl 和 hostport

于 2021-02-20T14:50:42.030 回答
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 和 hostport 配置。Class Not Found 没有发生异常

于 2021-02-24T03:22:51.413 回答