zabbix 自动发现

时间:2024-04-15 14:05:54

所谓自动发现,就是我们设置一些规则,然后让zabbix 定期去捕捉/发现我们需要的东西。如:自动去发现java程序

本文下方内容仅为展示如何配置自动发现,示例存在很大的可实现缺陷,不可使用。

自动发现,不能用于发现变化性过于强的东西,如发现消耗cpu的top10。如果某个东西自是偶尔变化一下,或者周期性的变化,可以使用自动发现。

下面我们就以:自动发现耗cpu最高的进程为例

第一步:在被监控的服务器方编写一个可执行的shell脚本,将输出结果以json的方式展示开。

#list2.sh
# !/bin/bash^M #system process discovery script^M string=`ps -eo pcpu,pid,comm --no-header | sort -rnk1 |head -n 5` #echo -e "$string" str2=`echo -e "$string" |awk \'{print $2}\'` str3=`echo -e "$string" |awk \'{print $3}\'` #echo \'str2\'$str2 #echo "str3"$str3 printf \'{"data":[{\' for ((i=1;i<=5;i++)) do proc_array=`echo $str2 |cut -d \' \' -f$i`\'*\'`echo $str3 |cut -d \' \' -f$i` #echo "proc"$proc_array printf "\"{#PID${i}}\":\"${proc_array}\"," done date=`date +%d%H%m%s` printf "\"{#DATE}\":\"${date}\"" printf "}]" printf "}"

输出结果:

{"data":[{"{#PID1}":"10343*python3","{#PID2}":"23023*python3","{#PID3}":"12391*java","{#PID4}":"9*rcu_sched","{#PID5}":"99*kworker/5:1","{#DATE}":"1420111542245094"}]}
#data 是规定模式
#里面的{#PID} 也是固定的模式,表示这是一个自动发现键名

第二步:在被监控服务器方创建监控项

进入目录 /etc/zabbix/zabbix_agentd.d,创建一个可执行文件

#userparameter_script.conf

UserParameter=discovery.process,/opt/zabbix_script/list2.sh UserParameter=process.check[*],/opt/zabbix_script/process_check2.sh $1 $2 $3

第三步:创建zabbix自动发现

1.选择一个模板进入,点击自动发现规则

2.点击过滤器

到此,就可以自动发现耗费cpu最高的进程了。但是发现了又能怎么处理呢?

当然我们发现了,就想将他实时消耗的cpu展示成图形。

所以才会往下配置监控项。

第四步:为了配置监控项,那么就需要继续获取对应进程的cpu消耗信息。编写对应的shell脚本

#system process CPU&MEM use information
#mail: mail@huangming.org
name=$1
process=$2
date=$3
function memuse {
    mem_use=\'111\'
    printf "%.f" "$mem_use" | awk \'{printf "%.f",$1*1024*1024}\'
}
pro1=`echo "$process" | cut -d \'*\' -f1`
pro2=`echo "$process" | cut -d \'*\' -f2`
#echo $pro2
case $name in
 cpunum)
        total=`cat /proc/cpuinfo | grep \'processor\' | wc -l`
        total2=`expr $total \'*\' 100`
        printf "%.f" $total2
;;
    mem)
            memuse
    ;;
    cpu)
    cpu_use=`ps -eo pcpu,pid,comm --no-header | grep "$pro1" | grep "$pro2" | awk \'{print $1}\'`
    printf "%.f" $cpu_use

    ;;
 esac

第五步:继续创建监控项,shell脚本

UserParameter=process.check[*],/opt/zabbix_script/process_check2.sh $1 $2 $3

第六步:在自动发现规则中,编写监控项原型

创建监控项原型的方式 和创建监控项是一样的,如果不懂,请看zabbix 自己编写脚本进行监控

第七步:创建图形原型

创建图形是一样的,如果不懂,请看zabbix 自己编写脚本进行监控

第八步:主机添加该模板

至此,自动发现就完成了。但是这样的结果就真的能用了吗?

骚年,你太单纯了。

第一个问题:也许你会发现,你的自动发现,在主机中总是提示:Cannot create item: item with the same key "process.check[cpu,10343*python3,1]" already exists

这是提示你,你的监控主机已经有一个监控项,创建了以"process.check[cpu,10343*python3,1]为key 的监控项,不能再创建。

为什么会出现这样的问题:

因为你是自动发现,第一次主机根据自动发现了A,然后你创建了A的监控项,此时服务器内cpu排序发生变化后,主机在下次自动发现时,就会生成新的json,那么就会根据json又需要生成新的监控项,此时自然就会出现监控项的key重复的问题。

也许你会想到,我给key每次提供一个不一样的值,如时间戳process.check[cpu,10343*python3,{#DATE}],这样每次的key就不同了,想法是美丽的,这样会导致一个问题:

1.每次自动发现就会生成新的一批监控项, 像性能测试这样不断变化的,保证分分钟然监控项成百上千个

 

即使上面的问题,你也觉得没有问题,我能忍受

第二个问题:Cannot create graph: graph with the same name "topcpu10343*python323023*python312391*java" already exists

这是在提示你,图形名字已经存在了,不能重新创建。

每次自动发现,如果发现json变的不同了,就会生成新的监控项, 同样也会生成新的图形。

所以每次自动发现都不能有相同的名字,此时你可以能想到了给名字也增加一个时间戳,那么问题又来了。

每次自动发现就会生成新的图形,那么还有什么连续性变化可言呢?同样像性能测试这种,分分钟让你图形成百上千个

有没有感到绝望。跳楼吧,傻孩子。