由於最近項目上需要對服務器監控進行規范化監控,再磁盤這塊有幾種方式
1.如果每台設備的磁盤是一樣的 比如都有vda,vdb兩塊磁盤那么可以采用
1.1 每台客戶端寫腳本,服務端每台設備去加上監控項(------最次的手段-------------)
1.2 客戶端批量部署腳本,服務端直接把監控項部署到模板里面去。這樣所有使用了模板的設備都可以加上這個監控項目了 但是必須注意,這樣必須是所有設備磁盤都一樣的情況
2.如果每台設備的磁盤數目不一樣,就只能采用客戶端定義腳本,服務端單獨針對每台設備添加獨特的監控項
3.利用python 腳本添加(平庸選擇)
4.上面的方法都是不是那么智能化,其實zabbix為我們提供了一個自動發現規則(注意 不是設備的自動發現 ),再模板的下方自動發現規則:就是下圖這個東西
他能實現什么功能呢? 他提供一套發現與處理機制!!!!那么真多磁盤呢?他可以實現自動發現主機上面的磁盤,並且為每個磁盤加上監控項目,后續還可以自動為每個監控加圖形,告警等等 后話了。 那么怎么實現呢?就是zabbix提供的機制 +++ 個人的腳本 以下慢慢道來!!
一:為了實現我們的功能,我們第一步就是實現磁盤發現,也就是自動發現我們設備上又那么些磁盤(注意以下的操作都是以模板為單位的)
找到這個自動發現規則,點擊右邊的創建自動發現規則如下:
我們的名字可以隨便起,這里類型我們是zabbix客戶端 鍵值是什么呢?就是給后台傳遞的參數:完成的功能就是發現主機,這里得到的結果是個json格式的字符串。好了既然把這個參數io.scandisk傳遞到客戶端了,那么我們的客戶端怎么配置,完成什么功能呢?
我們直接看zabbix-agent的配置文件
這里面scandisk就是對應頁面配置的關鍵字 [*]里面就是傳遞的參數,由於頁面沒有傳遞,那么這里就沒有,后面的$1企業也沒用(保留是因為大家都這么寫。。。具體為啥我也不清楚)如果需要傳遞參數我們可以這么寫
頁面io.scandisk[1,2] 那么這里的1就是客戶端配置文件里面的$1了,同理2就是$2了.
好了,我們看到客戶端得到這個鍵后會執行一個python腳本,python腳本內容如下:
import subprocess import json args="cat /proc/diskstats|awk '{print $3}'|grep -E '^[a-z]+$'|sort|uniq 2>/dev/null" t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0] disks=[] for disk in t.split('\n'): if len(disk) != 0: disks.append({'{#DISK_NAME}':disk}) print json.dumps({'data':disks},indent=4,separators=(',',':'))
我們執行下腳本得到結果如下:
和上文我們提到的一樣返回的是一個json字符串!
每台設備不一樣。得到的結果也不一樣,獲取的是本機上的物理磁盤的名稱
好了,既然已經獲取到了磁盤的名字,我們接下來就會對每個磁盤的性能進行監控了,監控肯定也是在客戶端實現。首先我們把需要的內容輸出到一個文件里面
nohup iostat -m -x -d 30 > /tmp/iostat_output &
然后再配置文件里面田間配置
UserParameter=io.rps[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b"|tail -1|awk '{print $$4}' UserParameter=io.wps[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$5}' UserParameter=io.rMBps[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$6}' UserParameter=io.wMBps[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$7}' UserParameter=io.avgrq-sz[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$8}' UserParameter=io.avgqu-sz[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$9}' UserParameter=io.await[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$10}' UserParameter=io.svctm[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$11}' UserParameter=io.util[*],/usr/bin/tail /tmp/iostat_output |grep "\b$1\b" |tail -1|awk '{print $$12}'
這里面我們可以看到每行都有一個$1 那么這個$1是怎么來的呢?其實他就是代表磁盤的名字 所以我們頁面就需要配置監控項,把參數(磁盤滿傳遞過來)
我們回到頁面繼續配置
點擊創建監控項原型以io.avgqu-sz為例
名字隨便取最好加上$1這里的$1其實就是鍵值里面的io.avgqu-sz[{#DISK_NAME}]里面的#DISK_NAME 我們前面用自動發現不是發現了自己的磁盤么? 比如sdb和sda,zabbix會把這兩個磁盤循環傳遞到這里來作為DISK_NAME,那么你一定也想到了。客戶端里面的$1其實也是這個參數咯 ------------至於怎么實現,只有看源碼咯。。不必糾結 應用集我們新建一個DISK。然后點擊更新完成
至此我們只需等待然后到頁面去看數據就可以了。就完成了磁盤的自動發現以及指定項的監控。。后面的圖形,如果你理解了這里就是小菜一碟了。
我們重新再來理一遍 服務端配置 自動發現規則發現磁盤------>客戶端修改配置文件以及自定義腳本實現(返回json的格式)
服務端找到磁盤以后對把每個磁盤的名稱作為參數傳遞給監控項,監控項根據客戶端的配置文件以及腳本實現對應的數據返回。
另外需要注意的是 在監控項里面 有 print $$4 這種寫法。 需要注意的是 因為在zabbix里面$1..$N 其實是關鍵字代表的是前端傳遞過來的參數,所以自己的$1需要在前面加上一個$也是就$$1來區別!!!這個東西當時也是疑惑了很久