【问题标题】:Get kafka topic metrics without client-ID获取没有客户端 ID 的 kafka 主题指标
【发布时间】:2019-05-06 16:58:59
【问题描述】:

我正在尝试使用 JMX 收集 kafka 主题指标,以便我可以将它们打包到 java 中的对象中。 Kafka Docs 表明 MBean 需要一个客户端 ID,但是我们的系统中没有设置任何客户端 ID。

让我相信可以在没有客户端 ID 的情况下获取主题级别的指标是因为我们的 Kafka Manager 服务实例能够提取主题指标。我找到了他们使用的 MBean "kafka.server:name=MessagesInPerSec,topic=topic,type=BrokerTopicMetrics" 并尝试使用它但没有结果。

我当前的代码是

try {
   JMXServiceURL target = new 
   JMXServiceURL("service:jmx:rmi:///jndi/rmi://KAFKA_URL:9999/jmxrmi");
   JMXConnector connector = JMXConnectorFactory.connect(target);
   MBeanServerConnection remote = connector.getMBeanServerConnection();
   String beanName = "kafka.server:name=MessagesInPerSec,topic=topicName,type=BrokerTopicMetrics";
   ObjectName bean = new ObjectName(beanName);
   MBeanInfo info = remote.getMBeanInfo(bean);
   LOGGER.info(info.getDescription());
   MBeanAttributeInfo[] attributes = info.getAttributes();
   for (MBeanAttributeInfo attr : attributes) {
      LOGGER.info("^C " + attr.getName() + " " + remote.getAttribute(bean,attr.getName()));
   }
   connector.close();
}
catch(Exception e) {
   LOGGER.info(e.getMessage());
}

我已经能够通过这种方法获得常规的经纪人级别指标,只是当我尝试深入了解单个主题指标时,我才会失去输出 谢谢!

【问题讨论】:

    标签: java apache-kafka jmx mbeans


    【解决方案1】:

    您在上面粘贴的代码对我有用,它可以正确打印该代理的指定主题的指标。但是请注意,如果代理没有托管指定主题的任何分区(或副本),您将得到InstanceNotFoundException

    检索 MBean 名称的一种简单方法是使用 jconsole。您可以浏览指标,找到所需的指标后,您可以在“属性”下方的“操作”项中获取其名称。

    否则使用queryNames() 方法在MBeanServerConnection 上查找所有可用的ObjectNames:

    Set<ObjectName> names = remote.queryNames(null, null);
    

    【讨论】:

    • 我没有意识到并非每个主题都存在于集群中的每个代理上,这解决了我的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多