python 分析慢查询日志生成报告
python分析Mysql慢查询。通过Python调用开源分析工具pt-query-digest
生成json结果,Python脚本解析json生成html报告。
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # @Time : 2018/10/12 下午3:00
- # @Author : Kionf
- # @Site : https://kionf.com
- # @Software: Sublime
- import subprocess
- import json
- import os
- import re
- import sys
- import time
- from jinja2 import Environment, FileSystemLoader
- # reload(sys)
- # sys.setdefaultencoding('utf-8')
- LibToolkit = 'pt-query-digest'
- LibToolkit_url = 'https://github.com/kalivim/Mysql-SlowLog-analysis/raw/master/pt-query-digest'
- HtmlTemplate = 'template.html'
- HtmlTemplate_url = 'https://github.com/kalivim/Mysql-SlowLog-analysis/raw/master/template.html'
- #检测极赖
- os.system('rpm -q perl-Digest-MD5 || yum -y -q install perl-Digest-MD5')
- class RunAndCheckCommand:
- def __init__(self, commands, task_name, ret_code=0):
- self.commands = commands
- self.task_name = task_name
- self.ret_code = ret_code
- def check_command_status_code(self):
- """
- 检测任务
- """
- if self.exp_code == self.ret_code:
- print("\033[92m [INFO]>> %s \033[0m" % self.task_name)
- else:
- print("\033[91m [ERROR]>> %s \033[0m" % self.task_name)
- exit(1)
- def exec_command_stdout_res(self):
- """
- 执行命令实时返回命令输出
- :return:
- """
- command_res = subprocess.Popen(self.commands, shell=True)
- while command_res.poll():
- line = command_res.stdout.readline()
- line.strip()
- if line:
- print(line)
- command_res.wait()
- self.exp_code = command_res.returncode
- self.check_command_status_code()
- class AnalysisMysqlSlowLog:
- """
- 分析Mysql慢查询日志输出报告。
- 调用第三方工具包percona-toolkit中pt-query-digest工具,默认输出slow.json文件Perl语言编写
- """
- def __init__(self, slow_log_file, json_file, report_file):
- """
- :param slow_log_file: 需要分析的慢查询日志文件
- :param report_file: 生成报告文件名
- """
- self.LibToolkit = LibToolkit
- self.json_file = json_file
- self.report_file = report_file
- self.slow_log_file = slow_log_file
- self.query_digest = "perl %s %s --output json --progress time,1 > %s" % (
- self.LibToolkit, slow_log_file, self.json_file)
- def check_argv_options(self):
- get_toolkit = os.path.isfile(HtmlTemplate)
- get_template = os.path.isfile(LibToolkit)
- get_slow_log = os.path.isfile(self.slow_log_file)
- if not get_toolkit:
- res = RunAndCheckCommand('wget %s 2>/dev/null' % LibToolkit_url, '下载pt-query-digest工具')
- res.exec_command_stdout_res()
- if not get_template:
- res = RunAndCheckCommand('wget %s 2>/dev/null' % HtmlTemplate_url, '下载报告HTML模板')
- res.exec_command_stdout_res()
- if not get_slow_log:
- print("\033[91m [ERROR]>> 指定 %s 慢查询日志不存在 \033[0m" % self.slow_log_file)
- exit(1)
- def general_html_report(self, sql_info):
- env = Environment(loader=FileSystemLoader(os.path.dirname(__file__)))
- template = env.get_template(HtmlTemplate)
- html_content = template.render(sql_info=sql_info)
- with open(self.report_file, 'wa') as f:
- f.write(html_content.encode('utf-8'))
- def general_json_slow_log_report(self):
- """
- 调用第三方工具pt-query-digest生成json报告,并获取需要信息
- :return: digest slow_log format to json
- """
- self.check_argv_options()
- RunCommandsOBJ = RunAndCheckCommand(self.query_digest, '生成Json报告')
- RunCommandsOBJ.exec_command_stdout_res()
- f = open(self.json_file, 'ra')
- format_dict_all_data = json.load(f)
- have_slow_query_tables = []
- all_sql_info = []
- all_slow_query_sql_info = format_dict_all_data['classes']
- global_sql_info = format_dict_all_data['global']
- for slow_query_sql in all_slow_query_sql_info:
- query_metrics = slow_query_sql['metrics']
- query_time = query_metrics['Query_time']
- query_tables = slow_query_sql['tables']
- for show_tables_sql in query_tables:
- get_table_name = show_tables_sql['create'].split('.')[1]
- table_name = re.match(r'`(\w*)`\\G', get_table_name).group(1)
- if table_name not in have_slow_query_tables:
- have_slow_query_tables.append(table_name)
- sql_info = {
- 'ID': slow_query_sql['checksum'],
- 'query_time_max': query_time['max'],
- 'query_time_min': query_time['min'],
- 'query_time_95': query_time['pct_95'],
- 'query_time_median': query_time['median'],
- 'query_row_send_95': query_metrics['Rows_sent']['pct_95'],
- 'query_db': query_metrics['db']['value'],
- 'slow_query_count': slow_query_sql['query_count'],
- 'slow_query_tables': have_slow_query_tables,
- 'sql': slow_query_sql['example']['query'],
- }
- all_sql_info.append(sql_info)
- all_sql_info = sorted(all_sql_info, key=lambda e: float(e['query_time_95']), reverse=True)
- return all_sql_info
- class SendReportForEmail:
- pass
- def help_msg():
- """
- 输出帮助信息
- """
- msg = """
- Usage:
- ./ slow-query-analysis.py 慢查询日志 生成json报告文件名 生成html报告文件名
- """
- print(msg)
- if __name__ == "__main__":
- if len(sys.argv) == 4:
- slow_log_name = sys.argv[1]
- json_file_name = sys.argv[2]
- report_name = sys.argv[3]
- print('\033[92m ====开始分析慢查询日志==== \033[0m')
- obj = AnalysisMysqlSlowLog(slow_log_file=slow_log_name, json_file=json_file_name, report_file=report_name)
- res_json_report = obj.general_json_slow_log_report()
- obj.general_html_report(res_json_report)
- else:
- help_msg()
0x01 脚本使用方法

参数介绍

生成结果:
0x02 pt-query-digest工具介绍
pt-query-digest
为percona
工具包中的一个perl脚本,用来分析Mysql慢查询日志,或者tcpdump的Mysql的数据包。生成结果有三种格式可以选择:json,report, Mysql
常用语句:
- 将结果和历史分析记录写入Mysql数据库(会自动创建表,需指定写入数据库)

- 生成json报告

- 生成report

选项介绍:

- 本文作者: Kionf
- 本文链接: https://kionf.com/2018/11/22/mysql-slowlog-report/
python 分析慢查询日志生成报告的更多相关文章
- 0613pt-query-digest分析慢查询日志
转自http://www.jb51.net/article/107698.htm 这篇文章主要介绍了关于MySQL慢查询之pt-query-digest分析慢查询日志的相关资料,文中介绍的非常详细,对 ...
- pt-query-digest分析mysql查询日志
[root@hank-yoon log]# pt-query-digest slowq.log # 200ms user time, 10ms system time, 24.39M rss, 205 ...
- MySQL之pt-query-digest分析慢查询日志的详情介绍
一.简介 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcpdu ...
- pt-query-digest怎么分析慢查询日志分析数据
在进行使用linux系统作为服务器的情况,那几需要进行对linux的服务器进行性能上数据进行抓取之后,就需要对数据中内容进行分析,看数据库中内容是否存在瓶颈上的问题,在进行获取到的数据的慢查日志,将使 ...
- python分析apahce网站日志的例子
有关python实现apahce网站日志分析的方法. 应用到:shell与python数据交互.数据抓取,编码转换 #coding:utf-8 #!/usr/bin/python'''程序说明:apa ...
- python +selenium 自带case +生成报告的模板
https://github.com/huahuijay/python-selenium2这个就是 python +selenium的 里面还自带case 然后也有生成报告的模板 我的: https: ...
- Mysql系列(十一)—— 性能分析慢查询日志
转载自:http://www.cnblogs.com/kerrycode/p/5593204.html 慢查询日志概念 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响 ...
- mysqldumpslow -- 分析慢查询日志
格式:mysqldumpslow [选项] 慢查询日志路径 选项: -s 排序方式,可选值有c(记录次数).t(查询时间).l(锁定时间).r(返回记录).a(平均) -t 显示的记录数 - ...
- python自动化--批量执行测试之生成报告
一.生成报告 1.先执行一个用例,并生成该用例的报告 # -*- coding: utf-8 -*- from selenium import webdriver from selenium.webd ...
随机推荐
- 如何编写Robot Framework测试用例2---(测试用例语法1)
基本语法 测试用例由关键字组成,关键字的来源有三种: 1从测试库引入:2从资源文件引入:3从关键字表中引入(自定义关键字) 下面就是一个典型的测试用例组织形式. 图中有2个测试用例“Valid Log ...
- docker安装的gitlab的备份与恢复
1.对docker容器安装gitlab备份 1) 查看容器id docker ps 2) 将容器备份成镜像文件 docker commit -a 'James' -m 'gitlab_backup' ...
- AFN请求问题
在使用AFNetworking 2.0 的时候本来一切很顺畅,但是中途遇到几个比较坑的地方 在发送请求后,NSURLSessionDataTask一直报错 Error Domain=com.alam ...
- 使用telnet连接redis
平时连接redis用的是官方客户端redis-cli, 使用redis-cli最常用的几个参数如下: -h <hostname> Server hostname (default: 127 ...
- BZOJ 2648 世界树
题目传送门 分析: 喜 闻 乐 见 的虚树 但是建好虚树后的DP也非常的恶心 我们先考虑每个关键点的归哪个点管 先DFS一次计算儿子节点归属父亲 再DFS一次计算父亲节点归属儿子 然后然后我们对于虚树 ...
- Windows中安装Linux子系统的详细步骤
早就听说Windows中可以安装Linux子系统,体验了一下,感觉还是不错的,下面直接开始安装和配置步骤吧! 开启Windows中的配置 首先开启开发者模式 打开"所有设置"进入& ...
- python3.6的安装及cx_oracle安装
一.创建所需目录mkdir -p /home/用户名/software/python3.6.1mkdir -p /home/用户名/priv/bydmkdir -p /home/用户名/priv/by ...
- java内存模型梳理
java内存模型 内存模型和内存结构区别 它们是两个概念. 内存模型是和jvm多线程相关的. 内存结构是指的jvm内存结构. 内存模型的作用 内存模型简称JMM JMM是决定一个线程对共享变量的写入时 ...
- pycharm2019破解
pycharm2019 2破解教程 参考这个方法 https://www.cnblogs.com/liuyanhang/p/11088167.html
- Guava中强大的排序器Ordering使用
一 创建排序器 排序器:可以用来为构建复杂的比较器,以完成集合排序的功能: 本质上来说,Ordering 实例无非就是一个特殊的Comparator 实例. Ordering把很多基于Comparat ...