Zabbix 3.2 agentd自动发现监控资源占用TOP 10进程

by 老谢

老谢博客 / 2018-06-13 20:43

创建top.sh
   #!/bin/sh     top -n 1 -b> /tmp/top.txt     

#注: 所有脚本请放至/usr/local/zabbix/share/scripts中
#注: 该脚本的意思是执行一次top命令并将结果重定向到top.txt

   crontab -e     */1 * * * * /usr/local/zabbix/share/scripts/top.sh > /dev/null     

#注: 使用crond每分钟执行一次脚本,输出最新top数据到top.txt

创建check_process.sh获取进程名
   #!/bin/bash     TABLESPACE=`tail -n +8 /tmp/top.txt|awk '{a[$NF]+=$6}END{for(k in a)print a[k]/1024,k}'|sort -gr|head -10|cut -d" " -f2`             COUNT=`echo "$TABLESPACE" |wc -l`     INDEX=0     echo '{"data":['     echo "$TABLESPACE" | while read LINE; do             echo -n '{"{#PROCESSNAME}":"'$LINE'"}'             INDEX=`expr $INDEX + 1`             if [ $INDEX -lt $COUNT ]; then                     echo ','             fi     done     echo ']}'     

  注: 最关键的是tail -n +8 /tmp/top.txt|awk ‘{a[NF]+=6}END{for(k in a)print a[k]/1024,k}’|sort -gr|head -10|cut -d” ” -f2这条命令:这条命令的意思是从top.txt文件中取出从第八行到末尾行的数据,然后使用awk对这些数据进行累加,效果是以最后一列为关键字,每个关键字对应的第6列的数值进行累加,输出第六列数据的累加结果和最后一列数据,然后使用sort进行排序,注意这里的参数是使用-gr而不是使用-nr是因为获取到的第六列的值是以KB为单位的,假如某进程占用内存大于10G的话,将会使用科学记数法计数,sort -nr参数无法对科学记数法进行计数,需要将参数改成-gr才行,其中的-r是进行反向排序,同时为了防止zabbix获取到该值是科学记数法获取的值从而无法识别,先将该值/1024将单位变成MB,当zabbix获取到数据后再*1024*1024将该值还原成BYTE单位。head -10是取出占用内存最大的十个进程,然后使用cut对数据进行切分,获得十个进程的进程名。

  将获取到的十个进程名进行json格式化的输出,输出结果如下:

   [root@localhost scripts]# ./check_process.sh     {"data":[     {"{#PROCESSNAME}":"php-fpm"},     {"{#PROCESSNAME}":"zabbix_agentd"},     {"{#PROCESSNAME}":"sshd"},     {"{#PROCESSNAME}":"rsyslogd"},     {"{#PROCESSNAME}":"mingetty"},     {"{#PROCESSNAME}":"crond"},     {"{#PROCESSNAME}":"bash"},     {"{#PROCESSNAME}":"mysqld_safe"},     {"{#PROCESSNAME}":"init"},     {"{#PROCESSNAME}":"udevd"}]}     

#注:本例是以 RES 作为标准衡量资源消耗,可通过其他指标来监控

创建process_monitor.sh获取资源消耗
   #!/bin/sh     process=$1     name=$2     case $2 in     mem)     echo "`tail -n +8 /tmp/top.txt|awk '{a[$NF]+=$6}END{for(k in a)print a[k]/1024,k}'|grep "$process"|cut -d" " -f1`"     ;;     cpu)     echo "`tail -n +8 /tmp/top.txt|awk '{a[$NF]+=$9}END{for(k in a)print a[k],k}'|grep "$process"|cut -d" " -f1`"     ;;     *)     echo "Error input:"     ;;     esac     exit 0     

  本地执行脚本测试:

   [root@localhost scripts]# ./process_monitor.sh php-fpm cpu     0     [root@localhost scripts]# ./process_monitor.sh php-fpm mem     6.0752     
编辑zabbix_agentd.conf

#增加以下UserParameter字段

   UserParameter=process.discovery,/usr/local/zabbix/share/scripts/check_process.sh     UserParameter=process.resource[*],/usr/local/zabbix/share/scripts/process_monitor.sh $1 $2     

#注:配置完成后重启zabbix_agentd

zabbix server上抓取测试
   [root@zabbix-server bin]# ./zabbix_get -s xx.xx.xx.xx -k "process.discovery"     {"data":[     {"{#PROCESSNAME}":"php-fpm"},     {"{#PROCESSNAME}":"zabbix_agentd"},     {"{#PROCESSNAME}":"sshd"},     {"{#PROCESSNAME}":"rsyslogd"},     {"{#PROCESSNAME}":"mingetty"},     {"{#PROCESSNAME}":"crond"},     {"{#PROCESSNAME}":"bash"},     {"{#PROCESSNAME}":"mysqld_safe"},     {"{#PROCESSNAME}":"init"},     {"{#PROCESSNAME}":"udevd"}]}     [root@zabbix-server bin]# ^C     [root@zabbix-server bin]# ./zabbix_get -s xx.xx.xx.xx -k "process.resource[php-fpm,mem]"     6.0752     [root@zabbix-server bin]# ./zabbix_get -s xx.xx.xx.xx -k "process.resource[php-fpm,cpu]"     0     
导入模板

点击下载

#参考自:https://blog.csdn.net/ybx13218464908/article/details/47819401

Shared via Inoreader