目录

一、简介

二、部署说明

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业务数据相关推荐

  1. Spring cloud系列十二 监控Hystrix界面:Hystrix dashboard 和 Turbine

    1. 概述 为了更好的监控Hystrix的性能,Spring Cloud提供Hystrix dashboard和Turbin来达到这个目的. Hystrix dashboard可以实时监控Hystri ...

  2. Alamofire源码解读系列(十二)之请求(Request)

    本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...

  3. 轻松上云系列之二:其他云数据迁移至阿里云

    2019独角兽企业重金招聘Python工程师标准>>> 本文档围绕如何将您其他云厂商上的数据迁移到阿里云,提供了多个场景的实践方案. 文档合集 AWS 数据迁移至阿里云 Amazon ...

  4. zabbix系列zabbix3.4监控mysql5.7

    2019独角兽企业重金招聘Python工程师标准>>> zabbix系列zabbix3.4监控mysql5.7 yanconggod0人评论79662人阅读2018-01-31 16 ...

  5. MongoDB实战系列之二:MongoDB的常用操作

    #以服务方式启动mongodb,要求验证 /elain/apps/mongodb/bin/mongod --fork --port 27001 --auth --dbpath /elain/data/ ...

  6. xen是服务器虚拟化,xen虚拟化实战系列(十二)之xen虚拟机高可用之在线迁移

    xen虚拟化实战系列文章列表 xen虚拟化实战系列(十三)之xen虚拟机集中管理之convirt 1. 方案背景概述 本文是有对我们一个xen虚拟化生产环境将要改造的一个方案而来,在项目上线初期,没有 ...

  7. kotlin杂谈系列十二(Kotlin和Java的互操作)

    Kotlin杂谈系列十二 这次就主要来谈谈kotlin和java互操作的问题 kotlin出来的使命就是为了解决java的模板问题和一些冗长的问题所以kotlin天生就很好的支持了java 所以我们在 ...

  8. Reflex WMS入门系列十二:Reflex里的Location

    Reflex WMS入门系列十二:Reflex里的Location 玩过SAP系统里的人都知道,在SAP系统里库存管理分为IM Level和WM Level.IM Level的仓库,在SAP里被定义为 ...

  9. Highcharts翻译系列十二:gauge测量图

    Highcharts翻译系列十二:gauge测量图 说明 测量图需要highcharts-more.js的支持 属性 参数 描述 默认值 animation 动画 true color 主要颜色或序列 ...

最新文章

  1. 教你简单解决过拟合问题(附公式)
  2. Python进阶之路 3.4.2 条件语句(if、else和elif)
  3. kubelet创建容器的步骤
  4. Vue 封装面包屑 (即粘即用)
  5. SAP Fiori elements第二次重复加载的问题
  6. 面试官:Redis 内存数据满了,会宕机吗?
  7. qt中树形控件QTreeWidget的项点击后获取该项的文本
  8. 信息学奥赛C++语言: 数字方阵
  9. 同一工作组无法访问_工作组、AD、域、DC...
  10. php公众号开发文档,微信公众平台的开发者文档
  11. 中兴新支点操作系统_中兴新支点系统预装测试
  12. springMVC实现图片打包下载
  13. 华为 M5680t对HGU ONU配置指导
  14. Python爬虫之js加密破解,抓取网易云音乐评论生成词云
  15. 2019小米java开发
  16. YottaChain数据加密的可靠性和安全性有多高?
  17. 谈 Linux,Windows 和 Mac -王银纠正对linux的看法
  18. 非常适合新手使用的吉他调音软件!
  19. NanoPi的网络配置
  20. 计算机专业有哪些好的国企,这十大专业在国企中最受欢迎,待遇高、前景好,有你吗...

热门文章

  1. dsp 28377s+w5500 通过tftp下载到dsp内部flash
  2. 宠物商店项目_充分利用宠物项目的7个技巧
  3. 旅游攻略(一)大理、双廊、剑川、丽江
  4. KMP算法讲解(next数组求解)
  5. wxWidgets 自绘窗口
  6. postgresql删除用户提示ERROR: role postgres1 cannot be dropped because some objects depend on it
  7. 蓝桥杯单片机省赛——第三届(“自动售水机”设计任务书)
  8. 诸多伟大发明证明——今天不是唯一的DT时代
  9. 基于STM32F103ZET6库函数PWM输出实验
  10. vue_vue-router二级路由