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

zabbix系列(十二) 监控MongoDB业务数据_第1张图片

编写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()

 
      


  

  
  

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

zabbix系列(十二) 监控MongoDB业务数据_第2张图片

建立图形验证该键值是否能正常获取数据

zabbix系列(十二) 监控MongoDB业务数据_第3张图片

ok,能获取数据

2.4 、配置grafana展现数据,详细配置可参考我之前的grafana文章

zabbix系列(十二) 监控MongoDB业务数据_第4张图片

你可能感兴趣的:(zabbix,python,mongodb,grafana,运维的一点心得)