如何使用 jmxtrans 监控 Kafka 代理?

How to monitor Kafka broker using jmxtrans?

卡夫卡 0.8.1.1 (kafka_2.8.0-0.8.1.1.tgz)

我正在使用 jmxtrans 对 Kafka 实例进行 JMX 监控(在 docker 中是 运行)。不幸的是,kafka 指标没有被 returned。

我已经尝试了一些方法来调试它并且知道 kafka 是 运行 正确的(我可以 produce/consume 消息成功)已经得出结论 jmxtrans 确实 return JMX 指标(对于例如,java.lang:type=Memory, attribute=HeapMemoryUsage returns correct data) 所以一般的 kafka 和 JMX 功能似乎在工作。此外,我可以在使用 jconsole 时访问指标——指标似乎与所有相关字段中的数据一起被捕获。

不幸的是,当我使用以下配置尝试 jmxtrans 时,我没有收到任何信息(实际上根本没有任何数据)。我相信应该根据 kafka 文档 ("kafka.server:type=BrokerTopicMetrics", attribute="MessagesInPerSec")

捕获指标

以下是我使用的jmxtrans配置:

{
    "servers" : [ {
        "port" : "9999",
        "host" : "10.0.1.201",
        "queries" : [ {
            "outputWriters" : [ {
                "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter",
                "settings" : {
                 }
             } ],
             "obj" : "kafka.server:type=BrokerTopicMetrics",
             "attr" : [ "MessagesInPerSec" ]
         } ],
         "numQueryThreads" : 2
     } ]
}

我不确定为什么数据没有 returned。也许我设置了无效的 jmxtrans 配置,或者我没有正确指定指标。

感谢任何帮助。

正如我在 ./bin/jmxtrans.sh 中发现的那样,默认情况下 stdout/log 文件是 /dev/null.

LOG_FILE=${LOG_FILE:-"/dev/null"}

这就是为什么将环境变量设置为可用于查看输出的内容很重要的原因:

LOG_FILE=log.txt ./bin/jmxtrans.sh start kafka.json

我正在使用以下 kafka.json 配置文件:

{
  "servers" : [ {
    "port" : "10101",
    "host" : "localhost",
    "queries" : [ {
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter",
        "settings" : {
        }
      } ],
      "obj" : "kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic=testowo",
      "attr" : [ "Count" ]
    } ],
    "numQueryThreads" : 2
  } ]
}

当您启动 jmxtrans 时,它将在 localhost:10101 上使用 JMX 查询代理关于 testowo 主题的 Count 属性。它 每 60 秒将结果打印到文件 LOG_FILE (您可以使用 SECONDS_BETWEEN_RUNS env var 更改它),例如

LOG_FILE=log.txt SECONDS_BETWEEN_RUNS=5 ./bin/jmxtrans.sh start kafka.json

您可能想使用 jmxtrans 的其他作者,这样输出就不会混合,例如

{
  "servers" : [ {
    "port" : "10101",
    "host" : "localhost",
    "queries" : [ {
      "outputWriters" : [ {
        "@class" : "com.googlecode.jmxtrans.model.output.KeyOutWriter",
        "settings" : {
          "outputFile" : "testowo-counts.txt",
          "maxLogFileSize" : "10MB",
          "maxLogBackupFiles" : 200,
          "delimiter" : "\t",
          "debug" : true
        }
      } ],
      "obj" : "kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic=testowo",
      "attr" : [ "Count" ]
    } ],
    "numQueryThreads" : 2
  } ]
}

最后但同样重要的是,要将 JMX 端口设置为已知值,请在使用 ./bin/kafka-server-start.sh 启动 Kafka 代理时使用 JMX_PORT env var,即

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

经过大量的实验,我现在已经解决了这个问题。为了完整起见,下面是我解决问题的方法。

看来我指定的 "obj" 值不正确。

正确的对象值(示例)如下:

"obj": "\"kafka.server\":type=\"BrokerTopicMetrics\",name \"AllTopicsLogBytesAppendedPerSec\"",
"attr": [ "Count" ]

请注意,"obj" 值需要额外的引号。对于其他 JMX obj 值,这似乎不寻常且不同于我所见的正常模式(无引号)。

JMXTRANS 在将正确的(带引号的)值放入 obj 字符串后提供了有效的输出...