0

我们NoSuchMethod exception在测试JMXCollectd 的插件时遇到了一个问题:

java.lang.NoSuchMethodError:org.collectd.api.Collectd.getHostname()Ljava/lang/String;找不到方法。

无论是从官方 api wiki还是从源代码中,collectd-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>

我会很感激任何答案。

4

1 回答 1

1

我解决了这个问题。从 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 后它就可以很好地工作。

希望它可以帮助你。

简直不敢相信这样的问题会在正式发布时发生。

于 2016-03-04T02:44:46.370 回答