java - 使用 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.sh和kafka-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 数据库中。如果上述方法有任何错误,请提出一些建议或指导以更正它。
解决方案
推荐阅读
- python - 为什么这两个 python 列表有不同的 len?
- google-cloud-iot - 将长期 MQTT 域 mqtt.2030.ltsapis.goog 与 TLS_RSA_xx 密码套件一起使用
- r - 如何在 R 中查找和绘制 n-gram 的频率?
- python - 尝试优雅地使用“或”运算符
- android - 无法为扩展“firebaseAppDistribution”设置未知属性“artifactType”
- reactjs - 期望一个字符串(用于内置组件)或一个类/函数(用于复合组件)但得到:在 React 中未定义但没有导入
- python - 具体子类的实例是抽象类的实例吗?
- php - 小时数可用的 PHP 数组未标记正确的日期
- c# - 从 SQL 表更改网页网格中日期时间显示格式的最佳方法?C#
- python - 将授权标头发布到特定 IP/端口的 Python 脚本