Получить метрики темы кафки без идентификатора клиента - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь собрать метрики тем kafka, используя JMX, чтобы я мог упаковать их в объект в java.Документы Kafka показывают, что MBean требует идентификатор клиента, однако в нашей системе не настроены идентификаторы клиента.

Что наводит меня на мысль, что можно получить метрики уровня темы без идентификатора клиента, так это тот факт, что наш экземпляр службы 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());
}

Этот метод позволяет мне получать обычные показатели уровня брокера. Именно когда я пытаюсь перейти к отдельным показателям темы, я теряювыходной Спасибо!

1 Ответ

0 голосов
/ 07 мая 2019

Код, который вы вставили выше, работает для меня, он правильно печатает метрики указанной темы для этого брокера.Однако учтите, что если посредник не размещает какие-либо разделы (или реплики) указанной темы, вы получите InstanceNotFoundException.

Простой способ получить имена MBean - использовать jconsole.Вы можете просматривать метрики, и как только вы нашли нужное, вы можете получить его имя в пункте «Операции» чуть ниже «Атрибуты».

В противном случае используйте метод queryNames(), чтобы найти все доступные ObjectNames на MBeanServerConnection:

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