低级别发现Low-level discovery(LLD)
在对主机的监控中,可能出现这样的情况,例如对某主机网卡 eth0 进行监控,可以指定需要监控的网卡是 eth0,而将网卡作为一个通用监控项时,根据主机操作系统的不同,网卡的名称也不完全相同,有些操作系统的网卡名称是 eth 开头的,而有些网卡名称是 em、enps0、ens 开头的,遇到这种情况,如果分别针对不同的网卡名设置不同的监控项,那就太繁琐了,此时使用 zabbix 的低级发现功能就可以解决这个问题
在 Zabbix 中,支持几种现成的类型的数据项发现,分别是:
1.文件系统发现
2.网络接口发现
3.SNMP OID 发现
4.CPU 核和状态
下面是 zabbix 自带的 LLD key
1.vfs.fs.discovery #适用于zabbix agent监控方式
2.snmp.discovery #SNMP agent监控方式
3.net.if.discovery #适用于zabbix agent监控方式
4.system.cpu.discovery #适用于zabbix agent监控方式
可以用 zabbix-get 来查看 key 获取的数据,对于 snmp 不能通过 zabbix-get 来验证,只能在 web 页面中进行配置使用
下面是一个 zabbix-get 的例子:
其中,{#IFNAME} 就是一个宏变量,会返回系统中所有网卡的名字。宏变量可以定义在主机、模板以及全局,宏变量都是大写的。使用宏变量,可以使 zabbix 功能更加强大
在自动发现中使用zabbix自带的宏,固定的语法格式为:{#MACRO}
zabbix还支持用户自定义的宏,这些自定义的宏也有特定的语法:{$MACRO}
在 LLD 中,常用的内置宏有 {#FSNAME}, {#FSTYPE}, {#IFNAME}, {#SNMPINDEX}, {#SNMPVALUE} 等
{#FSNAME}:表示文件系统名称
{#FSTYPE}:表示文件系统类型
{#IFNAME}:表示网卡名称
{#SNMPINDEX}:会获取 OID 中最后一个值
{#SNMPVALUE}:从返回的值中过滤掉 loopback 接口
宏的级别有多种:其优先级由高到低顺序如下:
1.主机级别的宏优先级最高
2.第一级模式中的宏
3.第二季模式中的宏
4.全局级别的宏
因此,zabbix 查找宏的顺序为:首选查找主机级别的宏,如果在主机级别不存在宏设置,那么 zabbix 就会去模板中看是否设置有宏;如果模板中也没有,将会查找使用全局的宏;若是在各级别都没找到宏,那么将不使用宏
zabbix 自定义监控项
有时候当我们监控的项目在 zabbix 预定义的key中没有定义时,这时候我们可以通过编写 zabbix 的用户参数的方法来监控我们要求的项目 item。形象一点说 zabbix 代理端配置文件中的 User parameters 就相当于通过脚本获取要监控的值,然后把相关的脚本或者命令写入到配置文件中的 User parameter 中,然后 zabbix server 读取配置文件中的返回值通过处理前端的方式返回给用户
1、zabbix agent 端开启 Userparameter 指令
UnsafeUserParameters=1
启用 agent 端自定义 item 功能,设置此参数为1后,就可以使用 UserParameter 指令了
UserParameter用于自定义itme。语法格式为:
UserParameter=<key>,<command>
其中:
UserParameter为关键字
key为用户自定义key名字可以随便起
<command>为我们要运行的命令或者脚本。
一个简单的例子:
UserParameter=ping,echo 1
代理程序程序将会永远的返回 1 当我们在服务器端添加 item 的 key 为 ping 的时候
稍微复杂的例子:
UserParameter=mysql.ping, /usr/local/mysql/bin/mysqladmin ping|grep -c alive
当我们执行 mysqladmin -uroot ping 命令的时候如果 mysq 存活要返回 mysqld is alive,我们通过 grep–c 来计算 mysqld is alive 的个数,如果 mysql 存活着,则个数为 1,如果不存活很,明显 mysqld is alive 的个数为 0,通过这种方法我们可以来判断 mysql 的存活状态。
当我们在服务器端添加 item 的 key 为 mysql.ping 时候,对于 zabbix 代理程序,如果 mysql 存活,则状态将返回 1,否则,状态将返回 0
2、让 key 接受参数
让 key 也接受参数的方法使 item 添加时更具备了灵活性
例如,系统预定义 key :
vm.memory.size[<mode>]
其中的 mode 模式就是用户要接受的参数,当我们填写为 free 时则返回的为内存的剩余大小,如果我们填入的为 userd 时返回的是内存已经使用的大小
相关语法如下:
UserParameter=key[*],command
其中,Key 的值在主机系统中必须是唯一的,其中 * 代表命令中接受的参数,command 表示命令,也就是客户端系统中可执行的命令
例如:
UserParameter=ping[*].echo $1
如果执行ping[0],那么将一直返回 '0',如果执行ping[aaa],将一直返回 'aaa'