如何在Kafka代理上启用远程JMX(用于JmxTool)?

32

我通过添加以下内容在Kafka经纪人上启用了JMX:

KAFKA_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"

我该如何让它打印出指标?


编辑sh文件不是一个好主意,为什么每个人都推荐它呢? - Bünyamin Şentürk
10个回答

24

修改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

6
在我的 Mac 上启动 Kafka 服务前,仅需执行命令 export JMX_PORT=PORT 就足以启用 JMX。我用 jconsole 进行了测试。如果你想连接生产者和消费者,在每次启动之前设置/导出不同的 JMX 端口即可。 - Kanagavelu Sugumar
需要重启Kafka吗? - Divyanshu Jimmy
1
@DivyanshuJimmy 是的 :) - iMajna
你可以在脚本之外进行导出。不要修改它。 - OneCricketeer

10

如果你正在通过systemd运行:

  1. 编辑 /etc/systemd/system/multi-user.target.wants/kafka.service
  2. 在 "[service]" 部分添加以下行:
    • Environment=JMX_PORT=9989
  3. 重新加载: systemctl daemon-reload
  4. 重新启动: systemctl restart kafka
  5. 享受豆子吧: echo 'beans' | java -jar jmxterm-1.0-alpha-4-uber.jar -l localhost:9989 -n 2>&1

9
bin/kafka-run-class.sh 中设置 JMX_PORT 会与 Zookeeper 冲突,如果您在同一节点上运行 Zookeeper,最好在相应的 server-start 脚本中单独设置 JMX 端口:
  1. $KAFKA_HOME/bin/zookeeper-server-start.sh 文件的最后一行之前插入代码 “export JMX_PORT=${JMX_PORT:-9998}”
  2. 重新启动 Zookeeper 服务器。
  3. 对集群中的所有 Zookeeper 节点重复步骤 1 和 2。
  4. $KAFKA_HOME/bin/kafka-server-start.sh 文件的最后一行之前插入代码 “export JMX_PORT=${JMX_PORT:-9999}”
  5. 重新启动 Kafka Broker。
  6. 对集群中的所有 Broker 重复步骤 4 和 5。

1
这个答案完美地解决了我的问题。我正在使用kafka_2.11-2.0.0和zookeeper-3.4.12作为三节点集群一起运行。这个解决方案适用于Kafka-Manager基于JMX的度量显示图表,以及kafka-topics.sh --list --zookeeper & Kafka Console Producer (kafka-console-producer.sh --broker-list ) & Console Consumer (kafka-console-consumer.sh --bootstrap-server) & kafka-topics.sh --describe。Zookeeper和Kafka都在不同的JMX端口上工作。Zookeeper工作在9998端口,而Kafka和Kafka-Manager工作在9999端口。谢谢@Rahul Singhai - sunone5
每个 Kafka Broker 使用相同的 JMX 端口吗? - panoet
1
不,如果在同一节点上运行多个Kafka Brokers或ZKs,则需要为每个端口指定不同的JMX端口。 - Rahul Singhai
1
我建议不要修改shell脚本,因为这些脚本不应该跨服务器升级保留。 - OneCricketeer

9

您必须设置“JMX_PORT”变量,或将以下行添加到bin/kafka-server-start.sh文件中。

export JMX_PORT=${JMX_PORT:-9999}

那么你就可以连接到Kafka JMX指标了。我使用jconsole工具和“localhost:9999”地址。


4

这是Kafka 2.3.0版本。

使用jconsole查看可用的MBeans

您应该首先使用jconsole了解可用MBean的名称。

您需要查询指标的MBean的正确名称是kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec(在旧版本中使用了AllTopics前缀)。感谢AndyTheEntity提供的信息。

jconsole

启用远程 JMX(无身份验证或 SSL)

使用JMX技术进行监控和管理所述,启动Kafka代理程序的Java虚拟机时应设置某些系统属性。

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

在上述条件下,运行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

2
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

8
正确的想法,错误的实现。你是对的,可能需要设置其他的JMX JVM参数,但是应该在调用脚本之前设置这些变量,而不是修改脚本本身。你会为自己制造维护上的麻烦。 - Tim

0

Kafka已经提供了你所需要的一切。当你启动服务器时,使用以下命令激活KAFKA_JMX_OPTS参数:

$KAFKA_JMX_OPTS JMX_PORT=[你的端口号] ./kafka-server-start.sh -daemon ../config/server.properties

使用这些命令,你就可以激活JMX远程和相关端口。然后你就可以连接你的JConsole或其他监控工具。


0

0

这是标准的Kafka启动过程:

bin/kafka-server-start.sh config/server.properties

这是使用JMX启动Kafka的过程:

JMX_PORT=8004 bin/kafka-server-start.sh config/server.properties

0
在调用kafka-server-start.sh之前,请添加以下导出项。对于我的情况,它非常有效。您可以设置所需的JMX_PORT端口,并应设置$BROKER_IP部分的代理。
   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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接