zabbix中支持及于zabbix_sender和trapper的方式获取数据并监控 ,在进行深一步的探讨之前有必要先了解下什么是zabbix_sender和trapper 。如果用过nagios的人,应该知道nagios里有一个nsca_send程序,可以通过将数据直接发送给monitor 监控端 ,同样zabbix_sender的作用也一样,也是将数据发送给zabbix server ;而什么是trapper呢?tapper也称作zabbix捕捉器,用于捕获zabbix_sender发送的数据 。所以想要使用zabbix_sender + trapper 模式,首先要在zabbix服务器上必须有一个捕捉项目(即trapper item ),用于把数据推送给zabbix服务器 ,这点也同nagios类似,需要在server端先要配置好cfg监控项,才能接收nsca_send发来的数据(总的来说所有,所有监控方式原理性的东西基本都是通的,像snmp也有trapper) 。

一、创建trapper item

正如上面所说 ,服务端想要接受到zabbix_sender发来的数据,先要创建 trapper item 。具体创建方式为 configuration —–> templates —–> items —–> create items , 如下图所示:

zabbix-trapper-create

二、zabbix_sender的使用

先看下zabbix_sender的用法:

 1# zabbix_sender -h
 2Zabbix Sender v2.2.3 (revision 44105) (7 April 2014)
 3usage: zabbix_sender [-Vhv] {[-zpsI] -ko | [-zpI] -T -i <file> -r} [-c <file>]
 4Options:
 5  -c --config <file>                   Absolute path to the configuration file
 6  -z --zabbix-server <server>          Hostname or IP address of Zabbix server
 7  -p --port <server port>              Specify port number of server trapper running on the server. Default is 10051
 8  -s --host <hostname>                 Specify host name. Host IP address and DNS name will not work
 9  -I --source-address <IP address>     Specify source IP address
10  -k --key <key>                       Specify item key
11  -o --value <key value>               Specify value
12  -i --input-file <input file>         Load values from input file. Specify - for standard input
13                                       Each line of file contains whitespace delimited: <hostname> <key> <value>
14                                       Specify - in <hostname> to use hostname from configuration file or --host argument
15  -T --with-timestamps                 Each line of file contains whitespace delimited: <hostname> <key> <timestamp> <value>
16                                       This can be used with --input-file option
17                                       Timestamp should be specified in Unix timestamp format
18  -r --real-time                       Send metrics one by one as soon as they are received
19                                       This can be used when reading from standard input
20  -v --verbose                         Verbose mode, -vv for more details
21Other options:
22  -h --help                            Give this help
23  -V --version                         Display version number

详细的用法可以查看官网示例:https://www.zabbix.com/documentation/2.2/manpages/zabbix_sender

这里以最简单的发送一个key的值为例:

 1//成功的示例
 2# zabbix_sender -vv -z 127.0.0.1 -p 10051 -s 'mongodb-0-45' -k mongodb_version -o 2.4.10
 3zabbix_sender [6933]: DEBUG: answer [{
 4        "response":"success",
 5        "info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000219"}]
 6info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000219"
 7sent: 1; skipped: 0; total: 1
 8//失败的示例
 9# zabbix_sender -vv -z 127.0.0.1 -p 10051 -s '172.20.0.45' -k mongodb_version -o 2.4.10
10zabbix_sender [6973]: DEBUG: answer [{
11        "response":"success",
12        "info":"processed: 0; failed: 1; total: 1; seconds spent: 0.000097"}]
13info from server: "processed: 0; failed: 1; total: 1; seconds spent: 0.000097"
14sent: 1; skipped: 0; total: 1

注:上面的发送示例中mongodb-0-45主机的IP就是172.20.0.45,同样的主机,为什么用主机名正确,用IP就失败呢?因为zabbix server是通过configuration ——> hosts ——> host name 里的名字来判读的 。如下图:

sender-user-hostname

使用上面的命令发送完成后,可以通过monitoring —–> laster data ——>对应的主机的item 接收到的值 查看具体接收到的时候来验证一切是否正常。如下图,服务端接受到了我们刚刚发送的数据 。

zabbixsender-data

三、具体示例

这里我们结合 mikoomi-mongodb-plugin 监控插件作为示例,看下zabbix_sender 和 trapper 是如何进行结合工作的 。该插件是利用php下的mongo.so 提供的API获取mongo的状态值,再将数据处理成zabbix_sender可以使用-i参数可以接受的格式再进行发送。该插件一共包含三个文件: 一个xml模板文件(创建trapper item)、一个shell脚本(调用php文件并传参给php文件)、一个php文件 ,其下载页位于:http://mikoomi.googlecode.com/svn/plugins/MongoDB%20Plugin/

1、导入xml模板文件

该过程实际上是简化第一部中创建trapper item 的过程 ,通过configuration —-> templates ——> import ——-> 导入下载的xml文件。导入完成后,会发现在templates里多了一个名字为Template_MongoDB 的模板文件 。

2、利用zabbix_sender发送监控结果

下载mikoomi-mongodb-plugin.php、mikoomi-mongodb-plugin.sh两个文件,将使放到/etc/zabbix/externalscripts目录(没有该目录请创建 , 注意这里一定要是该名称的目录,因为脚本时写的是该目录,想要使用其他目录,需要修改脚本中的路径) 。进入该目录,执行类似如下的命令:

1# sh mikoomi-mongodb-plugin.sh -D -h 172.20.0.45 -p 27017 -z mongodb-0-45

其中-D意为进入debug模式、-h是被监控主机的IP(即运行有mongodb的主机) 、-p mongodb主机的端口、-z 该机在zabbix_server端配置的host name ,细心的人估计会发现这里没有写zabbix_server的IP和端口,程序怎么知道发送到那里 。zabbix_server已经写到了mikoomi-mongodb-plugin.php目录里,在其末尾部分找到如下行:

1exec("zabbix_sender -vv -z 127.0.0.1 -i $data_file_name 2>&1", $log_file_data) ;

所以这里也相当于指定了该插件需要安装在zabbix_server端上 ,如果是安装在proxy端或其他地方的,也可以通过修改该行正常工作 。

运行完上面的脚本,默认数据会在/tmp目录生成mikoomi-mongodb-plugin.php_主机名.data、mikoomi-mongodb-plugin.php_主机名.log两个文件 ,查看data文件,不难发现其格式为 主机名 key名 data ,具体如下:

 1# more mikoomi-mongodb-plugin.php_mongodb-0-45.data
 2mongodb-0-45 mongodb_version 2.4.10
 3mongodb-0-45 uptime 1203
 4mongodb-0-45 globalLock_lockTime 202966
 5mongodb-0-45 globalLock_currentQueue_total 0
 6mongodb-0-45 globalLock_currentQueue_readers 0
 7mongodb-0-45 globalLock_currentQueue_writers 0
 8mongodb-0-45 mem_bits 64
 9mongodb-0-45 mem_resident 37
10mongodb-0-45 mem_virtual 342
11mongodb-0-45 connections_current 2
12……………………………………省略

3、zabbix_sender发送相关

上面的插件只是一个简单示例,如果想完成通过shell也可以实现,上面的php执行的内容和以下命令执行出的结果一样:

1# echo "db.serverStatus()" | mongo admin
2# echo "db.rsconf()" | mongo admin

只要最终按zabbix_server所要的求的格式:主机名 key data 的方式发送给zabbix_server 就可以正常的在监控页面上展示 。具体可以参看51cto上的一个示例(不过该示例不是以zabbix_sender的方式工作的)。

4、插件相关

由于该插件长久以为没有更新,我在ubuntu下的2.4.10版的mongodb上取数据时,发现里有的一些键值项已经发生变化,而php文件的判读上也存在错误 。使用过程中可能会报如下错误:

1zabbix_sender -vv -z 127.0.0.1 -i $data_file_name
2# zabbix_sender -vv -z 127.0.0.1  -s 'mongodb-0-45' -i mikoomi-mongodb-plugin.php_mongodb-0-45.data
3zabbix_sender [4432]: Warning: [line 14] 'Key value' required
4Sending failed.

目前我已将修改过后的版本上传到了github页面 上 。

四、其他

zabbix_sender一些原理性的东西及利用python上传json格式的数据,可以参看下itnihao的相关文章