需求:
自定義發現磁盤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、添加圖形