1. 程式人生 > >zabbix應用之Low-level discovery監控磁碟IO

zabbix應用之Low-level discovery監控磁碟IO

轉自:http://www.tuicool.com/articles/fYjQ7j

zabbix自帶的“Template OS Linux”模板支援監控已掛載的磁碟空間利用率,是利用LLD(Low-level discovery)實現的,卻沒有對磁碟IO監控。本篇文章就介紹利用zabbix LLD功能監控磁碟IO的方法。

思路:首先建立Discovery rules,在agent端配置對應的UserParameter,呼叫編寫好的shell指令碼,動態查找出已經掛載的磁碟分割槽;然後建立Item prototypes,使用vfs.dev.read[device,<type>,<mode>]和vfs.dev.write[device,<type>,<mode>] 來監控磁碟分割槽的IO,包括磁碟讀寫速率、每秒讀寫扇區數、每秒讀寫運算元;然後建立Graph prototypes,生成磁碟IO圖表。

效果圖:

wKiom1SrfI7Ck94QAAVYlQSogRw530.jpg

wKioL1Srlk3jjHPpAALFZQoinzs867.jpg

wKiom1SrlZzShsciAALhGqG-xEc215.jpg

wKiom1SrlamSrDbtAAM4ADAbjhA423.jpg

下面給出具體監控步驟:

一、編寫指令碼查詢已掛載的磁碟分割槽

1)在zabbix客戶端建立查詢磁碟分割槽的指令碼 mount_disk_discovery.sh ,放到/etc/zabbix/monitor_scripts 目錄下,內容如下:

#!/bin/bash
#Function: low-level discovery mounted disk
#Script_name: mount_disk_discovery.sh 
mount_disk_discovery()
{
local regexp="\b(btrfs|ext2|ext3|ext4|jfs|reiser|xfs|ffs|ufs|jfs|jfs2|vxfs|hfs|ntfs|fat32|zfs)\b"
local tmpfile="/tmp/mounts.tmp" :> "$tmpfile" # 過濾所有已掛載的檔案系統 egrep "$regexp" /proc/mounts > "$tmpfile" local num=$(cat "$tmpfile" | wc -l) printf '{\n' printf '\t"data":[ ' while read line;do # 磁碟分割槽名稱 DEV_NAME=$(echo $line | awk '{print $1}') # 檔案系統名稱,即磁碟分割槽的掛載點 FS_NAME=$(echo $line | awk '{print $2}'
) # blockdev命令獲取扇區大小,用於計算磁碟讀寫速率 SEC_SIZE=$(sudo /sbin/blockdev --getss $DEV_NAME 2>/dev/null) printf '\n\t\t{' printf "\"{#DEV_NAME}\":\"${DEV_NAME}\"," printf "\"{#FS_NAME}\":\"${FS_NAME}\"," printf "\"{#SEC_SIZE}\":\"${SEC_SIZE}\"}" ((num--)) [ "$num" == 0 ] && break printf "," done < "$tmpfile" printf '\n\t]\n' printf '}\n' } case "$1" in mount_disk_discovery) "$1" ;; *) echo "Bad Parameter." echo "Usage: $0 mount_disk_discovery" exit 1 ;; esac

指令碼首先過濾 /proc/mounts 中的磁碟型別,然後輸出包含磁碟名稱、檔案系統名稱和扇區大小的Json資料。

2)設定相關檔案許可權:

touch /tmp/mounts.tmp
chown zabbix:zabbix /tmp/mounts.tmp
chown -R zabbix:zabbix /etc/zabbix/monitor_scripts
chmod 755 /etc/zabbix/monitor_scripts/mount_disk_discovery.sh

3)測試一下:

[root@localhost ~]# /etc/zabbix/monitor_scripts/mount_disk_discovery.sh mount_disk_discovery
{
    "data":[ 
        {"{#DEV_NAME}":"/dev/sda3","{#FS_NAME}":"/","{#SEC_SIZE}":"512"},
        {"{#DEV_NAME}":"/dev/sda1","{#FS_NAME}":"/boot","{#SEC_SIZE}":"512"}
    ]
}

上面的資料表示,磁碟分割槽/dev/sda3掛載到了根目錄,扇區大小為512B;/dev/sda1掛載到了/boot目錄,扇區大小為512B。

二、配置zabbix客戶端

1)編輯zabbix agent配置檔案,設定Include目錄:

Include=/etc/zabbix/zabbix_agentd.d/

agent啟動時會自動載入Include目錄下的配置檔案。

2)在/etc/zabbix/zabbix_agentd.d/目錄下建立 disk_lld.conf ,內容如下:

UserParameter=mount_disk_discovery,/bin/bash /etc/zabbix/monitor_scripts/mount_disk_discovery.sh mount_disk_discovery

表示:建立使用者自定義引數 mount_disk_discovery ,當zabbix server向agent請求這個item key時,agent會呼叫/etc/zabbix/monitor_scripts/mount_disk_discovery.sh指令碼,返回json資料。

3)由於zabbix agent的啟動使用者是zabbix,所以要授權zabbix使用者無密碼執行/sbin/blockdev命令。使用visudo命令,在/etc/sudoers裡註釋掉Defaults requiretty:

#Defaults requiretty

並在最後面加上:

zabbix ALL=(ALL)       NOPASSWD: /sbin/blockdev

這樣在腳本里執行類似“sudo /sbin/blockdev --getss /dev/sda1”這樣的指令就沒問題了。

4)最後重啟zabbix agent

/etc/init.d/zabbix-agent restart

5)測試一下:

我們從zabbix server上遠端get一下mount_disk_discovery

wKioL1SrmB2z2bO-AAEv3eBm9w0950.jpg

如上圖DEV_NAME、FS_NAME、SEC_SIZE都有值,說明客戶端配置正確。

三、配置zabbix前臺

1)登入zabbix前臺,選擇Configuration->Templates->Import,匯入“Template Linux DiskIO”模板(見附件)。

2)進入主機配置介面,連結“Template Linux DiskIO”模板

wKiom1SrlBeCKotjAAG5PXwjM6I328.jpg

至此,全部配置結束了,耐心等待監控資料的出現吧~

下面介紹下模板裡LLD的配置。

3)模板的Discovery rule介紹

Discovery rule的Key為 mount_disk_discovery ,對應zabbix agent配置裡的:

UserParameter=mount_disk_discovery,/bin/bash /etc/zabbix/monitor_scripts/mount_disk_discovery.sh mount_disk_discovery

每隔一段時間,server會向agent請求mount_disk_discovery,然後agent呼叫/etc/zabbix/monitor_scripts/mount_disk_discovery.sh指令碼,返回json資料給server。

wKioL1SroEPxQs8GAAGhMcWqqF4073.jpg

4)模板的Item prototypes介紹

wKiom1SrmFDDcxcEAAOermcg-TI132.jpg

其中Sectors和Operations的監控項都是Zabbix agent型別的。通過閱讀zabbix C原始碼,我們會發現 zabbix agent是根據/proc/diskstats檔案計算每秒Sectors和Operations,預設取一分鐘內的平均值 。有興趣的同學可以讀一讀src/libs/zbxsysinfo/linux/diskio.c。

磁碟讀寫speed監控項是Calculated型別的,通過每秒讀寫扇區數乘以扇區大小計算而來的,見下圖:

wKioL1Srmo-woHCfAALFbRDOYjU046.jpg

5)模板的Graph prototypes介紹

模板對每個磁碟分割槽都建立三個圖表,包括磁碟讀寫速率圖表、讀寫扇區數圖表、讀寫運算元圖表。

wKioL1SrmPzSlBOfAAIxIlfBAzQ692.jpg

附:客戶端一鍵配置指令碼

#!/bin/sh
#
# Filename:	autoMonitorDiskIO.sh
# Date:		2014/01/05
# Author:	  Qicheng
# Website:	 http://qicheng0211.blog.51cto.com/
# Description: 部署zabbix low-level discovery 監控磁碟IO
# Notes: 在被監控客戶端執行此指令碼,前提條件已經安裝好zabbix agent
#
ROOT_UID=0
if [ "$UID" -ne "$ROOT_UID" ];then
echo "Error: Please run this script as root user."
exit 1
fi
# 自行修改為你的zabbix agent配置檔案路徑
AGENT_CONF="/etc/zabbix/zabbix_agentd.conf"
mkdir -p /etc/zabbix/monitor_scripts
# 建立 low-level discovery mounted disk 指令碼
cat > /etc/zabbix/monitor_scripts/mount_disk_discovery.sh << 'EOF'
#!/bin/bash
#Function: low-level discovery mounted disk
#Script_name: mount_disk_discovery.sh 
mount_disk_discovery()
{
local regexp="\b(btrfs|ext2|ext3|ext4|jfs|reiser|xfs|ffs|ufs|jfs|jfs2|vxfs|hfs|ntfs|fat32|zfs)\b"
local tmpfile="/tmp/mounts.tmp"
:> "$tmpfile"
egrep "$regexp" /proc/mounts > "$tmpfile"
local num=$(cat "$tmpfile" | wc -l)
printf '{\n'
printf '\t"data":[ '
while read line;do
DEV_NAME=$(echo $line | awk '{print $1}')
FS_NAME=$(echo $line | awk '{print $2}')
SEC_SIZE=$(sudo /sbin/blockdev --getss $DEV_NAME 2>/dev/null)
printf '\n\t\t{'
printf "\"{#DEV_NAME}\":\"${DEV_NAME}\","
printf "\"{#FS_NAME}\":\"${FS_NAME}\","
printf "\"{#SEC_SIZE}\":\"${SEC_SIZE}\"}"
((num--))
[ "$num" == 0 ] && break
printf ","
done < "$tmpfile"
printf '\n\t]\n'
printf '}\n'
}
case "$1" in
mount_disk_discovery)
"$1"
;;
*)
echo "Bad Parameter."
echo "Usage: $0 mount_disk_discovery"
exit 1
;;
esac
EOF
touch /tmp/mounts.tmp
chown zabbix:zabbix /tmp/mounts.tmp
chown -R zabbix:zabbix /etc/zabbix/monitor_scripts
chmod 755 /etc/zabbix/monitor_scripts/mount_disk_discovery.sh
# 判斷配置檔案是否存在
[ -f "${AGENT_CONF}" ] || { echo "ERROR: File ${AGENT_CONF} does not exist.";exit 1;}
include=`grep '^Include' ${AGENT_CONF} | cut -d'=' -f2`
# 在配置檔案中新增自定義引數
if [ -d "$include" ];then
cat > $include/disk_lld.conf << 'EOF'
UserParameter=mount_disk_discovery,/bin/bash /etc/zabbix/monitor_scripts/mount_disk_discovery.sh mount_disk_discovery
EOF
else
grep -q '^UserParameter=mount_disk_discovery' ${AGENT_CONF} || cat >> ${AGENT_CONF} << 'EOF'
UserParameter=mount_disk_discovery,/bin/bash /etc/zabbix/monitor_scripts/mount_disk_discovery.sh mount_disk_discovery
EOF
fi
# 授權zabbix使用者無密碼執行/sbin/blockdev命令
chmod +w /etc/sudoers 
sed -i '/^Defaults\s\+requiretty/s/^/#/' /etc/sudoers
grep -q '^zabbix ALL=(ALL).*blockdev' /etc/sudoers || echo 'zabbix ALL=(ALL)	   NOPASSWD: /sbin/blockdev' >> /etc/sudoers
chmod 440 /etc/sudoers
# 重啟agent服務
[ -f '/etc/init.d/zabbix-agent' ] && /etc/init.d/zabbix-agent restart || echo "需手動重啟zabbix agent服務."

本文出自 “啟程的Linux部落格” 部落格,轉載請與作者聯絡!