提出問題:
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