写文章

Zabbix lld讲解与发现端口监控

2018-11-30 01:47:05

4215 | 0 | 0

 Zabbix3.0入门到生产环境应用实战:

http://www.roncoo.com/course/view/fb3050a5b34b42f39ccad83ebebc89c1


一、软件版本

操作系统:CentOS-6.5-x86_64

zabbix版本:3.0.3

 

二、lld简介(Low-level discovery)

简单的理解为一种发现规则;跟我们之前讲到的发现有区别,之前讲到的发现规则只能是基于主机;而lld则是基于更底层的发现,能够发现我们去定义的东西。通过返回json数据和调用json数据发现和定制我们的规则;也是zabbix自动化的一个重要功能。

 

三、首先了解一下系统自带的lld发现规则(可以直接查看linux os模板):

 

1、查看自动发现规则,可以看到有两个发现规则,一个是发现磁盘一个是发现网卡:

 

    配置--》模板--》linux os-->自动发现规则:

                                              face/FWkXFwEaah8XfQPz8XAQHMXC5CJ4RN6m.png

 

2、用磁盘带的key来做实验操作:key为vfs.fs.discovery:

 

[root@zabbix_server bin]# ./zabbix_get -s 192.168.63.205 -k vfs.fs.discovery

{"data":[{"{#FSNAME}":"/","{#FSTYPE}":"rootfs"},{"{#FSNAME}":"/proc","{#FSTYPE}":"proc"},{"{#FSNAME}":"/sys","{#FSTYPE}":"sysfs"},{"{#FSNAME}":"/dev","{#FSTYPE}":"devtmpfs"},{"{#FSNAME}":"/dev/pts","{#FSTYPE}":"devpts"},{"{#FSNAME}":"/dev/shm","{#FSTYPE}":"tmpfs"},{"{#FSNAME}":"/","{#FSTYPE}":"ext4"},{"{#FSNAME}":"/proc/bus/usb","{#FSTYPE}":"usbfs"},{"{#FSNAME}":"/boot","{#FSTYPE}":"ext4"},{"{#FSNAME}":"/home","{#FSTYPE}":"ext4"},{"{#FSNAME}":"/proc/sys/fs/binfmt_misc","{#FSTYPE}":"binfmt_misc"},{"{#FSNAME}":"/cgroup/cpuset","{#FSTYPE}":"cgroup"},{"{#FSNAME}":"/cgroup/cpu","{#FSTYPE}":"cgroup"},{"{#FSNAME}":"/cgroup/cpuacct","{#FSTYPE}":"cgroup"},{"{#FSNAME}":"/cgroup/memory","{#FSTYPE}":"cgroup"},{"{#FSNAME}":"/cgroup/devices","{#FSTYPE}":"cgroup"},{"{#FSNAME}":"/cgroup/freezer","{#FSTYPE}":"cgroup"},{"{#FSNAME}":"/cgroup/net_cls","{#FSTYPE}":"cgroup"},{"{#FSNAME}":"/cgroup/blkio","{#FSTYPE}":"cgroup"},{"{#FSNAME}":"/var/lib/docker/devicemapper","{#FSTYPE}":"ext4"}]}

 

注释:上面的数据复制完粘贴到http://www.json.cn/就能看到完整的json数据。,主要是返回这样的一个json数据,有过编程基础的同学应该很容易就实现,没有的话也没关系,用shell也安装格式打印也是可以实现的。

 

####上面的格式在json.cn下面打印:

{
    "data":[
        {
            "{#FSNAME}":"/",
            "{#FSTYPE}":"rootfs"
                            }
    ]
}

 

***{#FSNAME},和{#FSTYPE}等于就是两个宏变量,在key里面调用即可,我们下面深入看下监控项。

 

3、具体的监控项原型:第一个item主要是获取返回的这个json值。

 

    主机---》模板---》自定义发现规则---》具体Item

 

face/iRsyGQKknctdxSYxj8JD2rE77XwxBRSn.png

 

4、通过上面的item获取的返回值,然后创建的监控项原型:

 

   主机---》模板---》自定义发现规则---》具体Item---》监控项原型:

 

face/Z6QZsfQaN3ZzSCDmBhmzmxGh8TcZmfPT.png

 

注释:这里的vfs.fs.size[{#FSNAME},free] 类似的kye也是调用了上面的返回值用变量的方式获取即可,然后就匹配了所有的参数值。然后剩下的就是添加一些图形监控之类的了。

 

5、lld监控总结:

 

定义好可变的数据,返回json值的宏变量-->创建一个item接收所有的值-->定义监控原型操作每一个监控项调用宏变量。

 

 

四、下面以发现端口为例,发现linux下所有的端口,并对所有端口状态进行监控:

 

1、脚本编写(python方式):

 

[root@BJ-monitor-h-01 scripts]# cat ports.py

#!/usr/bin/env python

#coding:utf-8

 

import os, json

 

port_list=[]

port_dict={"data":None}

cmd='''netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort |uniq   2>/dev/null'''

local_ports=os.popen(cmd).readlines()

 

for port in local_ports:

    pdict={}

    pdict["{#TCP_PORT}"]=port.replace("\n", "")

    port_list.append(pdict)

 

port_dict["data"]=port_list

jsonStr = json.dumps(port_dict, sort_keys=True, indent=4)

 

print jsonStr

 

2、shell实现方式:

 

[root@BJ-monitor-h-01 scripts]# cat ports.sh

#!/bin/bash

port_array=(`netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort |uniq   2>/dev/null`)

length=${#port_array[@]}

printf "{\n"

printf  '\t'"\"data\":["

for ((i=0;i<$length;i++))

do

        printf '\n\t\t{'

        printf "\"{#TCP_PORT}\":\"${port_array[$i]}\"}"

        if [ $i -lt $[$length-1] ];then

                printf ','

        fi

done

printf  "\n\t]\n"

printf "}\n"

 

 

3、测试结果一致:

 

face/2eZnkJtCAxTHkeXJP3ZZT5AKecf4Fcex.png

 

4、新建一个监控模板,添加一个tcp_port的应用级:

 

face/ZTnjzSDpQQ7i7ynmG87H3DX43rcmxhaY.png

 

5、点击自动发现,创建发现规则:

 

face/R8nEmfdH7hcpjzPABhtc8fhaCXGta6xH.png

 

 

6、客户端定义key看是否能够采集到值:

face/PGXH8aC6Hrna6G7E4sPe2ecPC5tBYC6M.png

 

7、有了这些宏变量之后咱们就可以定义监控项了(点击监控项原型、创建监控项详情)

 

face/AhDEdMrWERDns5PKaFc8k5dQBBcDkkPN.png

 

注释:利用之前咱们讲的net.tcp.listen这个内置key,测试看端口是否在运行:如:

[root@zabbix_server bin]# ./zabbix_get -s 192.168.63.205 -k net.tcp.listen[80]

1

返回值为1说明端口再运行,而{#TCP_PORT}就是调用咱们之前采集到的宏变量,

备注:要是net.tcp.listen不是咱们内置key,咱们也需要在agnet端定义,下节课讲到。

 

8、创建触发器原型(触发器类型,创建触发器原型):

face/6fPjR6a6PyQxZhGRWfBjsmTMe3jWHP5C.png

注释:返回的值不是1即触发告警,到此咱们一个端口监控已经完成,:

 

 

 

 

 

9、主机关联模板测试,通过触发器发现如下端口:

 

face/ePNxSGxwQBNTrFiXZR68eXRSxFai2mAk.png

 

10、也可以给每个端口添加一个图形,出图数值为10咱们就能观察端口的状态趋势了:

 

    模板---》添加图形原型:

 

face/wFj35sZTJDZ76P8PnhCiBjdRX4Q5yd5h.png

 

 

 

总结:到此咱们lld的端口监控已经完成,难点是返回的json数据要求,需要有编程基础的同学,shell的同学照葫芦画瓢也可以实现。

 

关注微信:

face/R7t5KXkdpGm4FQrPADas6eW5kn6jfzTf.png


0

收藏
分享