Zabbix对Kafka topic积压数据监控的问题(bug优化)


Posted in Servers onJuly 07, 2022

简述

《Zabbix对Kafka topic积压数据监控》一文的目的是通过Zabbix自动发现实现对多个消费者组的Topic及Partition的Lag进行监控。因在实际监控中发现有问题,为给感兴趣的读者不留坑,特通过此文对监控进行优化调整。

分区自动发现

# 未优化前的计算方式:
# 自动发现配置文件
vim consumer-groups.conf
#按消费者组(Group)|Topic格式,写入自动发现配置文件
test-group|test
# 执行脚本自动发现指定消费者和topic的分区
bash consumer-groups.sh discovery
{
    "data": [
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"0" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"1" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"3" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"2" }
    ]
}

经过上线验证,当自动发现配置文件只有一个test-group|test是没有问题的,但当我们按需求再接入test-group|test1 (即test-group消费者组的第二个Topic)时,自动发现的结果如下:

# 未优化前的计算方式:
vim consumer-groups.conf
#按消费者组(Group)|Topic格式,写入自动发现配置文件
test-group|test
test-group|test1

# 执行脚本自动发现指定消费者和topic的分区
bash consumer-groups.sh discovery
{
    "data": [
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"0" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"1" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"3" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"2" }
        { "{#GROUP}":"test-group", "{#TOPICP}":"test1", "{#PARTITION}":"0" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test2", "{#PARTITION}":"1" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test3", "{#PARTITION}":"2" }
    ]
}

了解Zabbix自动发现格式的同学会发现,每个Topic的Partition会出现',',这种格式是不符合规范,这就是导致我们的监控项会出现问题,因此我们需要进一步修改脚本。

经修改后,最终效果应该如下:

# 优化后的计算方式:
vim consumer-groups.conf
#按消费者组(Group)|Topic格式,写入自动发现配置文件
test-group|test
test-group|test1

# 执行脚本自动发现指定消费者和topic的分区
bash consumer-groups.sh discovery
{
    "data": [
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"0" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"1" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"3" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test", "{#PARTITION}":"2" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test1", "{#PARTITION}":"0" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test1", "{#PARTITION}":"1" },
        { "{#GROUP}":"test-group", "{#TOPICP}":"test1", "{#PARTITION}":"2" }
    ]
}

获取监控项“test-group/test/分区X”的Lag

经过自动发现后的数据,我们可以进一步获取不同分区的lag

# 优化后的计算方式:
# test-group test分区0 lag
bash consumer-groups.sh lag test-group test 0
# test-group test分区1 lag
bash consumer-groups.sh lag test-group test 1
# test-group test1分区0 lag
bash consumer-groups.sh lag test-group test1 0

通过命令可以看到,我们的参数通过消费者组、Topic、Partition来获取最终的lag值,如果不加消费者区分,那么无法区分不同消费者组和不同Topic相应的lag结果:

# 未优化前的计算方式:
# 获取分区0 lag
bash consumer-groups.sh lag 0
# 获取分区1 lag
bash consumer-groups.sh lag 1
# 获取分区2 lag
bash consumer-groups.sh lag 2
# 获取分区3 lag
bash consumer-groups.sh lag 3

最终优化后脚本

# 自动发现配置文件
vim consumer-groups.conf
#按消费者组(Group)|Topic格式,写入自动发现配置文件
test-group|test
test-group|test1

# 自动发现、lag计算脚本
vim consumer-groups.sh
#!/bin/bash
##comment: 根据消费者组监控topic lag,进行监控告警
#配置文件说明
#消费者组|Topic
#test-group|test

#获取topic 信息
cal_topic() {
    if [ $# -ne 2 ]; then
        echo "parameter num error, 读取topic信息失败"
        exit 1
    else
        /usr/local/kafka/bin/./kafka-consumer-groups.sh --bootstrap-server 192.168.3.55:9092 --describe --group $1 |grep -w $2|grep -v none 
    fi
}
#topic+分区自动发现
topic_discovery() {
    printf "{\n"
    printf "\t\"data\": [\n"
    m=0
    num=`cat /etc/zabbix/monitor_scripts/consumer-groups.conf|wc -l`
    for line in `cat /etc/zabbix/monitor_scripts/consumer-groups.conf`
    do  
        m=`expr $m + 1`
        group=`echo ${line} | awk -F'|' '{print $1}'`
        topic=`echo ${line} | awk -F'|' '{print $2}'`
        cal_topic $group $topic > /tmp/consumer-group-tmp
        count=`cat /tmp/consumer-group-tmp|wc -l`
        n=0
        while read line
        do
             n=`expr  $n + 1`
             #判断最后一行
             if [ $n -eq $count ] && [ $m -eq $num ]; then
                 topicp=`echo $line | awk '{print $1}'`
                 partition=`echo $line  | awk '{print $2}'`
                 printf "\t\t{ \"{#GROUP}\":\"${group}\", \"{#TOPICP}\":\"${topicp}\", \"{#PARTITION}\":\"${partition}\" }\n"
             else
                 topicp=`echo $line | awk '{print $1}'`
                 partition=`echo $line  | awk '{print $2}'`
                 printf "\t\t{ \"{#GROUP}\":\"${group}\", \"{#TOPICP}\":\"${topicp}\", \"{#PARTITION}\":\"${partition}\" },\n"
             fi
        done < /tmp/consumer-group-tmp
    done
    printf "\t]\n"
    printf "}\n"
}


if [ $1 == "discovery" ]; then
    topic_discovery
elif [ $1 == "lag" ];then
    cal_topic $2 $3 > /tmp/consumer-group
    cat /tmp/consumer-group |awk -v t=$3 -v p=$4 '{if($1==t && $2==p ){print $5}}'
else
    echo "Usage: /data/scripts/consumer-group.sh discovery | lag"
fi

# 手动运行
## 自动发现
bash consumer-groups.sh discovery
## test-group test分区0 lag
bash consumer-groups.sh lag test-group test 0

接入Zabbix

1.Zabbix配置文件

vim userparameter_kafka.conf
UserParameter=topic_discovery,bash /data/scripts/consumer-groups.sh discovery
UserParameter=topic_log[*],bash /data/scripts/consumer-groups.sh lag "$1" "$2" "$3"

2.Zabbix自动发现

Zabbix对Kafka topic积压数据监控的问题(bug优化)

3.监控项配置

Zabbix对Kafka topic积压数据监控的问题(bug优化)

4.告警信息

告警主机:Kafka_192.168.3.55
主机IP:192.168.3.55
主机组:Kafka
告警时间:2022.03.21 00:23:10
告警等级:Average
告警信息:test-group/test/分区1:数据积压100
告警项目:topic_lag[test-group,test,1]
问题详情:
test-group/test/1: 62

到此这篇关于Zabbix对Kafka topic积压数据监控的文章就介绍到这了,更多相关Zabbix积压数据监控内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Servers 相关文章推荐
Nginx中break与last的区别详析
Mar 31 Servers
Nginx tp3.2.3 404问题解决方案
Mar 31 Servers
Linux安装Nginx步骤详解
Mar 31 Servers
Nginx的反向代理实例详解
Mar 31 Servers
Nginx安装完成没有生成sbin目录的解决方法
Mar 31 Servers
Nginx Rewrite使用场景及配置方法解析
Apr 01 Servers
Windows下用Nginx配置https服务器及反向代理的问题
Sep 25 Servers
Tomcat用户管理的优化配置详解
Mar 31 Servers
Nginx速查手册及常见问题
Apr 07 Servers
Ubuntu Server 安装Tomcat并配置systemctl
Apr 28 Servers
搭建zabbix监控以及邮件报警的超级详细教学
Jul 15 Servers
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
Aug 05 Servers
nginx静态资源的服务器配置方法
Jul 07 #Servers
Nginx配置使用详解
nginx代理实现静态资源访问的示例代码
Jul 07 #Servers
使用 DataAnt 监控 Apache APISIX的原理解析
设置IIS Express并发数
Linux中sftp常用命令整理
Jun 28 #Servers
TaiShan 200服务器安装Ubuntu 18.04的图文教程
Jun 28 #Servers
You might like
探讨方法的重写(覆载)详解
2013/06/08 PHP
php实例分享之二维数组排序
2014/05/15 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
Mootools 1.2教程 类(一)
2009/09/15 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
JavaScript 中使用 Generator的方法
2017/12/29 Javascript
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
如何在python中使用selenium的示例
2017/12/26 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
python中必要的名词解释
2019/11/20 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
python不相等的两个字符串的 if 条件判断为True详解
2020/03/12 Python
浅谈keras 模型用于预测时的注意事项
2020/06/27 Python
python中numpy数组与list相互转换实例方法
2021/01/29 Python
Diptyque英国官方网站:源自法国的知名香氛品牌
2019/08/28 全球购物
会议邀请函范文
2014/01/09 职场文书
机电一体化应届生求职信范文
2014/01/24 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
学校春季防火方案
2014/06/08 职场文书
化工专业自荐书
2014/06/16 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
创先争优活动个人总结
2015/03/04 职场文书
CAD实训总结范文
2015/08/03 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript