利用zabbix的自动发现功能自动发现tomcat端口号并添加监控及告警
【摘要】 zabbix自动发现java的端口号,并添加监控以及告警。
一、简介
zabbix的自动发现功能需要传输的数据为json格式的,可以使用Python格式json.dump进行json格式化,也可以使用shell,利用printf,进行打印出json格式的回显。所以,自动发现功能可以有Python书写,也可以由shell进行书写。
二、相关的脚本
Shell版本
#!/bin/bash
# Time : 2019/6/3
# Author : "郁唯"
##shell书写的自动发现端口号的脚本
##exclude_port这些进程是不需要的,如果需要屏蔽检测某些进程的端口,只需要在下面|grep CloudResetPwdUpdateAgent的后面,在添加|grep -v xxxx 即可。
exclude_port=$(ps -ef |grep java |grep CloudResetPwdUpdateAgent |awk '{ print $2 }'|xargs |sed 's/ /\|/g')
##使用if判断下exclude_port是否为空,如果为空的话,egrep会报错。
if [[ $exclude_port = "" ]];then
##下面的命令中必须用sudo的权限启动,可以在/etc/sudoers 中添加一行以只是zabbix使用sudo权限“zabbix ALL=(ALL) NOPASSWD: ALL”
portarray=(`/usr/bin/sudo /bin/netstat -tnlp|egrep -i java|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`)
else
##将需要的java端口检索出来。添加egrep -v 是为了屏蔽某些不需要的进程,所有的端口号,都会在下面的这个变量里面,但是将所>有的端口取出来需要使用:${portarray[@]}
portarray=(`/usr/bin/sudo /bin/netstat -tnlp|egrep -i java|egrep -v $exclude_port|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`)
#下面可以加上sudo的使用方法,不过centos好像直接root权限,ubuntu需要设置zabbix的启动权限。
#portarray=(`sudo /bin/netstat -tnlp|egrep -i java|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`)
fi
length=${#portarray[@]}
printf "{\n"
printf '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
printf '\n\t\t{'
printf "\"{#JAVA_PORT}\":\"${portarray[$i]}\"}"
if [ $i -lt $[$length-1] ];then
printf ','
fi
done
printf "\n\t]\n"
printf "}\n"
Python版本是python3
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# __Time__ : 2019/6/3
# __Author__ : "郁唯"
import os
import subprocess
import simplejson as json
#由于系统中可能会有一些不想被检测的java程序,所以用下面的变量给过滤下不想检测的。
Exclude_port=subprocess.getoutput("ps -ef |grep java |grep CloudResetPwdUpdateAgent |awk '{ print $2 }'|xargs |sed 's/ /\|/g'")
#判断Exclude_port是否为空,如果是空的话,就不能使用egrep -v命令进行排除了,因为egrep不能什么都不接
if Exclude_port == "":
Java_port = "/usr/bin/sudo /bin/netstat -tnlp|egrep -i java|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq"
else:
Java_port = "/usr/bin/sudo /bin/netstat -tnlp|egrep -i java|egrep -v %s|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq" % Exclude_port
t=subprocess.getoutput(Java_port)
tomcats=[]
for tomcat in t.split('\n'):
if len(tomcat) != 0:
tomcats.append({'{#JAVA_PORT}':tomcat})
# # 打印出zabbix可识别的json格式
print(json.dumps({'data':tomcats},sort_keys=True,indent=4,separators=(',',':')))
注意:
1、以上两种版本的脚本都需要添加执行权限,或者是在执行的时候使用/bin/bash discovery.sh 或者/usr/bin/python3 discovery.py
2、使用netstat命令输出端口号;-tnlp=Tcp协议+不显示别名+listen状态+显示程序名称;$1~$9表示输出的第几个参数;awk {'print $4'}表示输出第4个参数(如0.0.0.0:80);awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}表示截取冒号后面的值,且只能是0~9的数字;|sort|uniq表示排序和去重。
三、配置zabbix客户端并测试
在zabbix客户端的配置文件(/usr/bin/zabbix_agentd/etc/zabbix_agentd.con)中添加字段
UnsafeUserParameters=1
UserParameter=javaport,/usr/local/zabbix_agent/sbin/discovery.sh "$1"
修改完成后重启zabbix_agentd 服务。
/etc/init.d/zabbix_agentd restart
在服务端测试能否获取到自动发现的端口号
/usr/local/zabbix/bin/zabbix_get -s 192.168.x.xx -p 10050 -k "javaport"
###如果返回以下内容表示能自动发现端口号;
###如果不能正确返回,请自行检查zabbix客户端的日志文件,看报错,还可以在终端中自行执行,看能否返回如下格式的数据
{
"data":[
{
"{#JAVA_PORT}":"17300"
},
{
"{#JAVA_PORT}":"17500"
},
{
"{#JAVA_PORT}":"18091"
}
]
}
四、zabbix的web页面配置自动发现
1、zabbix前端页面中创建一个Template
2、创建完成后进入该Template,创建Applications,
3、点击Discovery rules选项,然后创建自动发现规则
下面是我创建的规则:
其中key那个地方字段一定要填为“三”中配置的“UserParameter=javaport”的javaport
4、创建完成后,点击Item prototypes选项创建监控项
下面是我创建完成的监控项
填好框中的选项之后,点击Add选项,即可创建监控项;
5、下面开始创建告警规则。
点击上图中的创建Create trigger prototype
在上图的第二个框中,可以点击add进行添加“Expression”,点击Add选项之后,出现下图
然后点击红色框选中的选项,既可快速的选中监控项,在上图中的Result中,选择自己的所需要的规则,比如我监控的端口在zabbix客户端处如果端口存在返回1,端口不存在返回0,所以,我的规则是不等于1就告警“{Tomcat_service_monitor:net.tcp.listen[{#JAVA_PORT}].last()}<>1”
6、添加图形
这个图形,如果需要的话,可以监控,如果不需要,就不添加。
至此自动发现的规则就填写完毕。
六、在主机中关联此模板
可以在下面的红线框中输入Template名称然后就会自动出现,然后添加即可。点击add之后,需要在点击update,进行更新。
添加完成之后,可以在“Configure”》》“Hosts”》》“items”中看到下图的内容,表示添加监控已经成功了
然后查看下graph
也能在graphs中看到监控的状态。
很完美的完成了自动发现端口并且监控的规则。
七、说一下碰到的问题吧。
1、执行脚本的时候发现提示 Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.
这个错误是由于zabbix用户启动的zabbix服务,默认没有执行netstat命令的权限,有两种解决方法:
###第一种,在/etc/sudoers 中添加一条命令
#Defaults requiretty 注释掉这个
zabbix ALL=(ALL) NOPASSWD: ALL
###第二种,是给所使用的命令赋予s的权限
chmod +s /bin/netstat
#“chmod +s”命令的含义是:为了方便普通用户执行一些特权命令,SUID/SGID程序允许普通用户以root身份暂时执行该程序,并在执行结束后再恢复身份。
2、添加自动发现端口后出现报错“Value should be a JSON object.”的报错
可能的原因也是上面的那个报错引起的
“http://www.voidcn.com/article/p-npjtgyco-bpa.html”上面的这个链接给了一个完美的解答,在此借鉴一下;
也有可能是下面的这个原因
后记:本文是本人亲手测试之后书写而成,其中的一些脚本可能有借鉴网上某兄弟的脚本的成分,在此感谢被借鉴的朋友。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)