vlambda博客
学习文章列表

小数据运维之自建Kafka监控

前文里面提到了一些开源的kafka的监控工具,但在我们实际生产会遇到各种需求这些开源工具无法满足。比如我们遇到的问题就是, 现有的开源监控工具,在历史监控数据保存等方面无法满足我们的需求,

还有这些开源的Kafkak监控工具也不太方便接入我们现有的监控告警平台。我们现有的监控报警系统是基于Influxdb的TICK平台,从运维的角度来看,现在主流的基于时序数据库的监控平台是Influxdb和Promotheus,其中Influxdb是现在DB Engine排名第一的时序数据库。我们现在具体来看看如何基于Influxdb自己搭建Kafka Broker的监控


监控数据采集


Kafka Broker的监控数据是通过Jmx进行暴露,Influxdb的数据采集是基于Telegraf进行的,但Telegraf Plugin并不能直接采集到Kafka JMX的数据,而是通过Jolokia Agent进行的,大致架构图如下


我们在Kafka Broker启动命令中还得加上Jolokia agent相关信息

export JOLOKIA_JAR=/data/kafka/kafka/libs/jolokia-jvm.jarexport KAFKA_OPTS="-javaagent:$JOLOKIA_JAR=port=7778 $KAFKA_OPTS"JMX_PORT=9988 ./bin/kafka-server-start.sh -daemon ./config/server.properties

重启Kafka之后,就可以通过Jolikia获取到Kafka Broker的相关监控信息了。

Telegraf通过配置telegraf.conf来设置需要读取相关的数据,这里我列举了下我们的部分配置,

## Read JMX metrics through Jolokia [[inputs.jolokia2_agent]] ## An array of Kafka servers URI to gather stats. urls = ["http://localhost:7778/jolokia"]    name_prefix = "kafka_" # Broker key metrics [[inputs.jolokia2_agent.metric]] name = "underreplicatedpartitions" mbean = "kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions" field_name = "UnderReplicatedPartitions"        tag_keys   = ["topic""partition"] [[inputs.jolokia2_agent.metric]] name = "controller_offlinepartitions" mbean = "kafka.controller:type=KafkaController,name=OfflinePartitionsCount"        tag_keys   = ["controller"] [[inputs.jolokia2_agent.metric]] name = "controller_activecontrollers" mbean = "kafka.controller:type=KafkaController,name=ActiveControllerCount"        tag_keys   = ["controller"] # Controller metrics [[inputs.jolokia2_agent.metric]] name = "controller" mbean = "kafka.controller:name=*,type=*"        field_prefix = "$1." [[inputs.jolokia2_agent.metric]] name = "controller_stats_leaderelectionrateandtime" mbean = "kafka.controller:type=ControllerStats,name=LeaderElectionRateAndTimeMs"        tag_keys   = ["controller"] # Broker replica manager  [[inputs.jolokia2_agent.metric]] name = "replica_manager" mbean = "kafka.server:name=*,type=ReplicaManager"        field_prefix = "$1." # Broker Topic Metrics  [[inputs.jolokia2_agent.metric]] name = "topics" mbean = "kafka.server:name=*,type=BrokerTopicMetrics"        field_prefix = "$1." [[inputs.jolokia2_agent.metric]] name = "topic" mbean = "kafka.server:name=*,topic=*,type=BrokerTopicMetrics" field_prefix = "$1."      tag_keys     = ["topic"]    # Partition Metrics [[inputs.jolokia2_agent.metric]] name = "partition" mbean = "kafka.log:name=*,partition=*,topic=*,type=Log" field_name = "$1"      tag_keys   = ["topic""partition"]    

首先我们看到,telelgraf使用的jolokia2_agent这个Plugin收集监控信息,这个plugin是不需要单独安装的,直接使用telegraf的二进制文件即可,这里针对配置信息进行一下解释

urls = ["http://localhost:7778/jolokia"]name_prefix = "kafka_"

URL这里需要配置jolikia的域名和端口信息,因我们telegraf与kafka broker 部署在同一台服务器, 所以我们直接使用的localhost, name_prefix指的是在Influxdb中measurement的前缀,这样更方便区分哪些是来自kafka的监控指标。

我们在具体来看看一个监控配置:

 [[inputs.jolokia2_agent.metric]] name = "controller_offlinepartitions" mbean = "kafka.controller:type=KafkaController,name=OfflinePartitionsCount"        tag_keys   = ["controller"]

这里的name指的是influxdb中的measurement的名字, 实际上在influxdb中写入的还要加入前文提到的name_prefix, 在influxdb中实际结果如下

> show measurements;name: measurementsname----kafka_controllerkafka_controller_activecontrollerskafka_controller_offlinepartitions

具体监控指标的获取在Mbean这里制定,这里我建议大家可以查看confluent的文档获取相关信息

https://docs.confluent.io/platform/current/kafka/monitoring.html


其他更多的Telegraf配置信息可以参考这二份文档:

https://github.com/influxdata/telegraf/blob/master/plugins/inputs/jolokia2/examples/kafka.conf

https://grafana.com/grafana/dashboards/14505


Influxdb和Grafana的组合可以很容易的自定义展示自己需要的监控指标,图形化的效果相当不错,这一点比开源Kafkak监控平台更加灵活,可定制化程度也更高,例如我们将最核心的报警指标放在最前列,后面依次在放其他broker,partition和Broker等相关指标:



总体来说自建Kafka的监控,相比使用开源的Kafka监控平台,有一定的门槛,比较适合已经有一套自己的监控系统,比如比较主流的Promotheus, Influxdb(Tick), open-falcon等,而且需要对Kafka的监控指标有一个初步了解,Kafka的监控指标非常多,需要自己从中筛选重要的指标, 但同时这种自建的方式也给大家提供了更多的灵活性,指标这一块可以参考前文