Back
Featured image of post 监控方案-kafka篇

监控方案-kafka篇

kafka监控篇

方案调研

针对kakfa的监控,简单调研了下,业界比较流行的几款解决方案:

  • KafkaOffsetMonitor
  • Kakfa Manager
  • kakfa Monitor
  • Kafka Eagle

对于当前的zabbix+grafana监控框架来说,都略显笨重。

kafka官方文档关于monitor的说明:可以通过内嵌的JMX的方式获取kafka各类metrics,无需安装任何额外的组件。同时zabbix可以通过zabbix-java-gateway的组件实现监控JMX。

考虑再三,决定了技术方案:

  • 开启kafka的JMX
  • zabbix server通过zabbix-java-gateway访问JMX获取各metrics
  • grafana实现监控数据可视化

优点:
当然是跟现有的监控体系结合在一起,不用再额外搭建一套新的监控系统了。
缺点:
经过一系列跳坑,发现kafka的java跟zabbix-java-gateway以及zabbix-server跟zabbix-java-gateway之间的版本兼容性不太好,实测不向下兼容。鉴于此,kakfa与zabbix-server的系统版本最好一致。

针对这个缺点,可以通过JMX的command line工具,脚本化获取需要监控的metrics,然后定时任务发送给zabbix,无需安装zabbix-java-gateway。

此类工具很多,最简单的是一个jar包

配置部署

zabbix server配置了java-gateway(192.168.1.10)后会pre-fork与配置数量相匹配的java-poller进程,java-poller会请求JavaGateway,而JavaGateway会调用JMX management API,获取已对其开放权限的JMX(192.169.1.11)的各类metrics值

zabbix-server

新建host,监控接口选择JMX,默认端口是12345。

一个典型的JMX item包含两个方面:

jmx[object_name,attribute_name]

object_name就是选择的kafka的metrics,然后后面就是该metrics对应的attributes 监控的各类metrics。此处最好做一个模板,方便后续的导入
zabbix-server.conf相关配置

#javaGateway的IP
JavaGateway=192.168.1.10
#默认端口10052
JavaGatewayPort=10052
#javaPoller的进程数量
StartJavaPollers=5

zabbix-java-gateway

sudo apt-get install zabbix-java-gateway

默认配置即可

kafka JMX

JMX的调用需要在启动脚本加入相关参数配置,指定端口及放权IP,这里仅列举下不需要ssl认证的简单配置
local:

-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \

remote:

-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=192.168.1.10

我们先看下kafka启动脚本kafka-server-start.sh调用的kafka-run-class.sh的相关参数.

# 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

# JVM performance options
if [ -z "$KAFKA_JVM_PERFORMANCE_OPTS" ]; then
  KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true"
fi

可以看到默认配置除了端口号和remote ip这两个都齐全了。 所以最简单的local启动:

JMX_PORT=12345 ./zookeeper-server-start.sh ../config/zookeeper.properties

如果是remote访问,直接修改kafka-run-class.sh的配置:

# JVM performance options
if [ -z "$KAFKA_JVM_PERFORMANCE_OPTS" ]; then
  KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true -Dcom.
sun.management.jmxremote.port=12345 -Djava.rmi.server.hostname=192.168.1.10"
fi

为了保持配置清晰,建议封装在一个脚本内执行,先export相关变量配置。

关于metrics

上文提及的jar包可以通过命令行的方式获取当前kakfa版本所有支持的metrics

java -jar cmdline-jmxclient-0.10.3.jar - 192.168.1.11:12345 | grep kakfa
kafka.server:name=FailedProduceRequestsPerSec,topic=cunToDruid,type=BrokerTopicMetrics
kafka.server:delayedOperation=Rebalance,name=NumDelayedOperations,type=DelayedOperationPurgatory
kafka.log:name=Size,partition=1,topic=__consumer_offsets,type=Log
kafka.log:name=LogEndOffset,partition=32,topic=__consumer_offsets,type=Log
kafka.network:name=ResponseQueueTimeMs,request=ApiVersions,type=RequestMetrics
kafka.network:name=RemoteTimeMs,request=UpdateMetadata,type=RequestMetrics
kafka.log:name=LogEndOffset,partition=3,topic=__consumer_offsets,type=Log
kafka.network:name=ResponseQueueSize,type=RequestChannel
kafka.server:name=BytesRejectedPerSec,topic=cun,type=BrokerTopicMetrics
...

每个metrics都有若干个attributes

java -jar cmdline-jmxclient-0.10.3.jar - 192.168.1.11:12345 kafka.network:name=RequestsPerSec,request=Produce,type=RequestMetrics
Attributes:
 Count: Attribute exposed for management (type=long)
 RateUnit: Attribute exposed for management (type=java.util.concurrent.TimeUnit)
 MeanRate: Attribute exposed for management (type=double)
 OneMinuteRate: Attribute exposed for management (type=double)
 FiveMinuteRate: Attribute exposed for management (type=double)
 FifteenMinuteRate: Attribute exposed for management (type=double)
 EventType: Attribute exposed for management (type=java.lang.String)
Operations:
 objectName: Operation exposed for management
  Parameters 0, return type=javax.management.ObjectName

当前获取的是produce的QPS,可以看到有多个属性值可以选择,我们这边选择OneMinuteRate

java -jar cmdline-jmxclient-0.10.3.jar - 192.168.1.11:12345 kafka.network:name=RequestsPerSec,request=Produce,type=RequestMetrics OneMinuteRate

获取结果如下

07/10/2017 11:45:36 +0800 org.archive.jmx.Client OneMinuteRate: 1158.9830099452165

其它推荐关注的metrics可见官方文档

最终效果

结合grafana,做了监控可视化处理。

Built with Hugo
Theme Stack designed by Jimmy