首页 > 解决方案 > 使用 java jmx 获取 apache kafka 代理指标

问题描述

我正在努力获取 apache kafka 指标并将其存储在 mysql 数据库中。起初我从oracle站点学习JMX,但它的内容是开发一个MBean并在MBeanserver中注册它并在JConsole中查看它。但是我在 JConsole 中看到了 kafka MBeans 在启动 kafka 和 zookeeper 服务器时没有为 kafka 开发任何 MBeans。因此,我很困惑是否必须为 kafka 创建一个单独的 MBean,或者我可以使用/收集 kafka 服务器上已经可用的 MBean。我研究了 kafka 公开其监控指标,并在kafka-run-class.shkafka-server-start.sh中将JMX_PORT配置为端口 9999。

kafka-server-start.sh

exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"
export JMX_PORT=9999

kafka-run-class.sh

if [ -z "$KAFKA_JMX_OPTS" ]; then
 KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.ssl=false    -Djava.rmi.server.hostname=localhost"
fi
if [  $JMX_PORT ]; then
  KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS    -Dcom.sun.management.jmxremote.port=$JMX_PORT "
fi

我像上面一样应用了 jmx 端口,也在 CLI 中启动服务器时,我给了JMX_PORT=9999 ./bin/kafka-server-start.sh config/server.properties并使用下面的程序我只是尝试访问其中一个 kafka经纪人指标。

服务器.java

package server.kafka.metrics;
import javax.management.*;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class Server {
    public static void main(String[] args) throws Exception{
        try{
            System.out.println("Connection to JMX kafka...");
            JMXServiceURL url=new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:9999/jmxrmi");
            JMXConnector jmxc = JMXConnectorFactory.connect(url,null);
            MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

            ObjectName mbeanName = new ObjectName("kafka.server:type=ReplicaManager,name=UnderMinIsrPartitionCount");

            MBeanInfo info= mbsc.getMBeanInfo(mbeanName);
            MBeanAttributeInfo[] attribute=info.getAttributes();
            for(MBeanAttributeInfo attr : attribute){
                System.out.println(attr.getDescription()+" "+mbsc.getAttributes(mbeanName, new String[]{attr.getName()}));
            }
            jmxc.close();
         }catch (Exception e){
            System.out.println(e.getMessage());
            System.exit(0);
         }
    }
 }

在执行这个程序时我得到了这样的错误

Failed to retrieve RMIServer stub:    javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:     java.net.ConnectException: Connection refused: (Connection refused)]

上面的程序参考了很多jmx程序来获取服务器指标,我什至不知道这个方法是对还是错,所以我没有在程序中添加mysql数据库信息来追加数据。我使用过 Promethus 和 Grafana,但现在我只想通过程序手动收集这些指标以将数据保存在 mysql 数据库中。如果上述方法有任何错误,请提出一些建议或指导以更正它。

标签: javaapache-kafkajmxmetrics

解决方案


推荐阅读