实现方式:
以kafka自带脚本为基础,shell中执行后用awk获取列表中想得到的lag值,加入cron中,实现报警
#!/bin/bash
cd /home/kafka/kafka_2.11-1.1.0 (此处是先进入kafka文件夹内部 好启动lag值脚本)
send_mail(){
echo "$i队列LAG值为$lag" |mail -s "$i队列未消费offset超出$lag个" -c 这里填上自己的邮箱(但是需要提前安装mailsend插件)
}
当然上面是如果超过阈值就给哪些责任人发送邮件,有的公司是其他警告系统,例如钉钉警报 就要换一个方式
for i in topic
do
lag=`bin/kafka-consumer-groups.sh --describe --bootstrap-server IP集群 --group groupID |grep $i | awk '{print $5}'|sed ':a;N;$!ba;s/LAG/0/;s/\n/+/g' |bc`
if [ $i = topic -a $lag -gt 阈值 ];then
send_mail(发送邮件)
fi
done
至于为什么使用for循环,因为有的时候,可能一个group会消费多个topic,所以使用for循环就可以一个脚本监控一个group消费多个topic的情况
此监控最小单位可以到分区 不过awk处就要修改一下
还有 如果监控的kafka offset保存到zk中的,拿ip集群就要写zk集群
最后解释一下此监控系统的原理。
首先lag是什么?
lag是滞后量,肯定大于等于0,无法为负数,值越大阻塞越严重。直白点解释就是你生产者生产了的最新的消息编号-消费者已经消费的数量=lag,官方我记得叫hw-offset=lag 记不太清了
然后这个lag,kafka自带一个脚本kafka-consumer-groups.sh,执行就可以得到所有分区的lag,然后用awk、sed来操作文档,获取总lag,然后如果数量大于贵公司的容忍范围,就报警,但由于有的时候可能生产者就是突然拉取了一票消息,突然很大,但其实也能瞬间消费完,所以最好的就是在加一层判断,如果第一次大于阈值,然后第二次大于第一次的lag,那么才是真的可能阻塞了。代码就大伙自己写把。