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

定制内容如下:
一、
设置一个单独的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 task
huoyuanshen
20170616
继续统计参数进行sql自动审核。
'''
import MySQLdb
db = 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 b
	WHERE 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 
	) bb
	SET 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 task
huoyuanshen
20170616
将执行次数计算在内的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_cnt
	FROM
	  `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
	) bb
	SET 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()


你可能感兴趣的:(Anemometer自动审核sql,添加自定义字段,二次开发需要修改的地方)