Zabbix-Monitoring Kafka集群 Consumer | kafka的监控和告警

Posted by Yancy on 2017-06-05

Zabbix-Monitoring Kafka集群 Consumer | kafka的监控和告警

前面一篇讲了我们监控kafka集群Brokers服务状态监控。生产环境监控,可以在Zabbix中对Kafka进行监控,一种是监控JMX端口,另外一种是直接写脚本,使用bin/kafka-run-class.sh里提供的相关方法类。

根据我们的业务场景,最为主要的的是监控消费者Lag的情况。所有我直接写脚本了。
我们对某一个Topic的30个分区,每个分区,当前Consumer的Lag情况。
当然还可以生成汇总图,在此不做多展示。在Zabbix中配置对应的Triggers,当Lag超过阀值,实现报警。

这里我用命令在kafka当中一台服务器获取了其中一个Topic group的Lag。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[jollybi@countly2 kafka_2.10]$
bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zookeeper 75.126.39.4:2281,75.126.5.2:2281,75.126.5.1:2281 --group group_zybi --topic mongotail_lz4
消费组 话题id 分区ID 当前已消费的条数 总条数 未消费的
Group Topic Pid Offset logSize Lag Owner
group_zybi mongotail_lz4 0 1092163900 2253744158 1161580258 none
group_zybi mongotail_lz4 1 1092281117 2253795899 1161514782 none
group_zybi mongotail_lz4 2 1092834883 2253771036 1160936153 none
group_zybi mongotail_lz4 3 1092822121 2253772916 1160950795 none
group_zybi mongotail_lz4 4 1092040532 2253775432 1161734900 none
group_zybi mongotail_lz4 5 1095163824 2253744329 1158580505 none
group_zybi mongotail_lz4 6 1097623779 2253781500 1156157721 none
group_zybi mongotail_lz4 7 1097459357 2253782032 1156322675 none
group_zybi mongotail_lz4 8 1099080546 2253741287 1154660741 none
group_zybi mongotail_lz4 9 1099028190 2253785053 1154756863 none
group_zybi mongotail_lz4 10 1099535928 2253795680 1154259752 none
group_zybi mongotail_lz4 11 1099701993 2253742880 1154040887 none

其实命令大体的逻辑就是通过Consumer获取到当前的offset,就能有lag信息了,如何写成脚本获取我们想要的消费和未消费与总消息条数呢。

脚本贴出来了,很简单理解,把自己获取到topic的消费条数过滤。我公司有两个主题topic分别对不同组获取lag.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[root@countly2 zabbix]# vim monitor_kafka.sh
#!/bin/bash
export JAVA_HOME=/home/jollybi/tools/java-7-sun
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
topic=mongotail_lz4_imp
group=group_imp
#topic2
topic2=mongotail_lz4
group2=group_event
group3=group_event_spm
#启动目录
kafkaserver=/home/jollybi/tools/kafka_2.10-0.8.2.1/bin/kafka-run-class.sh
zk=75.126.39.4:2281,75.126.5.2:2281,75.126.5.8:2281
function imp_lag {
echo "`$kafkaserver kafka.tools.ConsumerOffsetChecker --zookeeper $zk --group $group --topic $topic | sed -n 2p | awk '{print $6}'`"
}
function imp_logsize {
echo "`$kafkaserver kafka.tools.ConsumerOffsetChecker --zookeeper $zk --group $group --topic $topic | sed -n 2p | awk '{print $5}'`"
}
function imp_offset {
echo "`$kafkaserver kafka.tools.ConsumerOffsetChecker --zookeeper $zk --group $group --topic $topic | sed -n 2p | awk '{print $4}'`"
}
function event_spm_lag {
echo "`$kafkaserver kafka.tools.ConsumerOffsetChecker --zookeeper $zk --group $group2 --topic $topic2 | sed -n 2p | awk '{print $6}'`"
}
function event_spm_logsize {
echo "`$kafkaserver kafka.tools.ConsumerOffsetChecker --zookeeper $zk --group $group2 --topic $topic2 | sed -n 2p | awk '{print $5}'`"
}
function event_spm_offset {
echo "`$kafkaserver kafka.tools.ConsumerOffsetChecker --zookeeper $zk --group $group2 --topic $topic2 | sed -n 2p | awk '{print $4}'`"
}
function event_lag {
echo "`$kafkaserver kafka.tools.ConsumerOffsetChecker --zookeeper $zk --group $group3 --topic $topic2 | sed -n 2p | awk '{print $6}'`"
}
function event_logsize {
echo "`$kafkaserver kafka.tools.ConsumerOffsetChecker --zookeeper $zk --group $group3 --topic $topic2 | sed -n 2p | awk '{print $5}'`"
}
function event_offset {
echo "`$kafkaserver kafka.tools.ConsumerOffsetChecker --zookeeper $zk --group $group3 --topic $topic2 | sed -n 2p | awk '{print $4}'`"
}
# Run the requested function
$1

这里脚本我更新过了,这个脚本实现是当个分片的消费情况。 不是总的消费和未消费的取到的值。
🎋 需要原脚本的留言喔,下面步骤都是一样的效果。

脚本放到kafka服务器/etc/zabbix/下面,并配合zabbix监控。

1
2
3
4
5
[root@countly2 zabbix]# ll
total 8
-rwxrwxr-x 1 jollybi jollybi 1932 Jun 7 10:40 monitor_kafka.sh
-rw-r--r-- 1 root root 218 Jun 7 14:19 zabbix_agentd.conf
drwxr-xr-x 2 root root 45 Sep 20 2016 zabbix_agentd.d

然后zabbix_agentd.conf扩展配置

1
UserParameter=kafka.[*],/etc/zabbix/monitor_kafka.sh $1

也可以这么写:

1
2
3
4
5
6
7
8
9
UserParameter=kafka.imp_lag,/etc/zabbix/monitor_kafka.sh imp_lag
UserParameter=kafka.imp_offset,/etc/zabbix/monitor_kafka.sh imp_offset
UserParameter=kafka.imp_logsize,/etc/zabbix/monitor_kafka.sh imp_logsize
UserParameter=kafka.event_spm_lag,/etc/zabbix/monitor_kafka.sh event_spm_lag
UserParameter=kafka.event_spm_logsize,/etc/zabbix/monitor_kafka.sh event_spm_logsize
UserParameter=kafka.event_spm_offset,/etc/zabbix/monitor_kafka.sh event_spm_offset
UserParameter=kafka.event_lag,/etc/zabbix/monitor_kafka.sh event_lag
UserParameter=kafka.event_offset,/etc/zabbix/monitor_kafka.sh event_offset
UserParameter=kafka.event_logsize,/etc/zabbix/monitor_kafka.sh event_logsize

这里写键值就不需要加[]

然后配置完成重启zabbix-agent服务。

zabbix设置Key

zabbix-组态-模板-创建模板。

创建:KafkaConsumers模板
然后点击KafkaConsumers模板,创建相应的项目:kafka.event_lag 未消费的条数

设置zabbix代理。默认的代理方式。

zabbix,key 键值

1
kafka.[event_lag]

数据类型默认浮点就可以了。 后面应用集选择下KafkaConsumers 即可。


陆陆续续配置完所有项目。

然后配置图形。

查看最新数据图:


出现问题第一时间发送报警消息。
报警的Trigger触发规则也是对lag的值做报警,具体阀值设置为多少,还是看大家各自业务需求了。

这里我对未消费告警定时60分钟触发一次。

⚠️注释:设置group_event_lag最近消息条数的60分钟时间之内一直超过200万消费则报警


交流学习:

🐧 Linux shell_高级运维派: 459096184 圈子 (系统运维-应用运维-自动化运维-虚拟化技术研究欢迎加入)
🐧 BigData-Exchange School : 521621407 圈子(大数据运维)(Hadoop开发人员)(大数据研究爱好者) 欢迎加入

相应Bidata有内部微信交流群互相学习,加入QQ群有链接。