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+lua单机上万并发的实现
May 31 Servers
配置Kubernetes外网访问集群
Mar 31 Servers
Dashboard管理Kubernetes集群与API访问配置
Apr 01 Servers
nginx搭建NFS网络文件系统
Apr 14 Servers
centos7安装mysql5.7经验记录
May 02 Servers
Nginx 常用配置
May 15 Servers
apache ftpserver搭建ftp服务器
May 20 Servers
vscode远程免密登入Linux服务器的配置方法
Jun 28 Servers
Nginx文件已经存在全局反向代理问题排查记录
Jul 15 Servers
Nginx 502 bad gateway错误解决的九种方案及原因
Aug 14 Servers
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
Aug 14 Servers
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
Sep 23 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
Terran剧情介绍
2020/03/14 星际争霸
php 生成短网址原理及代码
2014/01/23 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
基于php的微信公众平台开发入门实例
2015/04/15 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
onsubmit阻止form表单提交与onclick的相关操作
2010/09/03 Javascript
jquery 笔记 事件
2011/11/02 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
浅析JS运动
2015/12/28 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
Javascript删除数组里的某个元素
2019/02/28 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
2019/10/30 Javascript
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
Python模块future用法原理详解
2020/01/20 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
当当网软件测试笔试题
2015/11/24 面试题
婚礼答谢宴主持词
2014/03/14 职场文书
《金子》教学反思
2014/04/13 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
赔偿协议书范本
2014/09/12 职场文书
社会实践活动报告
2015/02/05 职场文书
生产车间管理制度
2015/08/04 职场文书
生活小常识广播稿
2015/08/19 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA