mongodb+python 实现自动收集mongodb的慢查询日志(附代码)

  1  简介 

这个是用在生产环境中的一个MongoDB慢查询日志自动收集脚本,当初想写这个脚本的思路就是为了方便收集慢查询日志并且利于分析。由于公司的mognodb不多,就4台,所以这个小脚本也只是适用普通的生产环境。

页面主要使用了 bootstrap 为前端显示,datatable 为分析的时候使用。

  2  流程

主要的流程是:

1  通过 pymongo 连接到 mongodb

2  使用find()命令查询 system.profile下的所有慢查询日志

3  使用jinjia2模块,把查询到的日志信息整合到一个HTML模版中去。

4  把整合后的HTML文件,以附件的形式发送邮件给本人(使用sendmail模块)

5  将脚本写到 crontab 中去,每天定时发送邮件。

注意: 前提是要开启慢查询日志,开启方法见:http://yucanghai.blog.51cto.com/5260262/1705195

 3  代码

3.1  文件结构

config.py   # 配置文件
mongodb_slowlog.html  #生成的html文件
mongodb_slowlog.py  # 主文件
myhtml.py  # html模块

3.2  代码信息

1  config.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
mail_to_list = [‘[email protected]‘]  #收件人列表
mail_host = ‘smtp.163.com‘
mail_user = ‘xxx‘ #发件人用户
mail_pass = ‘xxx‘
mail_postfix = ‘163.com‘
#mongodb 的用户和密码
usename = ‘root‘
password = ‘xxx‘
# db 为要分析的 数据库
ip_db_list = [
    {‘ip‘:‘10.18.96.86‘,‘port‘:27017,‘db‘:‘test‘,‘hostname‘:‘test1‘,‘property‘:‘primary‘,‘slow_log‘:[]},
]

2 mongodb_slowlog.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pymongo
import bson
from jinja2 import Template
from myhtml import html_str
import config
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import time
import datetime

def _conn(ip,port):
    try:
        conn = pymongo.MongoClient(‘%s‘%ip,port)
    except Exception,e:
        conn = None
        print e
    return conn
#将系统时间转化为 mongodb能识别的时间
def convert_time(t):
    tm = bson.Timestamp(t,1)
    return tm.as_datetime()
#发送邮件 -- 有附件
def send_mail():
    msg = MIMEMultipart()
    att = MIMEText(open(‘mongodb_slowlog.html‘,‘rb‘).read(),‘base64‘,‘gb2312‘)
    att[‘Content-Type‘] = ‘application/octet-stream‘
    att["Content-Disposition"] = ‘attachment; filename="MongoDB-Slow-Log%s.html"‘%time.strftime(‘%Y-%m-%d %H:%M:%S‘)
    msg.attach(att)
    me = ‘MongoDB‘+‘<‘+config.mail_user+"@"+config.mail_postfix+">"
    msg[‘Subject‘] = ‘MongoDB Slow Log -- %s‘%time.strftime(‘%Y-%m-%d %H:%M:%S‘)
    msg[‘From‘] = me
    msg[‘To‘] = ‘;‘.join(config.mail_to_list)
    try:
        server = smtplib.SMTP()
        server.connect(config.mail_host)
        server.login(config.mail_user,config.mail_pass)
        server.sendmail(me,config.mail_to_list,msg.as_string())
        server.quit()
        return True
    except Exception,e:
        print e
        return False
#获取慢日志信息
def profile_info(today,yesterday):
    for ip_db in config.ip_db_list:
        conn = _conn(ip_db[‘ip‘],ip_db[‘port‘])
        #用户验证
        #auth_db = conn.admin
        #auth_db.authenticate(config.usename,config.password)
        db_conn = getattr(conn,ip_db[‘db‘])
        if  db_conn.profiling_level():
            #获取 一天内的 排除 getmore 和 comadn 后的 慢日志
            ip_db[‘slow_log‘].append(list(db_conn.system.profile.find({‘ts‘:{"$lt":today,"$gt":yesterday}, "op":{"$nin":[‘getmore‘,‘command‘]}})))
        #print  ip_db[‘slow_log‘]
        #解析获取到的日志到 html中
        template = Template(html_str)
        rest_html = template.render(db_info = ip_db)
        #print  rest_html
        #将获取到的html 写如文件,作为附件发送给 用户
        with open(‘mongodb_slowlog.html‘,‘w‘) as f:
            f.write(rest_html)
        print  ‘发送成功!‘ if send_mail() else ‘发送失败!‘
if __name__ == ‘__main__‘:
    today_time =  convert_time(datetime.datetime.today())
    yesterday_time = convert_time(today_time + datetime.timedelta(days=-1))
    profile_info(today_time,yesterday_time)

备注:

可以根据自己的需求更改,思路不变

3  myhtml.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
html_str =‘‘‘
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <meta name="description" content="">
    <meta name="author" content="">
    <title>MongoDB Slow Log</title>
    <!-- Bootstrap core CSS -->
    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
    <link rel="stylesheet" href="http://cdn.datatables.net/1.10.9/css/jquery.dataTables.min.css">
    <!--[endif]-->
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container-fluid">
        <div class="navbar-header">
            <a class="navbar-brand" href="#">MongoDB Slow Log</a>
        </div>
    </div>
</nav>
<div class="container-fluid">
    <div class="row">
        <div class="col-sm-9 col-sm-offset-1 col-md-10 col-md-offset-1 main">
            <br><br><br><br>
            <h4 class="page-header" style="display: inline">IP:{{ db_info.ip }}</h4>&nbsp;&nbsp;
            <h4 class="page-header" style="display: inline">HostName:{{ db_info.hostname }}</h4>&nbsp;&nbsp;
            <h4 class="page-header" style="display: inline">Property:{{ db_info.property }}</h4>
            <br><br>
            <div class="table-responsive">
                <table id="myTable" class="table table-striped">
                    <thead>
                    <tr>
                        <th>ID</th>
                        <th>Namespace</th>
                        <th>Option</th>
                        <th>Query</th>
                        <th>Millis</th>
                        <th>Nscanned</th>
                        <th>Nreturned</th>
                        <th>ResponseLength</th>
                        <th>Ts</th>
                    </tr>
                    </thead>
                    <tbody>
                    {% for item in db_info.slow_log %}
                    {% for i in item %}
                    <tr>
                        <td>{{ loop.index }}</td>
                        <td>{{ i.ns }}</td>
                        <td>{{ i.op }}</td>
                        <td>{{ i.query }}</td>
                        <td>{{ i.millis }}</td>
                        <td>{{ i.nscanned }}</td>
                        <td>{{ i.nreturned }}</td>
                        <td>{{ i.responseLength }}</td>
                        <td>{{ i.ts }}</td>
                    </tr>
                    {% endfor %}
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</div>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<script src="http://cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script src="http://cdn.datatables.net/1.10.9/js/jquery.dataTables.min.js"></script>
<script type="text/javascript">
    $(‘#myTable‘).DataTable( {
        select: true
    } );
</script>
</body>
</html>
‘‘‘

4  mongodb_slowlog.html

主要为通过 myhtml.py 生成的模版

这个脚本写的比较匆忙,还有不完善的地方,有什么疑问大家都可以来问我呀

时间: 2024-12-15 06:49:23

mongodb+python 实现自动收集mongodb的慢查询日志(附代码)的相关文章

Python之简单的SMTP发送邮件详细教程附代码

  简介 Python发送邮件的教程本人在网站搜索的时候搜索出来了一大堆,但是都是说了一大堆原理然后就推出了实现代码,我测试用给出的代码进行发送邮件时都不成功,后面找了很久才找到原因,这都是没有一个详细的环境调试导致,所以今天特出一个详细的教程,一步一步从环境调试到代码实现整一个教程,希望对还在苦苦寻找解决方法却迟迟不能得到有效解决的人员一点帮助.   SMTP协议 首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器.SMTP协议只能用来发送邮件

Python全栈 MongoDB 数据库(概念、安装、创建数据)

什么是关系型数据库? 是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据, 同时也是一个被组织成一组拥有正式描述性的表格(二维表),该形式的表格作用的实 质是装载着数据项的特殊收集体,这些表格中的数据能以许多不同的方式被存 取或重新召集而不需要重新组织数据库表格(即表与表之间的联系). nosql和关系型数据库比较?    优点:        1)成本:nosql数据库简单易部署,基本都是开源软件, 不需要像使用oracle那样花费大量成本购买使用,相比关系型

Mongodb索引和执行计划 hint 慢查询

查询索引 索引存放在system.indexes集合中 > show tables address data person system.indexes 默认会为所有的ID建上索引 而且无法删除 > db.system.indexes.find() { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "

Windows下Python连接数据库(mysql, mongodb)

一 实验平台 1 os: win7 64位旗舰版sp1 2 python: 2.7.10 x64 二 连接数据库 1 连接 mysql数据库 (1)下载mysql(5.6.25-winx64) 建议下载免安装版, 安装版的容易出现各种问题,解开压缩包,双击bin目录下的mysqld.exe, 启动数据库服务进程, 要关闭的话, 直接到任务管理器里面干掉这个进程就行了 (2)下载并安装navicat(这是一个mysql可视化管理工具, 不是必须的, 但可以方便在用python执行数据库操作的时候,

MongoDB 学习笔记(二) 之查询

最简单的查询 个人认为mongoDB是面向对象的吧. 例如最简单的查询  整个数据集只有三条数据 第一查询姓名为张三的  数据 查询的条件比较好写 随意   db.collection.find(查询条件)   例如 15 得到的结果是这样 如果你不想返回某个字段呢 ,你可以自己定义返回的字段值 语法这样 db.collection.find({查询条件},{返回字段}) 16 我们看到每次查询 "_id" 这个字段 都返回  我们可以将它设置为0 这样的话就不会返回 如 查询条件里的

操作3 mongodb和mysql 开启慢查询日志 ,以及mongodb从配置文件启动

1. mongodb从配置文件启动 创建配置文件:/usr/local/mongodb/etc/mongodb.conf 配置文件的内容为: #Directory and relavent set dbpath = /var/mongodb/data logpath = /var/mongodb/logs/log.log profile=2 slowms=100 #repairpath = /var/mongodb/repair pidfilepath = /usr/local/mongodb/

MongoDB基本用法(增删改高级查询、mapreduce)

TestCase.java Java代码   package com.wujintao.mongo; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.regex.Pattern; import org.junit.Test; import com.mongodb.AggregationOut

Mongodb profile(慢查询日志)

在MySQL中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是MongoDB Database Profiler.所以MongoDB 不仅有,而且还有一些比MySQL的Slow Query Log更详细的信息. 开启 Profiling  功能 有两种方式可以控制 Profiling  的开关和级别,第一种是直接在启动参数里直接进行设置. 启动MongoDB时加上–profile=级别  即可. 也可以在客户端调用 db.setProfil

MongoDB 学习笔记(二) 高级查询

1.条件运算符 2.$all 匹配所有 3.$exists 判断字段是否存在 4.NUll 值处理 5.$mod 取模处理 6.$ne 不等于 7. $in 包含,与sql用法相同 8. $nin 不包含,与sql用法相同 9.$size 数组个数 10.正则表达式 11.$where 查询 12.javascript 查询 13.Count.skip. limit 14.sort 排序 15.游标 16.存储过程 javascript 写法 MongoDB 学习笔记(二) 高级查询