zabbix-mongodb监控脚本(高性能、低占用)
Zabbix调用脚本以实现对MongoDB的监控! 本脚本支持对服务存活状态、副本集、性能指标共计25个监控项! 使用mongostat和"echo rs.status()["members"][<成员ID>]|mongo"命令获取到副本集状态和性能指标,将执行的结果缓存到本地,每间隔10分钟将刷新一次缓存! 脚本内各项通过查询缓存以获取监控项的值,高效且占用资源低,监控项数据的获取不会给主机带来太多的资源消耗!一次监控项的查询仅约需8ms!
脚本内容
/etc/zabbix/zabbix-mongodb.sh:
#!/bin/bash# @author: rby# @description: 使用zabbix监控mongodbMONGODB=${1-1}MONGODB_ADDRESS="127.0.0.1"if [ $MONGODB -eq 1 ];then # mongodb-01 MONGODB_PORT=57017 MONGODB_INSTANCE_ID=0elif [ $MONGODB -eq 2 ];then # mongodb-02 MONGODB_PORT=57017 MONGODB_INSTANCE_ID=1elif [ $MONGODB -eq 3 ];then # mongodb-03 MONGODB_PORT=57019 MONGODB_INSTANCE_ID=2fiMONGODB_USER="monitor"MONGODB_PASSWORD="xxx"MONGODB_AUTH_DATABASE="admin"mongodbStatCache="mongodbstat.$MONGODB"mongodbRsStatusCache="mongodb.rs.status.$MONGODB"mongodbStat(){# 使用mongostat和"echo rs.status()["member"]|mongo"命令获取到副本集状态和性能指标,将执行的结果缓存到本地,每间隔10分钟将刷新一次缓存,以提高性能!if [ ! -e $mongodbStatCache ] || [[ -z $(cat $mongodbStatCache) ]] || [[ ! -z $(find $mongodbStatCache -mmin +10) ]];then 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 && exitfiif [ ! -e $mongodbRsStatusCache ] || [[ -z $(cat $mongodbRsStatusCache) ]] || [[ ! -z $(find $mongodbRsStatusCache -mmin +10) ]];then echo "rs.status()[\"members\"][$MONGODB_INSTANCE_ID]" |mongo --host $MONGODB_ADDRESS --port $MONGODB_PORT -u $MONGODB_USER -p $MONGODB_PASSWORD --authenticationDatabase $MONGODB_AUTH_DATABASE 2>&1 > $mongodbRsStatusCache [ $? -ne 0 ]&& echo 0 && exitfi}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自定义监控项
userparameter_mongodb.conf:
UserParameter=mongodb[*],bash /etc/zabbix/zabbix-mongodb.sh $1 $2