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设置日志打印post请求参数的方法
Mar 31 Servers
查看nginx配置文件路径和资源文件路径的方法
Mar 31 Servers
nginx 防盗链防爬虫配置详解
Mar 31 Servers
Nginx如何配置Http、Https、WS、WSS的方法步骤
May 11 Servers
Nginx反向代理至go-fastdfs案例讲解
Aug 02 Servers
centos8安装nginx1.9.1的详细过程
Aug 02 Servers
Linux中如何安装并部署Redis
Apr 18 Servers
Nginx静态压缩和代码压缩提高访问速度详解
May 30 Servers
netty 实现tomcat的示例代码
Jun 05 Servers
安装harbor作为docker镜像仓库的问题
Jun 14 Servers
详解ZABBIX监控ESXI主机的问题
Jun 21 Servers
windows server 2016 域环境搭建的方法步骤(图文)
Jun 25 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
如何在PHP中使用Oracle数据库(3)
2006/10/09 PHP
smarty section简介与用法分析
2008/10/03 PHP
php代码收集表单内容并写入文件的代码
2012/01/29 PHP
php+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
js实现拖拽效果
2015/02/12 Javascript
javascript数据结构之双链表插入排序实例详解
2015/11/25 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
浅析Python 中几种字符串格式化方法及其比较
2019/07/02 Python
python与idea的集成的实现
2020/11/20 Python
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
html5移动端自适应布局的实现
2020/04/15 HTML / CSS
90后毕业生的求职信范文
2013/09/21 职场文书
财务会计人员岗位职责
2013/11/30 职场文书
煤矿安全生产责任书
2014/04/15 职场文书
党支部换届选举方案
2014/05/08 职场文书
幼儿园秋季开学寄语
2014/08/02 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
幼儿园见习报告
2014/10/30 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
世界文化遗产导游词
2019/08/07 职场文书
600字作文之感受大自然
2019/11/27 职场文书