利用zabbix的自动发现功能自动发现tomcat端口号并添加监控及告警

举报
郁唯xiaolin 发表于 2019/06/03 19:48:12 2019/06/03
【摘要】 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

        image.png

    2、创建完成后进入该Template,创建Applications,

        image.png


    3、点击Discovery rules选项,然后创建自动发现规则

        image.png

        下面是我创建的规则:

            其中key那个地方字段一定要填为“三”中配置的“UserParameter=javaport”的javaport

        image.png

    4、创建完成后,点击Item prototypes选项创建监控项

        image.png

        下面是我创建完成的监控项

        image.png

        填好框中的选项之后,点击Add选项,即可创建监控项;

    5、下面开始创建告警规则。

        image.png

        点击上图中的创建Create trigger prototype

        image.png

        在上图的第二个框中,可以点击add进行添加“Expression”,点击Add选项之后,出现下图

        image.png

        然后点击红色框选中的选项,既可快速的选中监控项,在上图中的Result中,选择自己的所需要的规则,比如我监控的端口在zabbix客户端处如果端口存在返回1,端口不存在返回0,所以,我的规则是不等于1就告警“{Tomcat_service_monitor:net.tcp.listen[{#JAVA_PORT}].last()}<>1”


    6、添加图形

        image.png

        这个图形,如果需要的话,可以监控,如果不需要,就不添加。

        image.png


    至此自动发现的规则就填写完毕。

六、在主机中关联此模板

    image.png

    可以在下面的红线框中输入Template名称然后就会自动出现,然后添加即可。点击add之后,需要在点击update,进行更新。

    添加完成之后,可以在“Configure”》》“Hosts”》》“items”中看到下图的内容,表示添加监控已经成功了

    image.png

    然后查看下graph

    image.png

    

    也能在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”上面的这个链接给了一个完美的解答,在此借鉴一下;

        也有可能是下面的这个原因

        image.png

后记:本文是本人亲手测试之后书写而成,其中的一些脚本可能有借鉴网上某兄弟的脚本的成分,在此感谢被借鉴的朋友。


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。