原 Zabbix lld讲解与发现端口监控
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-->自动发现规则:
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
4、通过上面的item获取的返回值,然后创建的监控项原型:
主机---》模板---》自定义发现规则---》具体Item---》监控项原型:
注释:这里的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、测试结果一致:
4、新建一个监控模板,添加一个tcp_port的应用级:
5、点击自动发现,创建发现规则:
6、客户端定义key看是否能够采集到值:
7、有了这些宏变量之后咱们就可以定义监控项了(点击监控项原型、创建监控项详情):
注释:利用之前咱们讲的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、创建触发器原型(触发器类型,创建触发器原型):
注释:返回的值不是1即触发告警,到此咱们一个端口监控已经完成,:
9、主机关联模板测试,通过触发器发现如下端口:
10、也可以给每个端口添加一个图形,出图数值为1和0咱们就能观察端口的状态趋势了:
模板---》添加图形原型:
总结:到此咱们lld的端口监控已经完成,难点是返回的json数据要求,需要有编程基础的同学,shell的同学照葫芦画瓢也可以实现。
关注微信:
0
3055196782@qq.com
6人已关注
领课教育 32074
9887
update 47133
4969
领课教育 18025
husheng 20964
请更新代码 41616
凯哥Java 2226
凯哥Java 2578
凯哥Java 1991