在有些情况下,只能使用远程的MongoDB实例而不能登录到MongoDB实例所在的服务器上,这时可以在一台服务器上维护一个远程MongoDB实例的主机和端口列表,然后通过z

在有些情况下,只能使用远程的MongoDB实例而不能登录到MongoDB实例所在的服务器上,这时可以在一台服务器上维护一个远程MongoDB实例的主机和端口列表,,然后通过zabbix的低级发现功能去根据主机和端口自动添加相应的监控。


  • MongoDB主机和端口发现脚步mongodb_discovery.py

    主机和端口列表文件mongodb_servers.txt,文件中存放每个实例的主机,端口信息


  • 10.4.9.112:28018:root:xxxx10.4.9.2:27017:root10.4.9.3:28018#/usr/bin/python#This script is used to discovery disk on the serverimport subprocessimport jsonargs='''awk -F':' '{print $1":"$2}' /usr/local/zabbix/bin/mongodb_servers.txt'''t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0]mongodbs=[]for mongo in t.split('\n'): if len(mongo) != 0: mongodbs.append({'{#MONGO_HOST}':mongo})print json.dumps({'data':mongodbs},indent=4,separators=(',',':'))


    显示结果:

    { "data":[ { "{#MONGO_HOST}":"192.168.5.7:30000" }, { "{#MONGO_HOST}":"192.168.5.7:30001" }, { "{#MONGO_HOST}":"192.168.5.23:30002" }, { "{#MONGO_HOST}":"192.168.5.23:30003" } ]}



    2.获取MongoDB端口状态信息脚本discovery_mongodb_status.sh

    这里会根据{#MONGO_HOST}传来的值在mongodb_servers.txt文件中找到相应的行,并以冒号 “:” 判断整行的长度,然后使用不同的mongodb连接方式

    #This script is used to get discovered mongodb servers status#echo "db.serverStatus().uptime"|mongo 192.168.5.23:30002/admin -uroot -pxxxx#echo "db.serverStatus().mem.mapped"|mongo 192.168.5.23:30002/admin -uroot -pxxx#echo "db.serverStatus().globalLock.activeClients.total"|mongo 192.168.5.23:30002/admin -uroot -pxxx# Macro {#MONGO_INFO} "HOSTNAME:PORT:USERNAME:PASSWORD"#sh discovery_mongodb_status.sh uptime {#MONGO_HOST} #sh discovery_mongodb_status.sh mem mapped {#MONGO_HOST} #sh discovery_mongodb_status.sh globalLock activeClients total {#MONGO_HOST} #one more parametermongo_info=""command_line=""function check_mongo_info() { num=$(echo $mongo_info|awk -F":" '{print NF}') host=$(echo $mongo_info|awk -F":" '{print $1}') port=$(echo $mongo_info|awk -F":" '{print $2}') username=$(echo $mongo_info|awk -F":" '{print $3}') password=$(echo $mongo_info|awk -F":" '{print $4}') case $num in 2) command_line="/data/app_platform/mongodb/bin/mongo $host:$port/admin" ;; 3) command_line="/data/app_platform/mongodb/bin/mongo $host:$port/admin -u$username -p''" ;; 4) command_line="/data/app_platform/mongodb/bin/mongo $host:$port/admin -u$username -p$password" ;; esac }case $# in 2) mongo_info=$(grep $2 /usr/local/zabbix/bin/mongodb_servers.txt) check_mongo_info output=$(/bin/echo "db.serverStatus().$1" |$command_line|sed -n '3p') ;; 3) mongo_info=$(grep $3 /usr/local/zabbix/bin/mongodb_servers.txt) check_mongo_info output=$(/bin/echo "db.serverStatus().$1.$2" |$command_line|sed -n '3p') ;; 4) mongo_info=$(grep $4 /usr/local/zabbix/bin/mongodb_servers.txt) check_mongo_info output=$(/bin/echo "db.serverStatus().$1.$2.$3" |$command_line|sed -n '3p') ;;esac#check if the output contains "NumberLong"if [[ "$output" =~ "NumberLong" ]];then echo $output|sed -n 's/NumberLong(//p'|sed -n 's/)//p'else echo $outputfi


    09-14 08:55