提出问题:
zabbix对文件系统的监控是通过LLD实现的,zabbix首先通过Discovery rule发现所有的文件系统名称和类型,如下:
<code>shell</code><code># zabbix_get -s 127.0.0.1 -k vfs.fs.discovery</code>
<code>{</code>
<code> </code><code>"data"</code><code>:[</code>
<code> </code><code>{</code>
<code> </code><code>"{#FSNAME}"</code><code>:</code><code>"/"</code><code>,</code>
<code> </code><code>"{#FSTYPE}"</code><code>:</code><code>"rootfs"</code>
<code> </code><code>},</code>
<code> </code><code>"{#FSNAME}"</code><code>:</code><code>"/proc"</code><code>,</code>
<code> </code><code>"{#FSTYPE}"</code><code>:</code><code>"proc"</code>
<code> </code><code>"{#FSNAME}"</code><code>:</code><code>"/sys"</code><code>,</code>
<code> </code><code>"{#FSTYPE}"</code><code>:</code><code>"sysfs"</code>
<code> </code><code>"{#FSNAME}"</code><code>:</code><code>"/dev"</code><code>,</code>
<code> </code><code>"{#FSTYPE}"</code><code>:</code><code>"devtmpfs"</code>
<code> </code><code>"{#FSNAME}"</code><code>:</code><code>"/dev/pts"</code><code>,</code>
<code> </code><code>"{#FSTYPE}"</code><code>:</code><code>"devpts"</code>
<code> </code><code>"{#FSNAME}"</code><code>:</code><code>"/dev/shm"</code><code>,</code>
<code> </code><code>"{#FSTYPE}"</code><code>:</code><code>"tmpfs"</code>
<code> </code><code>"{#FSTYPE}"</code><code>:</code><code>"ext4"</code>
<code> </code><code>"{#FSNAME}"</code><code>:</code><code>"/proc/bus/usb"</code><code>,</code>
<code> </code><code>"{#FSTYPE}"</code><code>:</code><code>"usbfs"</code>
<code> </code><code>"{#FSNAME}"</code><code>:</code><code>"/boot"</code><code>,</code>
<code> </code><code>"{#FSNAME}"</code><code>:</code><code>"/data"</code><code>,</code>
<code> </code><code>"{#FSNAME}"</code><code>:</code><code>"/proc/sys/fs/binfmt_misc"</code><code>,</code>
<code> </code><code>"{#FSTYPE}"</code><code>:</code><code>"binfmt_misc"</code>
<code> </code><code>}</code>
<code> </code><code>]</code>
<code>}</code>
然后通过在Discovery rule中配置的宏过滤规则(Filter Macro),把不需要监控的文件系统类型过滤掉,见下图。
<a href="http://s3.51cto.com/wyfs02/M00/44/52/wKiom1PgmASiAQ60AAG6zTObBA8466.jpg" target="_blank"></a>
上图是zabbix默认的配置,通过宏{#FSTYPE}和正则表达式“File systems for discovery”过滤文件系统类型。
<a href="http://s3.51cto.com/wyfs02/M01/44/53/wKioL1Pgmv7Q6SIrAACShme3-RY046.jpg" target="_blank"></a>
现在问题来了,如果我想同时根据{#FSNAME}这个宏过滤掉一些我不关心的文件系统,该怎么办?
分析问题:
zabbix在Discovery rule中只能过滤单个宏,不支持多宏过滤的写法,因此上述需求就无法实现了。
但是通过修改zabbix底层C代码,可以支持多宏过滤的。
规定参数写法:
Macro 多个宏变量之间用逗号分隔;
Regexp 正则表达式名前面加'@',多个表达式之间也用逗号分隔;
相同位置的宏变量和正则表达式是对应的,即第一个宏对应第一个正则表达式,第二个宏对应第二个正则表达式...
填写方式如下:
解决方法:
建议先在自己的测试环境中修改,测试成功后再应用到生产环境。
第一步,下载附件,改名为lld.c。如果你的zabbix版本是2.2.5,下载源码安装包,解压:
<code>shell</code><code># tar xvzf zabbix-2.2.5.tar.gz</code>
第二步,把上面下载的lld.c文件覆盖掉zabbix原始lld.c文件,zabbix2.2.2及以上版本可直接覆盖:
<code>shell</code><code># \cp lld.c zabbix-2.2.5/src/libs/zbxdbhigh/lld.c</code>
第三步,编译zabbix server:
<code>shell</code><code># cd zabbix-2.2.5</code>
<code>shell</code><code># ./configure --prefix=/etc/zabbix --with-mysql --with-net-snmp --with-libcurl --with-openipmi --with-ssh2 --enable-server</code>
<code>shell</code><code># make</code>
没有报错的话,编译成功~见下图
<a href="http://s3.51cto.com/wyfs02/M01/44/54/wKiom1Pgon-gQXg4AAKvS5VwzxY657.jpg" target="_blank"></a>
第四步,停掉zabbix server服务,备份zabbix_server主程序
<code>shell</code><code># /etc/init.d/zabbix-server stop</code>
<code>shell</code><code># cp /usr/sbin/zabbix_server /usr/sbin/zabbix_server.bak</code>
第五步,将编译好的zabbix_server覆盖原zabbix_server主程序,启动zabbix server服务
<code>shell</code><code># cp src/zabbix_server/zabbix_server /usr/sbin/zabbix_server</code>
<code>shell</code><code># /etc/init.d/zabbix-server start</code>
测试结果:
第一步:只过滤{#FSTYPE},配置Discovery rule如下:
<a href="http://s3.51cto.com/wyfs02/M01/44/55/wKiom1PgsfvAURxHAAHxRs__tAI739.jpg" target="_blank"></a>
监控间隔设置120秒,"Keep lost resources period"设置为0,方便观察结果。
"Filter Macro"填写"{#FSTYPE}";"Regexp"填写"@File systems for discovery"。
查看监控项组Filesystems下的监控项:
<a href="http://s3.51cto.com/wyfs02/M01/44/55/wKiom1PgswjgY9_gAAJo7WR_WtI038.jpg" target="_blank"></a>
第二步:同时过滤{#FSTYPE}和{#FSNAME},使{#FSNAME}过滤掉boot目录
先创建正则表达式"Filter file system name":
<a href="http://s3.51cto.com/wyfs02/M01/44/56/wKioL1PgtOuD4GeNAAKKX2EsB24463.jpg" target="_blank"></a>
配置Discovery rule:
<a href="http://s3.51cto.com/wyfs02/M01/44/55/wKiom1PgtO3wik67AAES2Rrw0t4439.jpg" target="_blank"></a>
"Filter Macro"填写"{#FSTYPE},{#FSNAME}";
"Regexp"填写"@File systems for discovery,@Filter file system name"。
注意:这里是英文的逗号','。
大约120秒后,查看监控项组Filesystems下的监控项:
<a href="http://s3.51cto.com/wyfs02/M00/44/56/wKioL1PgtlLzAQSYAAHqmFwDMUk213.jpg" target="_blank"></a>
发现boot目录已经被过滤掉了。测试完成。
=====================================================================================================
附:lld.c主要修改部分截图,右侧是优化后的,左侧是原版
<a href="http://s3.51cto.com/wyfs02/M02/44/55/wKiom1PguvzD1fdaAA7DtHubbpE997.jpg" target="_blank"></a>
<a href="http://down.51cto.com/data/2364720" target="_blank">附件:http://down.51cto.com/data/2364720</a>
本文转自 张斌_青岛 51CTO博客,原文链接:http://blog.51cto.com/qicheng0211/1536072