zabbix自定義自動發現模板
需求:
自定義發現磁碟io,並實現監控。其他的業務元件自動發現監控其實也和這個大同小異,自動發現主要邏輯就是你要根據元件規則自動匹配出需要監控的所有元件,再通過傳參的方式獲取對應元件資料。
自動發現無非分為幾個步驟:
寫一個指令碼獲取需要監控的系統資訊,如所有磁碟標識或者一些元件名稱等,指令碼輸出json格式到zabbix server,再寫一個指令碼根據傳參,獲取單獨磁碟監控資料。
1、被監控端編寫指令碼,輸出agent所有的磁碟json格式
vim /etc/zabbix/scripts/disk_discovery.sh #!/bin/bash diskarray=(`cat /proc/diskstats |grep -E "\bsd[abcdefg]\b|\bxvd[abcdefg]\b"|grep -i "\b$1\b"|awk '{print $3}'|sort|uniq 2>/dev/null`) length=${#diskarray[@]} printf "{\n" printf '\t'"\"data\":[" for ((i=0;i<$length;i++)) do printf '\n\t\t{' printf "\"{#DISK_NAME}\":\"${diskarray[$i]}\"}" if [ $i -lt $[$length-1] ];then printf ',' fi done printf "\n\t]\n" printf "}\n"
執行結果:這就獲取到了磁碟標識了
[root@YFSJZX scripts]# bash disk_discovery.sh
{
"data":[
{"{#DISK_NAME}":"sda"}
]
}
2、被監控端編寫指令碼獲取相關的io情況
vim disk_status.sh #/bin/sh device=$1 DISK=$2 case $DISK in read.ops) /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $4}' #//磁碟讀的次數 ;; read.ms) /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $7}' #//磁碟讀的毫秒數 ;; write.ops) /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $8}' #//磁碟寫的次數 ;; write.ms) /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $11}' #//磁碟寫的毫秒數 ;; io.active) /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $12}' #//I/O的當前進度, ;; read.sectors) /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $6}' #//讀扇區的次數(一個扇區的等於512B) ;; write.sectors) /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $10}' #//寫扇區的次數(一個扇區的等於512B) ;; io.ms) /bin/cat /proc/diskstats | grep "\b$device\b" | head -1 | awk '{print $13}' #//花費在IO操作上的毫秒數 ;; esac
3、在客戶端中的zabbix_agent.conf 中一起配置
UserParameter=disk.discovery,/etc/zabbix/scripts/disk_discovery.sh
UserParameter=disk.status[*],/etc/zabbix/scripts/disk_status.sh $1 $2
要注意的是以上兩個檔案需要給x 執行許可權。
重啟zabbix-agent
4、新增模板
首先建立一個新的模板,在新的模板裡面點選“探索發現”或者“自動發現”,版本不一樣名稱不一樣。
建立發現規則:
注意:不需要新增過濾器也可以,我添加了兩個定義獲取不到。取消或者只加一個的話就可以獲取。可以嘗試加過濾器,不行再取消看看。
5、新增監控項原型
按照上面的內容新增第一個寫扇區的次數監控,接下來按下面的內容新增共6個內容。
內容介紹
名稱: {#DISK_NAME}磁碟讀的次數
鍵值: disk.status[{#DISK_NAME},read.ops]
單位: ops/second
儲存值:差量(每秒速率)
名稱: {#DISK_NAME}磁碟寫的次數
鍵值: disk.status[{#DISK_NAME},write.ops]
單位: ops/second
儲存值:差量(每秒速率)
名稱: {#DISK_NAME}磁碟讀的毫秒數
鍵值: disk.status[{#DISK_NAME},read.ms]
單位: ms
儲存值:差量(每秒速率)
名稱: {#DISK_NAME}磁碟寫的毫秒數
鍵值: disk.status[{#DISK_NAME},write.ms]
單位: ms
儲存值:差量(每秒速率)
名稱: {#DISK_NAME}讀扇區的次數
鍵值: disk.status[{#DISK_NAME},read.sectors]
單位: B/sec
使用自定義倍數: 512
儲存值:差量(每秒速率)
名稱: {#DISK_NAME}寫扇區的次數
鍵值: disk.status[{#DISK_NAME},write.sectors]
單位: B/sec
使用自定義倍數: 512
儲存值:差量(每秒速率)
6、新增觸發器
觸發器名稱可以這麼定義:{#DISK_NAME}磁碟讀的次數,{#DISK_NAME}為第1步json格式輸出的值。
觸發之後是這樣樣子:{#DISK_NAME}會轉化成對應的值
7、新增圖形