zabbix-mongodb監控指令碼(高效能、低佔用)

Ren發表於2022-01-27
Zabbix呼叫指令碼以實現對MongoDB的監控! 本指令碼支援對服務存活狀態、副本集、效能指標共計25個監控項! 使用mongostat和"echo rs.status()["members"][<成員ID>]|mongo"命令獲取到副本集狀態和效能指標,將執行的結果快取到本地,每間隔10分鐘將重新整理一次快取! 指令碼內各項通過查詢快取以獲取監控項的值,高效且佔用資源低,監控項資料的獲取不會給主機帶來太多的資源消耗!一次監控項的查詢僅約需8ms!

指令碼內容

/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


相關文章