目录
一、简介
二、部署说明
2.1编写python程序进行获取mogno数据
2.2、上传python脚本至服务器,并测试通过
2.3、配置zabbix web页面,获取数据入库
2.4 、配置grafana展现数据,详细配置可参考我之前的grafana文章
网上有很多的zabbix监控mongodb的性能模版,但很少有调用获取mongo中的表数据的,因为公司需要做业务监控,所有就做了一下,基本思路是通过
1、python获取mongo表数据,python获取到数据后做逻辑计算
2、zabbix调用python获取数据入库,并配置触发器进行监控
3、grafana调用zabbix的api接口进行数据可视化展现
环境介绍:
服务器版本:centos7
python版本:3.6
zabbix版本:3.4.10
grafana版本 :4.6.3
mongodb版本:3.0 (集群) 被监控的表为
各个服务的搭建本文中就不介绍了,需要了解的同学可以去找我的zabbix系列文章,下面进行说明
先通过工具,查询下mongo数据,推介工具nosqlbooster for mongodb
mac的版本有需要的可以从这里下载:https://pan.baidu.com/s/13ypUT9LWEpisRoRICmNjPg
windows版本从这里下载:https://pan.baidu.com/s/1EU3Q4XudiCX57ZYIoszQtw
编写python脚本zabbixmongodb.py,脚本如下:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import json
import datetime
import time
import logging
import sys
import os
import subprocess
import pymongo
class zabbixmongodb:
#写入日志
def console_out(self,message,loglevel):
filenames=sys.path[0]+'/logs/zabbixmongodb.'+str(datetime.datetime.now().strftime("%Y%m%d"))+'.log'
# 这里进行判断,如果logger.handlers列表为空,则添加,否则,直接去写日志
logging.basicConfig(
level=logging.INFO, # 定义输出到文件的log级别,大于此级别的都被输出
format='%(asctime)s %(filename)s : %(levelname)s %(message)s', # 定义输出log的格式
datefmt='%Y-%m-%d %A %H:%M:%S', # 时间
filename=filenames, # log文件名
filemode='a') # 写入模式“w”或“a”
# 配置这一段是为了输出至屏幕
#console = logging.StreamHandler() # 定义console handler
#console.setLevel(logging.INFO) # 定义该handler级别
#formatter = logging.Formatter('%(asctime)s %(filename)s : %(levelname)s %(message)s') # 定义该handler格式
#console.setFormatter(formatter)
#logging.getLogger().addHandler(console) # 实例化添加handler
if(loglevel=='info'):
logging.info(message)
elif(loglevel=='error'):
logging.error(message)
else:
logging.info(message)
# 配置这一段是为了输出至屏幕
#输出完需要清理
#logging.getLogger().removeHandler(console)
def selmongodata(self):
#数据库环境
mongoenv="dev"
#客户编号
appCode=""
#场景
orderType=""
#供应商
channel=""
#业务
yewu=""
try:
mongoenv = sys.argv[1]
appCode = sys.argv[2]
orderType = sys.argv[3]
channel = sys.argv[4]
yewu = sys.argv[5]
except Exception as err:
loginfo='workcode:【'+workcode+'】,【---输入参数有误error---】【'+err+'】'
this.console_out(loginfo,'error')
print('error')
#终止任务
sys.exit(0)
mongoconf=""
if mongoenv=="dev":
mongoconf=DEV_MONGO_HOST
elif mongoenv=="stg":
mongoconf=STG_MONGO_HOST
elif mongoenv=="pro":
mongoconf=PRO_MONGO_HOST
else:
mongoconf=DEV_MONGO_HOST
myquery = { "appCode": appCode ,"orderType":orderType,"channel":channel}
loginfo='workcode:【'+workcode+'】,【---执行查询命令---】数据库环境:【'+mongoenv+'】,查询条件:【'+str(myquery)+'】'
this.console_out(loginfo,'info')
try:
myclient=pymongo.MongoClient(mongoconf)
mydb=myclient["boluome"]
mycol=mydb["data_statistics"]
s_str=mycol.find_one(myquery)
#print(type(s_str),type(s_str),s_str)
loginfo='workcode:【'+workcode+'】,【---执行查询命令---】,返回值:【'+str(s_str)+'】,查询条件:【'+str(myquery)+'】'
#{'_id': ObjectId('5bf64f5be4ba49123aef2cda'), --数据库uuid
# 'appCode': 'zjrcu', --客户编号
# 'orderType': 'waimai', --场景
# 'channel': 'eleb', --供应商
# 'updatedAt': 1544429100000, --更新时间戳
# 'orderCountNum': 128, --当天下单总量
# 'orderPayNum': 117, --当天支付订单量
# 'orderCancelNum': 11, --当天取消订单量
# 'orderTobePayNum':0, --当天待支付订单量
# 'date': '2018-12-10 16:05'} --数据更新时间
print(s_str[yewu])
this.console_out(loginfo,'info')
myclient.close()
except Exception as err:
loginfo='workcode:【'+workcode+'】,【---执行查询命令---】,返回值:【'+str(err)+'】,查询条件:【'+str(myquery)+'】'
this.console_out(loginfo,'error')
#若异常返回
print('error')
#生成配置文件
def setmongoconf(self,mongoconf):
myclient=pymongo.MongoClient(mongoconf)
mydb=myclient["boluome"]
mycol=mydb["data_statistics"]
s_str=mycol.find()
#print(type(s_str),type(s_str),s_str)
#{'_id': ObjectId('5bf64f5be4ba49123aef2cda'), --数据库uuid
# 'appCode': 'zjrcu', --客户编号
# 'orderType': 'waimai', --场景
# 'channel': 'eleb', --供应商
# 'updatedAt': 1544429100000, --更新时间戳
# 'orderCountNum': 128, --当天下单总量
# 'orderPayNum': 117, --当天支付订单量
# 'orderCancelNum': 11, --当天取消订单量
# 'orderTobePayNum':0, --当天待支付订单量
# 'date': '2018-12-10 16:05'} --数据更新时间
pythons="/etc/zabbix/qingyunsdk/zabbixmongodb.py"
huanjing="dev"
for x in s_str:
strs_orderCountNum="UserParameter=mongodata-"+huanjing+"-"+x["appCode"]+"-"+x["orderType"]+"-"+x["channel"]+"-orderCountNum,"+pythons+" "+huanjing+" "+x["appCode"]+" "+x["orderType"]+" "+x["channel"]+" orderCountNum"
strs_orderPayNum="UserParameter=mongodata-"+huanjing+"-"+x["appCode"]+"-"+x["orderType"]+"-"+x["channel"]+"-orderPayNum,"+pythons+" "+huanjing+" "+x["appCode"]+" "+x["orderType"]+" "+x["channel"]+" orderPayNum"
strs_orderCancelNum="UserParameter=mongodata-"+huanjing+"-"+x["appCode"]+"-"+x["orderType"]+"-"+x["channel"]+"-orderCancelNum,"+pythons+" "+huanjing+" "+x["appCode"]+" "+x["orderType"]+" "+x["channel"]+" orderCancelNum"
strs_orderTobePayNum="UserParameter=mongodata-"+huanjing+"-"+x["appCode"]+"-"+x["orderType"]+"-"+x["channel"]+"-orderTobePayNum,"+pythons+" "+huanjing+" "+x["appCode"]+" "+x["orderType"]+" "+x["channel"]+" orderTobePayNum"
print(strs_orderCountNum)
print(strs_orderPayNum)
print(strs_orderCancelNum)
print(strs_orderTobePayNum)
myclient.close()
if __name__ == '__main__':
#本次任务的编号
workcode=datetime.datetime.now().strftime("%Y%m%d%H%M%S.%f")
this=zabbixmongodb()
#数据连接参数说明
#配置说明
# authSource=admin 验证用、
# replicaSet=foba 副本集群模式,副本名称为foba;
# readPreference=secondaryPreferred 当主节点不能读取时候会自动切换至从节点读取 ,
# serverSelectionTimeoutMS=3 设置超时后重试3次,测试下来基本1秒左右。如果不加这个会一直重试,30秒结束
DEV_MONGO_HOST = 'mongodb://root:密码@192.168.0.7,192.168.0.10/?authSource=admin&replicaSet=foba&readPreference=secondaryPreferred&serverSelectionTimeoutMS=3'
STG_MONGO_HOST = 'mongodb://root:密码@192.168.2.3,192.168.2.4/?authSource=admin&replicaSet=foba&readPreference=secondaryPreferred'
PRO_MONGO_HOST = 'mongodb://root:密码@mongo-m.localdomain,mongo-s.localdomain,mongo-s2.localdomain/?authSource=admin&replicaSet=foba&readPreference=secondaryPreferred'
#生成配置文件,zabbix时候调用,执行python3 /Users/ll/Desktop/work/gogs/qingyunsdk/zabbixmongodb.py > /Users/ll/Desktop/work/gogs/qingyunsdk/dev-mongo.conf
#this.setmongoconf(DEV_MONGO_HOST)
#执行查询命令
this.selmongodata()
上传该zabbixmongodb.py程序至服务器,我是上传至zabbix-server所在服务器,其实这个可以上传任务服务器,上面的环境需要有python3和zabbix-agent
安装pyhton连接mongodb的插件pymongo
使用pip3 install pymongo
[root@i-pumjfiuu ~]# cd /etc/zabbix/
[root@i-pumjfiuu zabbix]# ls
qingyunsdk tcp_connections.sh zabbix_agentd.conf zabbix_agentd.conf.bak zabbix_agentd.d
[root@i-pumjfiuu zabbix]# cd qingyunsdk/
[root@i-pumjfiuu qingyunsdk]# ls
conf dev-mongo.conf logs qingyun.py setgiturl.py zabbixmongodb.py
[root@i-pumjfiuu qingyunsdk]# pwd
/etc/zabbix/qingyunsdk
[root@i-pumjfiuu qingyunsdk]#
#赋可执行权限
[root@i-pumjfiuu qingyunsdk]# chmod +x zabbixmongodb.py
测试脚本是否起作用
[root@i-pumjfiuu qingyunsdk]# ./zabbixmongodb.py dev hxb menpiao lvmama orderPayNum
0
[root@i-pumjfiuu qingyunsdk]# cd ..
[root@i-pumjfiuu zabbix]# ls
qingyunsdk tcp_connections.sh zabbix_agentd.conf zabbix_agentd.conf.bak zabbix_agentd.d
[root@i-pumjfiuu zabbix]# cd zabbix_agentd.d/
[root@i-pumjfiuu zabbix_agentd.d]# ls
dev-mongo.conf mongo.conf.bak
[root@i-pumjfiuu zabbix_agentd.d]#
编辑dev-mongo.conf,配置zabbix的监控项
比如我这边,添加以下内容,其中mongodata-dev-icbc-jiayouka-juhe-orderCountNum 就是zabbix的键值:
[root@i-pumjfiuu zabbix_agentd.d]# vim dev-mongo.conf
UserParameter=mongodata-dev-icbc-jiayouka-juhe-orderCountNum,/etc/zabbix/qingyunsdk/zabbixmongodb.py dev icbc jiayouka juhe orderCountNum
再编辑zabbix_agentd.conf文件
[root@i-pumjfiuu zabbix_agentd.d]# cd ..
[root@i-pumjfiuu zabbix]# vim zabbix_agentd.conf
添加以下三项:
#开启远程脚本执行权限
EnableRemoteCommands= 1
# zabbix的脚本配置读取目录地址
Include=/etc/zabbix/zabbix_agentd.d/*.conf
#脚本使用root权限执行
AllowRoot=1
执行重启命令使配置生效
[root@i-pumjfiuu zabbix]# service zabbix_agentd restart
然后使用zabbix_get命令测试刚配置的键值是否能正常获取数据
[root@i-pumjfiuu zabbix]# /usr/bin/zabbix_get -s 192.168.1.70 -p 10050 -k "mongodata-dev-icbc-jiayouka-juhe-orderCountNum"
ok,正常,如果这里报错就需要检查下zabbix的zabbix_agentd.conf和dev-mongo.conf 的配置
找到主机zabbix server,新建监控项,配置如下
设置键值:mongodata-dev-oklife-game-yizhong-orderCountNum
建立图形验证该键值是否能正常获取数据
ok,能获取数据