为什么要自定义KEY

有时候我们想让被监控端执行一个zabbix没有预定义的检测,zabbix的用户自定义参数功能提供了这个方法。我们可以在客户端配置文件zabbix_angentd.conf里面配置UserParameter.

语法如下:

UserParameter=key,command

用户自定义参数包含一个key和一个命令,key必须整个系统唯一,配置好之后,重启客户端。 
然后配置item,在key的位置填上我们自定义的key即可。

简单点的命令示例:

UserParameter=ping,echo 1

如果调用ping这个key,将会收到返回值1.

更复杂的命令示例:

UserParameter=mysql.ping,mysqladmin -uroot ping|grep -c alive

如果返回1表示MySQL运行中,如果返回0表示MySQL挂了

key的高级使用方法

参数 描述 
Key 唯一. [*]表示里面可以传递多个参数 
Command 需要执行的脚本,key的[]里面的参数一一对应9,一共9个参数。$0表示脚本命令.

1. 如果需要使用命令行里面出现$2这种变量,那么你要使用两个$$2,例如awk ’{ print $$2 }’,之前就遇到过这个问题,不停的测试自己脚本输出正常,但是zabbix却拿不到数据,原来是出在这里。为了防止和参数冲突,所以zabbix做了这个规定。
2. zabbix禁止使用一些不安全的参数,如下:\ ' ”  * ? [ ] { } ~ $ ! & ; ( ) < > | # @
3. 从zabbix 2.0开始,zabbix返回文本数据可以是空格。

UserParameter=ping[*],echo $1
ping[0] - 将一直返回0
ping[aaa] - 将一直返回 'aaa'

案例:简单的key实现

我们这个参数可以查出内存空闲了多少,如果我们zabbix要监控,但是zabbix服务器上面没有这个key怎么办呢,我们就要自定义了

[root@localhost ~]# free | awk '/^Mem:/{print $4}'
88412

1、客户端必须安装了zabbix-agentd客户端,修改zabbix_agentd.conf

[root@localhost ~]# vim /etc/zabbix/zabbix_agentd.conf
UserParameter=Mem.free,free | awk '/^Mem:/{print $4}'

2、重启客户端

[root@localhost ~]# service zabbix-agent restart
Shutting down Zabbix agent:                                [  OK  ]
Starting Zabbix agent:                                     [  OK  ]

3、在zabbix服务端上面zabbix_get测试能否获取数据

[root@localhost ~]# zabbix_get -s 10.1.252.241 -k "Mem.free"
87844

案例:高级的key监控内存总大小和当前使用

我们都知道/proc是内核的反射区,/proc/meminfo 中显示的内存信息

[root@localhost ~]# cat /proc/meminfo 
MemTotal:
       1001332 kB
MemFree:          121864 kB
MemAvailable:     325308 kB
Buffers:               0 kB
Cached:           274108 kB
........

上面显示出来了内存的详细信息,我们如何定义key让zabbix服务端监控我们主机的内存信息

1、执行正则表达式命令可以把信息过滤出来,但是每个参数都用一个正则表达式来做,这不符合我们这些高级的搬服务器能干的出来的的,从上面的简单案例可以看出,我们可以使用[*]然后$1,$2这样的来调用

[root@localhost ~]# cat /proc/meminfo | awk "/^MemTotal:/{print $2}"
MemTotal:        1004136 kB

2、我们就监控这些参数,用一个key实现

MemTotal:        1004136 kB
MemFree:          87800 kB
Buffers:         108264 kB
Cached:          590832 kB

3、修改zabbix_agentd.conf 
$1 是调用前面的[*]里面的参数的,为什么使用$$2,如果使用一个$会让这个shell命令认为是调用第二个[*]里面的参数

UserParameter=memory.usage[*],/bin/cat /proc/meminfo | awk '/^$1:/{print $$2}

4、我们在服务器用zabbix_get测试,看能不能获取key定义的值(完全不用质疑,可以

[root@localhost ~]# zabbix_get -s 10.1.252.241 -k "memory.usage[MemTotal]"
1004136
[root@localhost ~]# zabbix_get -s 10.1.252.241 -k "memory.usage[MemFree]"
85464
[root@localhost ~]# zabbix_get -s 10.1.252.241 -k "memory.usage[Buffers]"
108516
[root@localhost ~]# zabbix_get -s 10.1.252.241 -k "memory.usage[Cached]"
590900

5、到zabbix服务器上面添加对应的参数监控项,然后集中到一个图里面,应该不是什么事吧,不会设置监控项和图的,可以参考前面的文章

案例:利用高级的key监控nginx的状态

1、nginx server的主配置文件 都配置status模块 代码端如下

location /ngst{  
   stub_status on;  
   access_log off;  
   allow 127.0.0.1;  
   deny all;  
}

2、nginx-status的取值脚本

[root@localhost ~]# vim /home/zabbix/nginx_status.sh 
#!/bin/bash
#
host='127.0.0.1'
port='80'
status='/status'

active() {
       curl -s http://${host}:${port}${status} | awk '/^Active/{print $3}'
}

accepts() {
       curl -s http://${host}:${port}${status} | awk 'NR==3{print $1}'
}

handled() {
       curl -s http://${host}:${port}${status} | awk 'NR==3{print $2}'
}

requests() {
       curl -s http://${host}:${port}${status} | awk 'NR==3{print $3}'
}

reading() {
       curl -s http://${host}:${port}${status} | awk 'NR==4{print $2}'
}

writing() {
       curl -s http://${host}:${port}${status} | awk 'NR==4{print $4}'
}

waiting() {
       curl -s http://${host}:${port}${status} | awk 'NR==4{print $6}'
}

$1

3、加上执行权限

[root@localhost zabbix]# chmod +x nginx_status.sh

4、修改zabbix_agentd.conf

UserParameter=nginx.status[*],/home/zabbix/nginx_status.sh $1
[root@localhost zabbix]# service zabbix-agent restart
Shutting down Zabbix agent:                                [  OK  ]
Starting Zabbix agent:                                     [  OK  ]

5、zabbix服务端zabbix_get测试自定义key

[root@localhost ~]# zabbix_get -s 10.1.252.241 -k "nginx.status[requests]"
503

6、自定义已经执行成功,在web上面添加监控项

QQ截图20161105155355.png

7、添加好,把监控项做成一张图

QQ截图20161105155444.png