测试 Collectd 的 JMX 插件时出现异常(缺少 API getHostname())

Exception (missing API getHostname()) when testing JMX plugin for Collectd

我们在测试 Collectd 的 JMX 插件时遇到 NoSuchMethod exception

java.lang.NoSuchMethodError: Method org.collectd.api.Collectd.getHostname()Ljava/lang/String; not found.

official api wikicollectd-api.jar 的源代码中我们都找不到这个方法定义。

此外,我们不知道为什么调用此 API。以下是我的相关内容 collectd.conf:

LoadPlugin "java"

    <Plugin "java">
        JVMARG "-Djava.class.path=/usr/share/collectd/java/collectd-api.jar:/usr/share/collectd/java/generic-jmx.jar"
        LoadPlugin "org.collectd.java.GenericJMX"

        <Plugin "GenericJMX">
            ################
            # MBean blocks #
            ################
            # Number of classes being loaded.
            <MBean "classes">
                ObjectName "java.lang:type=ClassLoading"
                #InstancePrefix ""
                #InstanceFrom ""

                <Value>
                  Type "gauge"
                  InstancePrefix "loaded_classes"
                  #InstanceFrom ""
                  Table false
                  Attribute "LoadedClassCount"
                </Value>
            </MBean>

            # Time spent by the JVM compiling or optimizing.
            <MBean "compilation">
                ObjectName "java.lang:type=Compilation"
                #InstancePrefix ""
                #InstanceFrom ""

                <Value>
                  Type "total_time_in_ms"
                  InstancePrefix "compilation_time"
                  #InstanceFrom ""
                  Table false
                  Attribute "TotalCompilationTime"
                </Value>
            </MBean>

            # Garbage collector information
            <MBean "garbage_collector">
                ObjectName "java.lang:type=GarbageCollector,*"
                InstancePrefix "gc-"
                InstanceFrom "name"

                <Value>
                  Type "invocations"
                  #InstancePrefix ""
                  #InstanceFrom ""
                  Table false
                  Attribute "CollectionCount"
                </Value>

                <Value>
                  Type "total_time_in_ms"
                  InstancePrefix "collection_time"
                  #InstanceFrom ""
                  Table false
                  Attribute "CollectionTime"
                </Value>

            </MBean>

            ######################################
            # Define the "jmx_memory" type as:   #
            #   jmx_memory  value:GAUGE:0:U      #
            # See types.db(5) for details.       #
            ######################################

            # Generic heap/nonheap memory usage.
            <MBean "memory">
                ObjectName "java.lang:type=Memory"
                #InstanceFrom ""
                InstancePrefix "memory"

                # Creates four values: committed, init, max, used
                <Value>
                  Type "jmx_memory"
                  #InstancePrefix ""
                  #InstanceFrom ""
                  Table true
                  Attribute "HeapMemoryUsage"
                  InstancePrefix "heap-"
                </Value>

                # Creates four values: committed, init, max, used
                <Value>
                  Type "jmx_memory"
                  #InstancePrefix ""
                  #InstanceFrom ""
                  Table true
                  Attribute "NonHeapMemoryUsage"
                  InstancePrefix "nonheap-"
                </Value>
            </MBean>

                # Memory usage by memory pool.
                <MBean "memory_pool">
                ObjectName "java.lang:type=MemoryPool,*"
                InstancePrefix "memory_pool-"
                InstanceFrom "name"

                <Value>
                  Type "jmx_memory"
                  #InstancePrefix ""
                  #InstanceFrom ""
                  Table true
                  Attribute "Usage"
                </Value>
            </MBean>

            ### MBeans by Catalina / Tomcat ###
            # The global request processor (summary for each request processor)
            <MBean "catalina/global_request_processor">
                ObjectName "Catalina:type=GlobalRequestProcessor,*"
                InstancePrefix "request_processor-"
                InstanceFrom "name"

                <Value>
                  Type "io_octets"
                  InstancePrefix "global"
                  #InstanceFrom ""
                  Table false
                  Attribute "bytesReceived"
                  Attribute "bytesSent"
                </Value>

                <Value>
                  Type "total_requests"
                  InstancePrefix "global"
                  #InstanceFrom ""
                  Table false
                  Attribute "requestCount"
                </Value>

                <Value>
                  Type "total_time_in_ms"
                  InstancePrefix "global-processing"
                  #InstanceFrom ""
                  Table false
                  Attribute "processingTime"
                </Value>
            </MBean>

            # Details for each  request processor
            <MBean "catalina/detailed_request_processor">
                ObjectName "Catalina:type=RequestProcessor,*"
                InstancePrefix "request_processor-"
                InstanceFrom "worker"

                <Value>
                  Type "io_octets"
                  #InstancePrefix ""
                  InstanceFrom "name"
                  Table false
                  Attribute "bytesReceived"
                  Attribute "bytesSent"
                </Value>

                <Value>
                  Type "total_requests"
                  #InstancePrefix ""
                  InstanceFrom "name"
                  Table false
                  Attribute "requestCount"
                </Value>

                <Value>
                  Type "total_time_in_ms"
                  InstancePrefix "processing-"
                  InstanceFrom "name"
                  Table false
                  Attribute "processingTime"
                </Value>
            </MBean>

            # Thread pool
            <MBean "catalina/thread_pool">
                ObjectName "Catalina:type=ThreadPool,name=*"
                InstancePrefix "request_processor-"
                InstanceFrom "name"

                <Value>
                  Type "threads"
                  InstancePrefix "total"
                  #InstanceFrom ""
                  Table false
                  Attribute "currentThreadCount"
                </Value>

                <Value>
                  Type "threads"
                  InstancePrefix "running"
                  #InstanceFrom ""
                  Table false
                  Attribute "currentThreadsBusy"
                </Value>
            </MBean>
            #####################
            # Connection blocks #
            #####################
            <Connection>
              ServiceURL "service:jmx:rmi:///jndi/rmi://localhost:8899/jmxrmi"
              Host "localhost"
              Collect "classes"
              Collect "compilation"
              Collect "garbage_collector"
              Collect "memory"
              Collect "memory_pool"
              Collect "catalina/thread_pool"
              Collect "catalina/detailed_request_processor"
              Collect "catalina/global_request_processor"
            </Connection>
        </Plugin>
    </Plugin>

如有任何答复,我将不胜感激。

我解决了这个问题。 从 Collectd GITHUB https://github.com/collectd/collectd/blob/master/bindings/java/org/collectd/api/OConfigItem.java,我们可以看到 java api 文件是最新版本并且定义了缺少的 API getHostname()。

而对于安装了最新的 collectd 5.5 版本的 collect-api.jar,java 文件不包含新的 API.

以便我从github下载编译打包代码并替换旧的jar后它能正常工作。

希望对您有所帮助。

真不敢相信正式版会出现这样的问题