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,做了监控可视化处理。