小数据运维之自建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.jar
export 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来设置需要读取相关的数据,这里我列举了下我们的部分配置,
[ ]]
urls = ["http://localhost:7778/jolokia"]
name_prefix = "kafka_"
[ ]]
name = "underreplicatedpartitions"
mbean = "kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions"
field_name = "UnderReplicatedPartitions"
tag_keys = ["topic", "partition"]
[ ]]
name = "controller_offlinepartitions"
mbean = "kafka.controller:type=KafkaController,name=OfflinePartitionsCount"
tag_keys = ["controller"]
[ ]]
name = "controller_activecontrollers"
mbean = "kafka.controller:type=KafkaController,name=ActiveControllerCount"
tag_keys = ["controller"]
[ ]]
name = "controller"
mbean = "kafka.controller:name=*,type=*"
field_prefix = "$1."
[ ]]
name = "controller_stats_leaderelectionrateandtime"
mbean = "kafka.controller:type=ControllerStats,name=LeaderElectionRateAndTimeMs"
tag_keys = ["controller"]
[ ]]
name = "replica_manager"
mbean = "kafka.server:name=*,type=ReplicaManager"
field_prefix = "$1."
[ ]]
name = "topics"
mbean = "kafka.server:name=*,type=BrokerTopicMetrics"
field_prefix = "$1."
[ ]]
name = "topic"
mbean = "kafka.server:name=*,topic=*,type=BrokerTopicMetrics"
field_prefix = "$1."
tag_keys = ["topic"]
[ ]]
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的监控指标。
我们在具体来看看一个监控配置:
[ ]]
name = "controller_offlinepartitions"
mbean = "kafka.controller:type=KafkaController,name=OfflinePartitionsCount"
tag_keys = ["controller"]
这里的name指的是influxdb中的measurement的名字, 实际上在influxdb中写入的还要加入前文提到的name_prefix, 在influxdb中实际结果如下
> show measurements;
name: measurements
name
----
kafka_controller
kafka_controller_activecontrollers
kafka_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的监控指标非常多,需要自己从中筛选重要的指标, 但同时这种自建的方式也给大家提供了更多的灵活性,指标这一块可以参考前文