1. 程式人生 > >skill——zbbix(低級別發現 與 zabbix 自定義監控項)

skill——zbbix(低級別發現 與 zabbix 自定義監控項)

低級別發現Low-level discovery(LLD)

在對主機的監控中,可能出現這樣的情況,例如對某主機網絡卡eth0進行監控,可以指定需要監控的網絡卡是 eth0,而將網絡卡作為一個通用監控項時,根據主機作業系統的不同,網絡卡的名稱也不完全相同,有些作業系統的網絡卡名稱是 eth 開頭的,而有些網絡卡名稱是 em、enps0、ens 開頭的,遇到這種情況,如果分別針對不同的網絡卡名設定不同的監控項,那就太繁瑣了,此時使用 zabbix 的低階發現功能就可以解決這個問題

在 Zabbix 中,支援幾種現成的型別的資料項發現,分別是:

1.檔案系統發現

2.網路介面發現

3.SNMP OID 發現

4.CPU 核和狀態

下面是 zabbix 自帶的 LLD key

1.vfs.fs.discovery              #適用於zabbix agent監控方式

2.snmp.discovery             #SNMP agent監控方式

3.net.if.discovery              #適用於zabbix agent監控方式

4.system.cpu.discovery    #適用於zabbix agent監控方式

可以用 zabbix-get 來檢視 key 獲取的資料,對於 snmp 不能通過 zabbix-get 來驗證,只能在 web 頁面中進行配置使用

下面是一個 zabbix-get 的例子:

blob.png

其中,{#IFNAME} 就是一個巨集變數,會返回系統中所有網絡卡的名字。巨集變數可以定義在主機、模板以及全域性,巨集變數都是大寫的。使用巨集變數,可以使 zabbix 功能更加強大

在自動發現中使用zabbix自帶的巨集,固定的語法格式為:{#MACRO}

zabbix還支援使用者自定義的巨集,這些自定義的巨集也有特定的語法:{$MACRO}

在 LLD 中,常用的內建巨集有 {#FSNAME}, {#FSTYPE}, {#IFNAME}, {#SNMPINDEX}, {#SNMPVALUE} 等

{#FSNAME}:表示檔案系統名稱

{#FSTYPE}:表示檔案系統型別

{#IFNAME}:表示網絡卡名稱

{#SNMPINDEX}:會獲取 OID 中最後一個值

{#SNMPVALUE}:從返回的值中過濾掉 loopback 介面

巨集的級別有多種:其優先順序由高到低順序如下:

1.主機級別的巨集優先順序最高

2.第一級模式中的巨集

3.第二季模式中的巨集

4.全域性級別的巨集

因此,zabbix 查詢巨集的順序為:首選查詢主機級別的巨集,如果在主機級別不存在巨集設定,那麼 zabbix 就會去模板中看是否設定有巨集;如果模板中也沒有,將會查詢使用全域性的巨集;若是在各級別都沒找到巨集,那麼將不使用巨集

zabbix 自定義監控項

有時候當我們監控的專案在 zabbix 預定義的key中沒有定義時,這時候我們可以通過編寫 zabbix 的使用者引數的方法來監控我們要求的專案 item。形象一點說 zabbix 代理端配置檔案中的 User parameters 就相當於通過指令碼獲取要監控的值,然後把相關的指令碼或者命令寫入到配置檔案中的 User parameter 中,然後 zabbix server 讀取配置檔案中的返回值通過處理前端的方式返回給使用者

1、zabbix agent 端開啟 Userparameter 指令

UnsafeUserParameters=1

啟用 agent 端自定義 item 功能,設定此引數為1後,就可以使用 UserParameter 指令了


UserParameter用於自定義itme。語法格式為:

UserParameter=<key>,<command>

其中:

UserParameter為關鍵字

key為使用者自定義key名字可以隨便起

<command>為我們要執行的命令或者指令碼。

一個簡單的例子:

UserParameter=ping,echo 1

代理程式程式將會永遠的返回 1 當我們在伺服器端新增 item 的 key 為 ping 的時候

稍微複雜的例子:

UserParameter=mysql.ping, /usr/local/mysql/bin/mysqladmin ping|grep -c alive

當我們執行 mysqladmin -uroot ping 命令的時候如果 mysq 存活要返回 mysqld is alive,我們通過 grep–c 來計算 mysqld is alive 的個數,如果 mysql 存活著,則個數為 1,如果不存活很,明顯 mysqld is alive 的個數為 0,通過這種方法我們可以來判斷 mysql 的存活狀態。

當我們在伺服器端新增 item 的 key 為 mysql.ping 時候,對於 zabbix 代理程式,如果 mysql 存活,則狀態將返回 1,否則,狀態將返回 0

2、讓 key 接受引數

讓 key 也接受引數的方法使 item 新增時更具備了靈活性

例如,系統預定義 key :

vm.memory.size[<mode>]

其中的 mode 模式就是使用者要接受的引數,當我們填寫為 free 時則返回的為記憶體的剩餘大小,如果我們填入的為 userd 時返回的是記憶體已經使用的大小

相關語法如下:

UserParameter=key[*],command

其中,Key 的值在主機系統中必須是唯一的,其中 * 代表命令中接受的引數,command 表示命令,也就是客戶端系統中可執行的命令

例如:

UserParameter=ping[*].echo $1

如果執行ping[0],那麼將一直返回 '0',如果執行ping[aaa],將一直返回 'aaa'