Anemometer自动审核sql,添加自定义字段,二次开发需要修改的地方

来源:互联网 发布:网络对人们生活的影响 编辑:程序博客网 时间:2024/06/05 20:47
定制内容如下:
一、
设置一个单独的datasources,可以命名为audit_sql.
这个datasources里面只放置开发环境或者测试环境的慢查询(你要做sql审核基于哪个环境),将此环境的long_query_time设置为0,接收所有的sql查询.
二、修改anemometer
ALTER TABLE `global_query_review` ADD  audit_status VARCHAR(255) NOT NULL DEFAULT 'refuse' comment 'sql审计的状态 refuse未通过 pass审核通过';
修改PHP代码.
在report模块的where条件中增加一个Aduit Status的选项框,可以过滤audit_status的状态
在show_query模块中增加一个Audit Status的选项框,可以人工设置audit_status的状态
三、增加两个额外的脚本,准实时的分析audit_status为refuse的sql,如果sql的满足自动审核通过的条件,那么就设置audit_status为pass,表示自动审核通过.
自动审核未通过的sql,由DBA人工在anemometer上检索和处理.
这里就涉及到一个自动审核通过的算法:
算法分两种.
第一种是准实时,也就是可以几分钟或者一个小时运行一次,主要是根据每个sql的执行效率判断是否pass.
对应的脚本名字叫做:audit_sql.py
第二种是一天一次,弱化执行效率判断,增加一天执行的频率判断.
对应的脚本名字叫做:audit_sql_day.py

自定义audit_status字段需要修改的地方,全部修改后,可以完成自定义字段的增加:
/var/www/html/anemometer/views/report.php ,搜索:reviewed_status 关键字。前端展示页面。
/var/www/html/anemometer/lib/Anemometer.php ,搜索:reviewed_status 关键字。另外:319行,430行。
/var/www/html/anemometer/lib/AnemometerModel.php:84:    
/var/www/html/anemometer/lib/AnemometerModel.php:85: 
/data/server/anemometer/conf/config.inc.php ,搜索:review_types 关键字。数组文件,定义默认选项内容。line:369,453增加where条件。


/data/server/anemometer/conf/config.inc.php 中搜索 $conf['reports']['slow_query_log'] = array( ,该方法下查找:'custom_fields' => array(,

依照'rows_sent_avg' => 'ROUND(SUM(Rows_sent_sum)/SUM(ts_cnt),0)', 添加自定义字段,这样在慢查询统计界面左上角自定义列中可以看到自定义的列。

audit_sql.py 脚本内容

#!/usr/bin/python# coding=utf-8'''auto audit sql taskhuoyuanshen20170616继续统计参数进行sql自动审核。'''import MySQLdbdb = MySQLdb.connect("192.168.1.148","root","123456","slow_query_log") #Anemometer所在数据库的配置。#过滤参数配置Query_time_max=0.1  #执行最慢的那个sql语句花费的时间Query_time_pct_95=0.08 #执行时间位于95%分位的sql执行时间Query_time_median=0.06 #执行时间位于中位数位置的sql执行时间Lock_time_pct_95=0.01#位于95%分位的sql锁定时间def run():cursor = db.cursor()sql = '''UPDATE `global_query_review` aa,( SELECT   a.`checksum`,  MAX(b.`Query_time_max`),  AVG(b.`Query_time_pct_95`),  AVG(b.`Query_time_median`),  AVG(b.`Lock_time_pct_95`),  MAX(b.`Rows_sent_max`),  AVG(b.`Rows_sent_pct_95`),  AVG(b.`Rows_examined_pct_95`),  MAX(b.`Rows_examined_max`),  AVG(b.`Bytes_median`) FROM  `global_query_review` a,  global_query_review_history bWHERE a.`checksum` = b.`checksum`   and a.audit_status = 'refuse'  GROUP BY a.`checksum`  HAVING    (    MAX(b.`Query_time_max`) < %s    OR AVG(b.`Query_time_pct_95`) < %s    OR AVG(b.`Query_time_median`) < %s  )   AND AVG(b.`Lock_time_pct_95`) < %s  AND (    MAX(b.`Rows_sent_max`) < 1000     OR AVG(b.`Rows_sent_pct_95`) < 100  )   AND (    AVG(b.`Rows_examined_pct_95`) < 500     OR MAX(b.`Rows_examined_max`) < 2000  )   AND AVG(b.`Bytes_median`) < 1000 ) bbSET aa.`audit_status` = 'pass'WHERE aa.`checksum` = bb.checksum''' % (Query_time_max,Query_time_pct_95,Query_time_median,Lock_time_pct_95)#定义特殊的语句,建议除了DDL语句,其他DML语句在Anemometer前端统一维护。sql2 = '''UPDATE   `global_query_review` a SET  a.`audit_status` = 'pass' WHERE a.`audit_status` = 'refuse'   AND (a.`sample` LIKE '%show create table%' OR a.`sample` LIKE '%/*!40001 SQL_NO_CACHE */%' OR a.sample LIKE 'explain%' );'''try:        cursor.execute(sql)        cursor.execute(sql2)                db.commit()        print 'Exec sucessful'except:        db.rollback()        print 'Exec fail'db.close()if __name__=='__main__':        run()


audit_sql_day.py脚本内容

#!/usr/bin/python#coding=utf-8'''auto audit sql taskhuoyuanshen20170616将执行次数计算在内的sql自动审核脚本'''import MySQLdb#过滤参数配置Query_time_max=1  #执行最慢的那个sql语句花费的时间Lock_time_max=0.01 #最大sql锁定时间db = MySQLdb.connect("192.168.1.148","root","123456","slow_query_log") #连接到Anemometer数据库的链接def run():cursor = db.cursor()sql = '''UPDATE `global_query_review` aa,( SELECT   a.`checksum`,  COUNT(b.`checksum`) AS coun ,  sum(b.`ts_cnt`) AS sum_ts_cntFROM  `global_query_review` a,  global_query_review_history b WHERE a.`checksum` = b.`checksum`   AND a.audit_status = 'refuse' GROUP BY a.`checksum` HAVING MAX(b.`Query_time_max`) < %s   AND AVG(b.`Lock_time_max`) < %s  AND (MAX(b.`Rows_sent_max`) <= 1000)   AND MAX(b.`Rows_examined_max`) < 5000   AND AVG(b.`Bytes_median`) < 5000   AND coun < 5   AND sum_ts_cnt < 10) bbSET aa.`audit_status` = 'pass'WHERE aa.`checksum` = bb.checksum''' % (Query_time_max,Lock_time_max)cursor.execute(sql)        try:                cursor.execute(sql)                db.commit()                print 'Exec sucessful'        except:                db.rollback()                print 'Exec fail'        db.close()if __name__=='__main__':run()


阅读全文
0 0
原创粉丝点击