我通过添加
在 Kafka 代理上启用了 JMXKAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=<server_IP>
-Djava.net.preferIPv4Stack=true"
但是,当我使用
kafka.tools.JmxTool
获取 JMX 指标时,它仅输出 Unix 时间戳。为什么?
./bin/kafka-run-class.sh kafka.tools.JmxTool \
--object-name 'kafka.server:type=BrokerTopicMetrics,name=AllTopicsMessagesInPerSec' \
--jmx-url "service:jmx:rmi:///jndi/rmi://<server_IP>:9111/jmxrmi"
如何让它打印出指标?
编辑 bin/kafka-run-class.sh 并设置 KAFKA_JMX_OPTS 变量
KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=your.kafka.broker.hostname -Djava.net.preferIPv4Stack=true"
更新 bin/kafka-server-start.sh 添加以下行
export JMX_PORT=PORT
如果您通过 systemd 运行:
systemctl daemon-reload
systemctl restart kafka
echo 'beans' | java -jar jmxterm-1.0-alpha-4-uber.jar -l localhost:9989 -n 2>&1
您必须设置“JMX_PORT”变量,或将以下行添加到 bin/kafka-server-start.sh。
export JMX_PORT=${JMX_PORT:-9999}
然后您将能够连接到 Kafka JMX 指标。我使用 jconsole 工具和“localhost:9999”地址。
JMX_PORT
内设置
bin/kafka-run-class.sh
将与 Zookeeper 发生冲突。 最好是在相应的
JMX
脚本中单独设置
server-start
端口:
“export JMX_PORT=${JMX_PORT:-9998}”
文件中最后一行之前插入行
$KAFKA_HOME/bin/zookeeper-server-start.sh
。
“export JMX_PORT=${JMX_PORT:-9999}”
文件中最后一行之前插入行
$KAFKA_HOME/bin/kafka-server-start.sh
。
使用 jconsole 获取可用的 MBeans
jconsole
来了解可用 MBean 的名称。您想要查询其指标的 MBean 的正确名称是
kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec
(旧版本中使用
AllTopics
前缀)。谢谢AndyTheEntity。 启用远程 JMX(无需身份验证或 SSL)
使用 JMX 技术进行监控和管理中所述,您应该在启动 Kafka 代理的 Java VM 时设置某些系统属性。
Kafka 的bin/kafka-run-class.sh
shell 脚本使配置变得轻松,因为它为您完成了基础知识并设置了
KAFKA_JMX_OPTS
。
# JMX settings
if [ -z "$KAFKA_JMX_OPTS" ]; then
KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false "
fi
对于远程 JMX,您应该使用
com.sun.management.jmxremote.port
环境变量设置 Kafka 的
bin/kafka-run-class.sh
shell 脚本设置的
JMX_PORT
。
# JMX port to use
if [ $JMX_PORT ]; then
KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT "
fi
这样,启用远程 JMX 就像以下命令一样简单:
JMX_PORT=9999 ./bin/kafka-server-start.sh config/server.properties
使用JmxTool
$ ./bin/kafka-run-class.sh kafka.tools.JmxTool \
--object-name 'kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec'
Trying to connect to JMX url: service:jmx:rmi:///jndi/rmi://:9999/jmxrmi.
"time","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:Count","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:EventType","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:FifteenMinuteRate","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:FiveMinuteRate","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:MeanRate","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:OneMinuteRate","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:RateUnit"
1567586728595,0,messages,0.0,0.0,0.0,0.0,SECONDS
1567586730597,0,messages,0.0,0.0,0.0,0.0,SECONDS
...
您可以使用
--one-time
选项仅打印一次 JMX 指标。
$ ./bin/kafka-run-class.sh kafka.tools.JmxTool \
--object-name 'kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec' \
--one-time true
Trying to connect to JMX url: service:jmx:rmi:///jndi/rmi://:9999/jmxrmi.
"time","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:Count","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:EventType","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:FifteenMinuteRate","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:FiveMinuteRate","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:MeanRate","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:OneMinuteRate","kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec:RateUnit"
1567586898459,0,messages,0.0,0.0,0.0,0.0,SECONDS
vim kafka_2.11-0.10.1.1/bin/kafka-run-class.sh
然后添加前两行和注释,就像我对其他行所做的那样,(注意:执行此操作后,Kafka 脚本不能用于列出主题的客户端操作。对于您的客户端操作,您需要使用单独的脚本,下载再次在不同的位置并使用)
export JMX_PORT=9096
KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<ipaddress> -Dcom.sun.management.jmxremote.port=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
# JMX settings
#if [ -z "$KAFKA_JMX_OPTS" ]; then
# KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false "
#fi
# JMX port to use
#if [ $JMX_PORT ]; then
# KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT "
#fi
bin/kafka-server-start.sh config/server.properties
这是使用 JMX 的 Kafka 启动过程:
JMX_PORT=8004 bin/kafka-server-start.sh config/server.properties
$KAFKA_JMX_OPTS JMX_PORT=[your_port_number] ./kafka-server-start.sh -daemon ../config/server.properties
export JMX_PORT=9900
export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=$BROKER_IP -Djava.net.preferIPv4Stack=true"
我使用的是Windows操作系统。我在 in\windows\kafka-run-class.bat 下配置 JMX_PORT。
由于我在同一节点上使用zookeeper和kafka服务器,所以我先启动zookeeper(成功启动)。然后我启动kafka服务器(启动失败)。它失败的原因是因为运行zookeeper和kafka服务器的脚本引用了设置JMX_PORT(kafka-run-class.bat)的相同脚本。
我所做的是修改
kafka-run-class.bat 通过添加参数检查来决定zookeeper和kafka服务器启动脚本使用的JMX_PORT。
IF %1 == kafka.Kafka (
rem using port 8005 for the Kafka server
set JMX_PORT=8005
)
IF %1 == org.apache.zookeeper.server.quorum.QuorumPeerMain (
rem using port 8004 for the ZooKeeper
set JMX_PORT=8004
)