zabbix系列(十二) 监控MongoDB业务数据
目录
一、简介
二、部署说明
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系列文章,下面进行说明
二、部署说明
2.1编写python程序进行获取mogno数据
先通过工具,查询下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) # 实例化添加handlerif(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_HOSTelif mongoenv=="stg":mongoconf=STG_MONGO_HOSTelif mongoenv=="pro":mongoconf=PRO_MONGO_HOSTelse:mongoconf=DEV_MONGO_HOSTmyquery = { "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()
2.2、上传python脚本至服务器,并测试通过
上传该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 的配置
2.3、配置zabbix web页面,获取数据入库
找到主机zabbix server,新建监控项,配置如下
设置键值:mongodata-dev-oklife-game-yizhong-orderCountNum
建立图形验证该键值是否能正常获取数据
ok,能获取数据
2.4 、配置grafana展现数据,详细配置可参考我之前的grafana文章
zabbix系列(十二) 监控MongoDB业务数据相关推荐
- Spring cloud系列十二 监控Hystrix界面:Hystrix dashboard 和 Turbine
1. 概述 为了更好的监控Hystrix的性能,Spring Cloud提供Hystrix dashboard和Turbin来达到这个目的. Hystrix dashboard可以实时监控Hystri ...
- Alamofire源码解读系列(十二)之请求(Request)
本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...
- 轻松上云系列之二:其他云数据迁移至阿里云
2019独角兽企业重金招聘Python工程师标准>>> 本文档围绕如何将您其他云厂商上的数据迁移到阿里云,提供了多个场景的实践方案. 文档合集 AWS 数据迁移至阿里云 Amazon ...
- zabbix系列zabbix3.4监控mysql5.7
2019独角兽企业重金招聘Python工程师标准>>> zabbix系列zabbix3.4监控mysql5.7 yanconggod0人评论79662人阅读2018-01-31 16 ...
- MongoDB实战系列之二:MongoDB的常用操作
#以服务方式启动mongodb,要求验证 /elain/apps/mongodb/bin/mongod --fork --port 27001 --auth --dbpath /elain/data/ ...
- xen是服务器虚拟化,xen虚拟化实战系列(十二)之xen虚拟机高可用之在线迁移
xen虚拟化实战系列文章列表 xen虚拟化实战系列(十三)之xen虚拟机集中管理之convirt 1. 方案背景概述 本文是有对我们一个xen虚拟化生产环境将要改造的一个方案而来,在项目上线初期,没有 ...
- kotlin杂谈系列十二(Kotlin和Java的互操作)
Kotlin杂谈系列十二 这次就主要来谈谈kotlin和java互操作的问题 kotlin出来的使命就是为了解决java的模板问题和一些冗长的问题所以kotlin天生就很好的支持了java 所以我们在 ...
- Reflex WMS入门系列十二:Reflex里的Location
Reflex WMS入门系列十二:Reflex里的Location 玩过SAP系统里的人都知道,在SAP系统里库存管理分为IM Level和WM Level.IM Level的仓库,在SAP里被定义为 ...
- Highcharts翻译系列十二:gauge测量图
Highcharts翻译系列十二:gauge测量图 说明 测量图需要highcharts-more.js的支持 属性 参数 描述 默认值 animation 动画 true color 主要颜色或序列 ...
最新文章
- 教你简单解决过拟合问题(附公式)
- Python进阶之路 3.4.2 条件语句(if、else和elif)
- kubelet创建容器的步骤
- Vue 封装面包屑 (即粘即用)
- SAP Fiori elements第二次重复加载的问题
- 面试官:Redis 内存数据满了,会宕机吗?
- qt中树形控件QTreeWidget的项点击后获取该项的文本
- 信息学奥赛C++语言: 数字方阵
- 同一工作组无法访问_工作组、AD、域、DC...
- php公众号开发文档,微信公众平台的开发者文档
- 中兴新支点操作系统_中兴新支点系统预装测试
- springMVC实现图片打包下载
- 华为 M5680t对HGU ONU配置指导
- Python爬虫之js加密破解,抓取网易云音乐评论生成词云
- 2019小米java开发
- YottaChain数据加密的可靠性和安全性有多高?
- 谈 Linux,Windows 和 Mac -王银纠正对linux的看法
- 非常适合新手使用的吉他调音软件!
- NanoPi的网络配置
- 计算机专业有哪些好的国企,这十大专业在国企中最受欢迎,待遇高、前景好,有你吗...
热门文章
- dsp 28377s+w5500 通过tftp下载到dsp内部flash
- 宠物商店项目_充分利用宠物项目的7个技巧
- 旅游攻略(一)大理、双廊、剑川、丽江
- KMP算法讲解(next数组求解)
- wxWidgets 自绘窗口
- postgresql删除用户提示ERROR: role postgres1 cannot be dropped because some objects depend on it
- 蓝桥杯单片机省赛——第三届(“自动售水机”设计任务书)
- 诸多伟大发明证明——今天不是唯一的DT时代
- 基于STM32F103ZET6库函数PWM输出实验
- vue_vue-router二级路由