指令碼內容
/etc/zabbix/zabbix-mongodb.sh:
#!/bin/bash
# @author: rby
# @description: 使用zabbix監控mongodb
MONGODB=${1-1}
MONGODB_BASEDIR_BIN="/usr/local/mongodb/mongodb-linux-x86_64-4.0.27/bin/"
MONGODB_ADDRESS="127.0.0.1"
if [ $MONGODB -eq 1 ];then # mongodb-01
MONGODB_PORT=57017
MONGODB_INSTANCE_ID=0
elif [ $MONGODB -eq 2 ];then # mongodb-02
MONGODB_PORT=57017
MONGODB_INSTANCE_ID=1
elif [ $MONGODB -eq 3 ];then # mongodb-03
MONGODB_PORT=57019
MONGODB_INSTANCE_ID=2
fi
MONGODB_USER="monitor"
MONGODB_PASSWORD="xxx"
MONGODB_AUTH_DATABASE="admin"
mongodbStatCache="/tmp/mongodbstat.$MONGODB"
mongodbRsStatusCache="/tmp/mongodb.rs.status.$MONGODB"
mongodbStat(){
# 使用mongostat和"echo rs.status()["members"]|mongo"命令獲取到副本集狀態和效能指標,將執行的結果快取到本地,每間隔10分鐘將重新整理一次快取,以提高效能!
if [ ! -e $mongodbStatCache ] || [[ -z $(cat $mongodbStatCache) ]] || [[ ! -z $(find $mongodbStatCache -mmin +10) ]];then
$MONGODB_BASEDIR_BIN/mongostat --host $MONGODB_ADDRESS --port $MONGODB_PORT -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase $MONGODB_AUTH_DATABASE -n 1 2>&1 > $mongodbStatCache
[ $? -ne 0 ]&& echo 0 && exit
fi
if [ ! -e $mongodbRsStatusCache ] || [[ -z $(cat $mongodbRsStatusCache) ]] || [[ ! -z $(find $mongodbRsStatusCache -mmin +10) ]];then
echo "rs.status()[\"members\"][$MONGODB_INSTANCE_ID]" |$MONGODB_BASEDIR_BIN/mongo --host $MONGODB_ADDRESS --port $MONGODB_PORT -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase $MONGODB_AUTH_DATABASE 2>&1 > $mongodbRsStatusCache
[ $? -ne 0 ]&& echo 0 && exit
fi
}
case $2 in
# 服務狀態
# active.status 服務存活狀態。!0表示存活,0表示未執行。valueType=integer
"active.status")
ss -alnupt |grep $MONGODB_PORT |wc -l
;;
# 副本集
# rs.member.name 成員名稱,這通常是IP:PORT。valueType=string
# rs.member.health 成員健康狀態。1表示健康,0表示不健康。valueType=integer
# rs.member.stateStr 成員身份。這通常是PRIMARY、SECONDARY、ARBITER、(not reachable/healthy)。valueType=string
# rs.member.lastHeartbeatMessage 成員最新的健康資訊。如果健康這通常是空的。valueType=string
# rs.member.uptime 成員執行時長。valueType=integer
"rs.member.name") #
mongodbStat
cat $mongodbRsStatusCache|grep 'name'|awk -F '"' '{print $4}'|tr -d "[:space:]"
;;
"rs.member.health")
mongodbStat
cat $mongodbRsStatusCache|grep 'health'|tr -dc '0-9'
;;
"rs.member.stateStr")
mongodbStat
cat $mongodbRsStatusCache |grep 'stateStr'|awk -F ':' '{print $2}'|tr -dc 'A-Z'
;;
"rs.member.lastHeartbeatMessage")
mongodbStat
cat $mongodbRsStatusCache |grep 'lastHeartbeatMessage'|awk -F ':' '{print $2}'|tr -d '\"'
;;
"rs.member.uptime")
mongodbStat
cat $mongodbRsStatusCache |grep 'uptime'|tr -dc '0-9'
;;
# 效能指標
# insert 每秒插入資料庫的物件數量。valueType=string
# query 每秒的查詢操作次數。valueType=string
# update 每秒的更新操作次數。valueType=string
# delete 每秒的刪除操作次數。valueType=string
# getmore 每秒查詢cursor(遊標)時的getmore運算元。valueType=integer
# command 每秒執行的命令數。valueType=string
# dirty 髒資料位元組的快取百分比。valueType=string
# used 正在使用中的快取百分比。valueType=string
# flushes 每秒執行fsync將資料寫入硬碟的次數。valueType=integer
# vsize 虛擬記憶體使用量,單位MB。valueType=string
# res 實體記憶體使用量,單位MB。valueType=string
# qrw 客戶端等待從MongoDB例項讀和寫資料的佇列長度。valueType=string
# arw 執行讀/寫操作的活躍客戶端數量。valueType=string
# net_in 網路進流量。valueType=string
# net_out 網路出流量。valueType=string
# set 所屬副本集。valueType=string
# repl 副本集中身份。valueType=string
# conn 開啟連線的總數。valueType=integer
# time 系統時間。valueType=string
"insert")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $1}'
;;
"query")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $2}'
;;
"update")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $3}'
;;
"delete")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $4}'
;;
"getmore")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $5}'
;;
"command")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $6}'
;;
"dirty")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $7}'
;;
"used")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $8}'
;;
"flushes")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $9}'
;;
"vsize")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $10}'
;;
"res")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $11}'
;;
"qrw")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $12}'
;;
"arw")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $13}'
;;
"net_in")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $14}'
;;
"net_out")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $15}'
;;
"conn")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $16}'
;;
"set")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $17}'
;;
"repl")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $18}'
;;
"time")
mongodbStat
cat $mongodbStatCache |awk 'NR==2{print $19" "$20" "$21}'
;;
esac
指令碼好處
資料說明一切!
使用本指令碼獲取mongodb的一個監控項的資料大約僅需要8ms,本指令碼共計支援監控項共25個,即8*25=200ms!
zabbix@mongodb-01:/etc/zabbix$ time bash zabbix-mongodb.sh 1 active.status
1
real 0m0.005s
user 0m0.000s
sys 0m0.000s
zabbix@mongodb-01:/etc/zabbix$ time bash zabbix-mongodb.sh 1 rs.member.health
1
real 0m0.007s
user 0m0.000s
sys 0m0.000s
zabbix@mongodb-01:/etc/zabbix$ time bash zabbix-mongodb.sh 1 command
14|0
real 0m0.007s
user 0m0.000s
sys 0m0.000s
Zabbix自定義監控項
/etc/zabbix/zabbix_agentd.d/userparameter_mongodb.conf:
UserParameter=mongodb[*],HOME=/etc/zabbix;bash /etc/zabbix/zabbix-mongodb.sh $1 $2