From a39202a03b95903f98cabdcf3bae9c9b81406b22 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 08:50:00 -0300 Subject: [PATCH 01/30] fix: make some fields final --- .../com/jd/sql/analysis/analysis/SqlAnalysis.java | 2 +- .../java/com/jd/sql/analysis/config/JmqConfig.java | 12 ++++++------ .../jd/sql/analysis/config/SqlAnalysisConfig.java | 2 +- .../com/jd/sql/analysis/core/SqlAnalysisAspect.java | 2 +- .../java/com/jd/sql/analysis/extract/SqlExtract.java | 4 ++-- .../com/jd/sql/analysis/out/SqlScoreResultOutMq.java | 2 +- .../jd/sql/analysis/out/SqlScoreResultOutMysql.java | 2 +- .../out/SqlScoreResultOutServiceDefault.java | 2 +- .../java/com/jd/sql/analysis/replace/SqlReplace.java | 4 ++-- .../jd/sql/analysis/rule/RulesEngineExecutor.java | 2 +- .../sql/analysis/rule/SqlScoreRuleLoaderDefault.java | 2 +- .../analysis/rule/SqlScoreRuleLoaderRulesEngine.java | 2 +- .../sql/analysis/score/SqlScoreServiceDefault.java | 2 +- .../analysis/score/SqlScoreServiceRulesEngine.java | 2 +- .../com/jd/sql/analysis/util/DuccMonitorUtil.java | 4 ++-- .../com/jd/sql/analysis/util/KeyNodeLogUtil.java | 2 +- 16 files changed, 24 insertions(+), 24 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java index a496e9b..beb2d85 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java @@ -21,7 +21,7 @@ **/ public class SqlAnalysis { - private static Logger logger = LoggerFactory.getLogger(SqlAnalysis.class); + private static final Logger logger = LoggerFactory.getLogger(SqlAnalysis.class); /** * mysql 版本标识 diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java b/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java index a83c214..fdde24d 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java @@ -12,7 +12,7 @@ * @Date 18:20 2023/2/9 **/ public class JmqConfig { - private static Logger logger = LoggerFactory.getLogger(JmqConfig.class); + private static final Logger logger = LoggerFactory.getLogger(JmqConfig.class); /** * 应用 */ @@ -41,27 +41,27 @@ public class JmqConfig { /** * 应用名称配置key */ - private static String MQ_APP = "mqApp"; + private static final String MQ_APP = "mqApp"; /** * 用户配置key */ - private static String MQ_USER = "mqUser"; + private static final String MQ_USER = "mqUser"; /** * 密码配置key */ - private static String MQ_PASSWORD = "mqPassword"; + private static final String MQ_PASSWORD = "mqPassword"; /** * mq地址配置key */ - private static String MQ_ADDRESS = "mqAddress"; + private static final String MQ_ADDRESS = "mqAddress"; /** * topic */ - private static String MQ_TOPIC = "mqTopic"; + private static final String MQ_TOPIC = "mqTopic"; /** diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/config/SqlAnalysisConfig.java b/sql-analysis/src/main/java/com/jd/sql/analysis/config/SqlAnalysisConfig.java index e62cdfc..f1ec0f3 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/config/SqlAnalysisConfig.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/config/SqlAnalysisConfig.java @@ -20,7 +20,7 @@ public class SqlAnalysisConfig { - private static Logger logger = LoggerFactory.getLogger(SqlAnalysisConfig.class); + private static final Logger logger = LoggerFactory.getLogger(SqlAnalysisConfig.class); /** * 分析开关,默认关闭 diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java b/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java index 39cdbaf..676e2ba 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java @@ -58,7 +58,7 @@ public class SqlAnalysisAspect implements Interceptor { /** * 评分规则服务 */ - private static SqlScoreService sqlScoreService = new SqlScoreServiceRulesEngine(); + private static final SqlScoreService sqlScoreService = new SqlScoreServiceRulesEngine(); /** * 评分结果输出服务 diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java index 6924115..7879b30 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java @@ -34,12 +34,12 @@ **/ public class SqlExtract { - private static Logger logger = LoggerFactory.getLogger(SqlExtract.class); + private static final Logger logger = LoggerFactory.getLogger(SqlExtract.class); /** * 记录sqlId-check time */ - private static ConcurrentHashMap checkedIdMap = new ConcurrentHashMap(); + private static final ConcurrentHashMap checkedIdMap = new ConcurrentHashMap(); /** * 提取完整sql diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java index d93f272..4bed455 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java @@ -11,7 +11,7 @@ **/ public class SqlScoreResultOutMq implements SqlScoreResultOutService { - private static Logger logger = LoggerFactory.getLogger(SqlScoreResultOutMq.class); + private static final Logger logger = LoggerFactory.getLogger(SqlScoreResultOutMq.class); @Override public void outResult(SqlScoreResult sqlScoreResult) { diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMysql.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMysql.java index 4d35728..c7967e2 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMysql.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMysql.java @@ -11,7 +11,7 @@ **/ public class SqlScoreResultOutMysql implements SqlScoreResultOutService { - private static Logger logger = LoggerFactory.getLogger(SqlScoreResultOutMysql.class); + private static final Logger logger = LoggerFactory.getLogger(SqlScoreResultOutMysql.class); @Override public void outResult(SqlScoreResult sqlScoreResult) { diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java index 6b3f058..9c055e9 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java @@ -11,7 +11,7 @@ **/ public class SqlScoreResultOutServiceDefault implements SqlScoreResultOutService { - private static Logger logger = LoggerFactory.getLogger(SqlScoreResultOutServiceDefault.class); + private static final Logger logger = LoggerFactory.getLogger(SqlScoreResultOutServiceDefault.class); @Override public void outResult(SqlScoreResult sqlScoreResult) { diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplace.java b/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplace.java index 3951850..bcc2c30 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplace.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplace.java @@ -16,7 +16,7 @@ **/ public class SqlReplace { - private static Logger logger = LoggerFactory.getLogger(SqlReplace.class); + private static final Logger logger = LoggerFactory.getLogger(SqlReplace.class); public static void replace(Invocation invocation,String newSql){ // 获取当前执行的SQL语句 @@ -76,7 +76,7 @@ private static MappedStatement copyFromMappedStatement(MappedStatement ms, SqlSo private static class BoundSqlSqlSource implements SqlSource { - private BoundSql boundSql; + private final BoundSql boundSql; public BoundSqlSqlSource(BoundSql boundSql) { this.boundSql = boundSql; diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java index d714999..f3d07bf 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java @@ -24,7 +24,7 @@ */ public class RulesEngineExecutor { - private static Logger logger = LoggerFactory.getLogger(RulesEngineExecutor.class); + private static final Logger logger = LoggerFactory.getLogger(RulesEngineExecutor.class); public final static RulesEngine rulesEngine = new DefaultRulesEngine(); private static Rules rules; diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderDefault.java index 7f80057..3153c3d 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderDefault.java @@ -14,7 +14,7 @@ @Deprecated public class SqlScoreRuleLoaderDefault implements SqlScoreRuleLoader { - private static Logger logger = LoggerFactory.getLogger(SqlScoreRuleLoaderDefault.class); + private static final Logger logger = LoggerFactory.getLogger(SqlScoreRuleLoaderDefault.class); @Override diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderRulesEngine.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderRulesEngine.java index 2ed22b4..a54c0ab 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderRulesEngine.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderRulesEngine.java @@ -10,7 +10,7 @@ **/ public class SqlScoreRuleLoaderRulesEngine implements SqlScoreRuleLoader { - private static Logger logger = LoggerFactory.getLogger(SqlScoreRuleLoaderRulesEngine.class); + private static final Logger logger = LoggerFactory.getLogger(SqlScoreRuleLoaderRulesEngine.class); @Override diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java index 79de29e..b178b91 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java @@ -21,7 +21,7 @@ @Deprecated public class SqlScoreServiceDefault implements SqlScoreService { - private static Logger logger = LoggerFactory.getLogger(SqlScoreServiceDefault.class); + private static final Logger logger = LoggerFactory.getLogger(SqlScoreServiceDefault.class); private static final Integer WARN_SCORE = 80; diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java index 080c94c..3afac82 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java @@ -18,7 +18,7 @@ **/ public class SqlScoreServiceRulesEngine implements SqlScoreService { - private static Logger logger = LoggerFactory.getLogger(SqlScoreServiceRulesEngine.class); + private static final Logger logger = LoggerFactory.getLogger(SqlScoreServiceRulesEngine.class); private static final Integer WARN_SCORE = 80; diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/DuccMonitorUtil.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/DuccMonitorUtil.java index 9426516..41f076d 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/DuccMonitorUtil.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/DuccMonitorUtil.java @@ -11,8 +11,8 @@ **/ public class DuccMonitorUtil { - private static Logger log = LoggerFactory.getLogger(DuccMonitorUtil.class); - private static String duccConfig = ""; + private static final Logger log = LoggerFactory.getLogger(DuccMonitorUtil.class); + private static final String duccConfig = ""; /** * 启动监控 diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java index b7fb5e6..8fe2568 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java @@ -19,7 +19,7 @@ **/ public class KeyNodeLogUtil { - private static Logger log = LoggerFactory.getLogger(KeyNodeLogUtil.class); + private static final Logger log = LoggerFactory.getLogger(KeyNodeLogUtil.class); private static RingBuffer ringBuffer = null; From 8d1358b98868382f38ae73f3fe157e336e3e644b Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 08:50:50 -0300 Subject: [PATCH 02/30] fix: unnecessary 'toString()' call --- .../src/main/java/com/jd/sql/analysis/extract/SqlExtract.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java index 7879b30..a25d4e1 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java @@ -182,7 +182,7 @@ private static String getParameterValue(Object obj) { String value = null; if (obj instanceof String) { - value = "'" + obj.toString() + "'"; + value = "'" + obj + "'"; } else if (obj instanceof Date) { DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA); value = "'" + formatter.format(obj) + "'"; From bb487e70f7b082cf1a2c694565b1dc1859fec577 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:11:23 -0300 Subject: [PATCH 03/30] fix: remove redundant modifier Modifier 'public' is redundant for interface members --- .../main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoader.java | 2 +- .../main/java/com/jd/sql/analysis/score/SqlScoreService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoader.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoader.java index c4a4030..0adf7e2 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoader.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoader.java @@ -10,6 +10,6 @@ public interface SqlScoreRuleLoader { /** * 加载评分规则 */ - public boolean loadScoreRule(); + boolean loadScoreRule(); } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreService.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreService.java index 5dc8692..bc43db5 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreService.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreService.java @@ -14,6 +14,6 @@ public interface SqlScoreService { * @param sqlAnalysisResutlDto * @return */ - public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResutlDto); + SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResutlDto); } From 1bdf6a135ab9d1d08f3572b77afa7d2b9e389b57 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:11:54 -0300 Subject: [PATCH 04/30] fix: remove unnecessary semicolon --- .../main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java index beb2d85..497ab5b 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java @@ -43,8 +43,8 @@ public static SqlAnalysisResultList analysis(SqlExtractResult sqlExtractResult, SqlAnalysisResult sqlAnalysisResutlDto = null; //包装分析语句 - String analysisSql = getAnalysisSql(sourceSql);; - PreparedStatement pstmt = null; + String analysisSql = getAnalysisSql(sourceSql); + PreparedStatement pstmt = null; ResultSet rs = null; try { pstmt = connection.prepareStatement(analysisSql); From 3c26616282cd9f10073a8c47f61e7efe6bbb8344 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:13:13 -0300 Subject: [PATCH 05/30] fix: remove unnecessary semicolon --- .../java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java index b178b91..ce08ab6 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java @@ -158,7 +158,6 @@ private boolean matchColumn(SqlScoreRule sqlScoreRule, Object value) { } break; default: - ; } return matchResult; } From 8621b28925161b3b598e57454cac0df13e753535 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:13:24 -0300 Subject: [PATCH 06/30] fix: raw use of parameterized class --- .../src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java index 8fe2568..e4455d4 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java @@ -55,7 +55,7 @@ public KeyNodeLogModel newInstance() { BlockingWaitStrategy strategy = new BlockingWaitStrategy(); // 创建disruptor,采用单生产者模式 - Disruptor disruptor = new Disruptor(factory, bufferSize, threadFactory, ProducerType.SINGLE, strategy); + Disruptor disruptor = new Disruptor<>(factory, bufferSize, threadFactory, ProducerType.SINGLE, strategy); ringBuffer = disruptor.getRingBuffer(); // 处理Event的handler From e1e16c84a08f186cc90dc9200c8cbb4de64de1d3 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:15:37 -0300 Subject: [PATCH 07/30] fix: raw use --- .../src/main/java/com/jd/sql/analysis/extract/SqlExtract.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java index a25d4e1..e4708e5 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java @@ -39,7 +39,7 @@ public class SqlExtract { /** * 记录sqlId-check time */ - private static final ConcurrentHashMap checkedIdMap = new ConcurrentHashMap(); + private static final ConcurrentHashMap checkedIdMap = new ConcurrentHashMap<>(); /** * 提取完整sql From f6d756edb0007a42a34215082696d9c1ec3f7baf Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:16:30 -0300 Subject: [PATCH 08/30] fix: redundant if statement --- .../main/java/com/jd/sql/analysis/extract/SqlExtract.java | 6 +----- .../com/jd/sql/analysis/score/SqlScoreServiceDefault.java | 6 +----- .../jd/sql/analysis/score/SqlScoreServiceRulesEngine.java | 6 +----- .../main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java | 5 +---- 4 files changed, 4 insertions(+), 19 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java index e4708e5..ded29f0 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java @@ -112,11 +112,7 @@ private static boolean needAnalysis(String sqlId,String sqlType){ } //检查间隔判断 - if(checkedIdMap.get(sqlId)!=null && (System.currentTimeMillis()-checkedIdMap.get(sqlId))= SqlAnalysisConfig.getCheckInterval(); } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java index ce08ab6..df27729 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java @@ -52,11 +52,7 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { score = 0; } - if (score < WARN_SCORE) { - scoreResult.setNeedWarn(true); - } else { - scoreResult.setNeedWarn(false); - } + scoreResult.setNeedWarn(score < WARN_SCORE); } scoreResult.setScore(score); scoreResult.setAnalysisResults(analysisResults); diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java index 3afac82..e062419 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java @@ -49,11 +49,7 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { score = 0; } - if (score < WARN_SCORE) { - scoreResult.setNeedWarn(true); - } else { - scoreResult.setNeedWarn(false); - } + scoreResult.setNeedWarn(score < WARN_SCORE); } scoreResult.setScore(score); scoreResult.setAnalysisResults(analysisResults); diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java index e4455d4..4baeb04 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java @@ -150,10 +150,7 @@ public static void sendLog(String businessId, String modelName, String nodeName, * @return */ public static boolean checkModel(KeyNodeLogModel model){ - if(StringUtils.isBlank(model.getBusinessId()) || StringUtils.isBlank(model.getModuleName()) || StringUtils.isBlank(model.getNodeName())){ - return false; - } - return true; + return !StringUtils.isBlank(model.getBusinessId()) && !StringUtils.isBlank(model.getModuleName()) && !StringUtils.isBlank(model.getNodeName()); } public static void sendMessage(String topic,String businessId,String messageBody) { From c0cd2bd6589509c2ba25099c7db87c2e8c1e4a3f Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:17:31 -0300 Subject: [PATCH 09/30] fix: redundant local variable --- .../java/com/jd/sql/analysis/core/SqlAnalysisAspect.java | 6 ++---- .../com/jd/sql/analysis/score/SqlScoreServiceDefault.java | 3 +-- .../jd/sql/analysis/score/SqlScoreServiceRulesEngine.java | 3 +-- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java b/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java index 676e2ba..ae39303 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java @@ -139,8 +139,7 @@ public void setProperties(Properties properties) { try { boolean result = JmqConfig.initMqProducer(); if(result){ - SqlScoreResultOutService outServiceClass = new SqlScoreResultOutMq(); - sqlScoreResultOut = outServiceClass; + sqlScoreResultOut = new SqlScoreResultOutMq(); } } catch (Exception e) { e.printStackTrace(); @@ -150,8 +149,7 @@ public void setProperties(Properties properties) { //自定义方式输出 if(StringUtils.isNotBlank(SqlAnalysisConfig.getOutputClass())){ try { - SqlScoreResultOutService outServiceClass = (SqlScoreResultOutService)Class.forName(SqlAnalysisConfig.getOutputClass()).newInstance(); - sqlScoreResultOut = outServiceClass; + sqlScoreResultOut = (SqlScoreResultOutService)Class.forName(SqlAnalysisConfig.getOutputClass()).newInstance(); } catch (Exception e) { e.printStackTrace(); logger.error("sql analysis init out mode error",e); diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java index df27729..b835ae3 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java @@ -115,8 +115,7 @@ private Object getValue(SqlAnalysisResult result, String columnName) { String methodName = "get" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1); Class sqlAnalysisResultClass = SqlAnalysisResult.class; Method getMethod = sqlAnalysisResultClass.getDeclaredMethod(methodName); - Object value = getMethod.invoke(result); - return value; + return getMethod.invoke(result); } catch (Exception e) { logger.error("sql analysis get value error :", e); } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java index e062419..9620da5 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java @@ -59,7 +59,6 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { } private List matchRuleEngine(SqlAnalysisResult result) { - List ret = RulesEngineExecutor.executeEngine(result); - return ret; + return RulesEngineExecutor.executeEngine(result); } } \ No newline at end of file From 916547c8cc2f7fd3a75c914c11a5f91210dbf611 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:18:11 -0300 Subject: [PATCH 10/30] fix: this can be final --- .../main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java | 2 +- .../main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java b/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java index ae39303..4a9fcd6 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java @@ -53,7 +53,7 @@ )}) public class SqlAnalysisAspect implements Interceptor { - Logger logger = LoggerFactory.getLogger(SqlAnalysisAspect.class); + final Logger logger = LoggerFactory.getLogger(SqlAnalysisAspect.class); /** * 评分规则服务 diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java b/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java index b1afd78..6e68cc1 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java @@ -16,7 +16,7 @@ **/ public class SqlReplaceConfig { - static Logger log = LoggerFactory.getLogger(SqlReplaceConfig.class); + static final Logger log = LoggerFactory.getLogger(SqlReplaceConfig.class); /** * 配置明细 From 10504fa48a940e6eccc8966abcdb177b32b6b8a0 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:19:27 -0300 Subject: [PATCH 11/30] fix: raw use --- .../java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java index b835ae3..0eaa88e 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java @@ -113,7 +113,7 @@ private List matchRule(SqlAnalysisResult result) { private Object getValue(SqlAnalysisResult result, String columnName) { try { String methodName = "get" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1); - Class sqlAnalysisResultClass = SqlAnalysisResult.class; + Class sqlAnalysisResultClass = SqlAnalysisResult.class; Method getMethod = sqlAnalysisResultClass.getDeclaredMethod(methodName); return getMethod.invoke(result); } catch (Exception e) { From 88de6881f3df7ec7c9ac8584d7b02210f94419ce Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:20:13 -0300 Subject: [PATCH 12/30] fix: explicit types can be replaced --- .../com/jd/sql/analysis/rule/RulesEngineExecutor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java index f3d07bf..c221eb8 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java @@ -45,8 +45,8 @@ public static boolean refresh(){ } catch (IOException e) { logger.error("规则引擎配置文件加载失败",e); } - Map ruleMap = new HashMap(); - ConcurrentHashMap innerScoreMap = new ConcurrentHashMap(); + Map ruleMap = new HashMap<>(); + ConcurrentHashMap innerScoreMap = new ConcurrentHashMap<>(); properties.forEach((key, value) -> { String[] keyArr = StringUtils.split(key.toString(),'.'); if(keyArr.length >= 2){ @@ -78,8 +78,8 @@ public static boolean refresh(){ } public static List executeEngine(SqlAnalysisResult sqlAnalysisResult) { - ArrayList retList = new ArrayList(); - ArrayList ret = new ArrayList(); + ArrayList retList = new ArrayList<>(); + ArrayList ret = new ArrayList<>(); // 创建事实 Facts facts = new Facts(); facts.put("param", sqlAnalysisResult); From 9670258f4b6af010ce64a9c27622418eabda3fda Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:21:01 -0300 Subject: [PATCH 13/30] fix: this can be replaced with lambda --- .../jd/sql/analysis/util/KeyNodeLogUtil.java | 25 +++++-------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java index 4baeb04..e9cfced 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java @@ -36,20 +36,10 @@ public static void initDisruptor(){ int batchLogSize = 10; // 生产者的线程工厂 - ThreadFactory threadFactory = new ThreadFactory(){ - @Override - public Thread newThread(Runnable r) { - return new Thread(r, "logDisruptorThread"); - } - }; + ThreadFactory threadFactory = r -> new Thread(r, "logDisruptorThread"); // RingBuffer生产工厂,初始化RingBuffer的时候使用 - EventFactory factory = new EventFactory() { - @Override - public KeyNodeLogModel newInstance() { - return new KeyNodeLogModel(); - } - }; + EventFactory factory = () -> new KeyNodeLogModel(); // 阻塞策略 BlockingWaitStrategy strategy = new BlockingWaitStrategy(); @@ -59,14 +49,11 @@ public KeyNodeLogModel newInstance() { ringBuffer = disruptor.getRingBuffer(); // 处理Event的handler - EventHandler handler = new EventHandler(){ - @Override - public void onEvent(KeyNodeLogModel element, long sequence, boolean endOfBatch) throws InterruptedException { - if(Objects.isNull(element)){ - return; - } - sendSingleLog(element); + EventHandler handler = (element, sequence, endOfBatch) -> { + if(Objects.isNull(element)){ + return; } + sendSingleLog(element); }; // 设置EventHandler disruptor.handleEventsWith(handler); From 26868f0ee299b3de7bb3f514d33a9a577bec6f71 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:21:42 -0300 Subject: [PATCH 14/30] fix: lambda method reference --- .../java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java | 4 +--- .../jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java | 4 +--- .../main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java index 4bed455..4635479 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java @@ -23,9 +23,7 @@ public void outResult(SqlScoreResult sqlScoreResult) { //todo 待替换为开源组件 logger.error("sql analysis result sqlId:{}, score:{}",sqlScoreResult.getSqlId(),sqlScoreResult.getScore()); if(sqlScoreResult.getAnalysisResults()!=null){ - sqlScoreResult.getAnalysisResults().forEach(result->{ - logger.error("sql analysis result detail-reason:{},suggestion:{}",result.getReason(),result.getSuggestion()); - }); + sqlScoreResult.getAnalysisResults().forEach(result-> logger.error("sql analysis result detail-reason:{},suggestion:{}",result.getReason(),result.getSuggestion())); } } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java index 9c055e9..2b9fa0f 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java @@ -21,9 +21,7 @@ public void outResult(SqlScoreResult sqlScoreResult) { if(sqlScoreResult.getNeedWarn()!=null && sqlScoreResult.getNeedWarn()){ logger.error("sql analysis result score:{}",sqlScoreResult.getScore()); if(sqlScoreResult.getAnalysisResults()!=null){ - sqlScoreResult.getAnalysisResults().forEach(result->{ - logger.error("sql analysis result detail-reason:{},suggestion:{}",result.getReason(),result.getSuggestion()); - }); + sqlScoreResult.getAnalysisResults().forEach(result-> logger.error("sql analysis result detail-reason:{},suggestion:{}",result.getReason(),result.getSuggestion())); } } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java index e9cfced..7a4513a 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java @@ -39,7 +39,7 @@ public static void initDisruptor(){ ThreadFactory threadFactory = r -> new Thread(r, "logDisruptorThread"); // RingBuffer生产工厂,初始化RingBuffer的时候使用 - EventFactory factory = () -> new KeyNodeLogModel(); + EventFactory factory = KeyNodeLogModel::new; // 阻塞策略 BlockingWaitStrategy strategy = new BlockingWaitStrategy(); From 1ef4bf4ebefe74d31194c2fd60f8d23e8ae9901b Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:32:08 -0300 Subject: [PATCH 15/30] fix: replace concatenation to parameterized log --- .../src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java | 2 +- .../src/main/java/com/jd/sql/analysis/extract/SqlExtract.java | 2 +- .../java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java | 2 +- .../com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java | 2 +- .../src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java index 497ab5b..ad5956e 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java @@ -67,7 +67,7 @@ public static SqlAnalysisResultList analysis(SqlExtractResult sqlExtractResult, e.printStackTrace(); } } - logger.info("sql analysis result = " + GsonUtil.bean2Json(sqlAnalysisResutlDto)); + logger.info("sql analysis result = {}", GsonUtil.bean2Json(sqlAnalysisResutlDto)); SqlAnalysisResultList sqlAnalysisResultList = new SqlAnalysisResultList(); sqlAnalysisResultList.setResultList(resultList); return sqlAnalysisResultList; diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java index ded29f0..37505b6 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java @@ -83,7 +83,7 @@ public static SqlExtractResult extract(StatementHandler statementHandler){ Configuration cOnfiguration= mappedStatement.getConfiguration(); // 获取到最终的sql语句 String sql = getSql(cOnfiguration, boundSql); - logger.info("sql analysis sql = " + sql); + logger.info("sql analysis sql = {}", sql); SqlExtractResult result = new SqlExtractResult(); result.setSqlId(sqlId); diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java index 0eaa88e..047b085 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java @@ -57,7 +57,7 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { scoreResult.setScore(score); scoreResult.setAnalysisResults(analysisResults); - logger.info("sql analysis result = " + GsonUtil.bean2Json(scoreResult)); + logger.info("sql analysis result = {}", GsonUtil.bean2Json(scoreResult)); return scoreResult; } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java index 9620da5..5973154 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java @@ -54,7 +54,7 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { scoreResult.setScore(score); scoreResult.setAnalysisResults(analysisResults); - logger.info("sql analysis result = " + GsonUtil.bean2Json(scoreResult)); + logger.info("sql analysis result = {}", GsonUtil.bean2Json(scoreResult)); return scoreResult; } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java index 7a4513a..39661a9 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java @@ -109,7 +109,7 @@ public static void sendSingleLog(KeyNodeLogModel model){ try { sendMessage(JmqConfig.getTopic(), model.getBusinessId(),content); } catch (Exception e) { - log.error("sql analysis out mq error" + model.getBusinessId(),e); + log.error("sql analysis out mq error{}", model.getBusinessId(), e); } } From 3c30b1ac85d92580d3c548ff927d34cbd52029de Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:32:19 -0300 Subject: [PATCH 16/30] fix: long literal --- .../main/java/com/jd/sql/analysis_samples/util/MyBatisUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-analysis-samples/src/main/java/com/jd/sql/analysis_samples/util/MyBatisUtil.java b/sql-analysis-samples/src/main/java/com/jd/sql/analysis_samples/util/MyBatisUtil.java index 08d3e24..b605cfa 100644 --- a/sql-analysis-samples/src/main/java/com/jd/sql/analysis_samples/util/MyBatisUtil.java +++ b/sql-analysis-samples/src/main/java/com/jd/sql/analysis_samples/util/MyBatisUtil.java @@ -63,7 +63,7 @@ public static void main(String[]args){ System.out.println(sqlSession); TaskMapper mapper = sqlSession.getMapper(TaskMapper.class); - Long id = 21l; + Long id = 21L; Task task = mapper.selectByPrimaryKey(id); System.out.println(GsonUtil.bean2Json(task)); } From 3d65fa023451e35d8c26a900485b8cdbbbd47dc0 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:32:45 -0300 Subject: [PATCH 17/30] perf: type may be primitive --- .../java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java | 2 +- .../com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java index 047b085..7b4cd03 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java @@ -32,7 +32,7 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { return null; } //默认100分,扣分制 - Integer score = 100; + int score = 100; SqlScoreResult scoreResult = new SqlScoreResult(); List analysisResults = new ArrayList<>(); diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java index 5973154..e853319 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java @@ -29,7 +29,7 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { return null; } //默认100分,扣分制 - Integer score = 100; + int score = 100; SqlScoreResult scoreResult = new SqlScoreResult(); List analysisResults = new ArrayList<>(); From c907e0fe91a5b32c24fdad9a290664830e422873 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:34:04 -0300 Subject: [PATCH 18/30] fix: remove code duplicate --- .../analysis/score/SqlScoreServiceDefault.java | 8 ++++++-- .../score/SqlScoreServiceRulesEngine.java | 15 +-------------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java index 7b4cd03..293b629 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java @@ -45,6 +45,10 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { } //综合评分计算 + return getSqlScoreResult(score, scoreResult, analysisResults, WARN_SCORE, logger); + } + + static SqlScoreResult getSqlScoreResult(int score, SqlScoreResult scoreResult, List analysisResults, Integer warnScore, Logger logger) { for (SqlScoreResultDetail detail : analysisResults) { score = score - detail.getScoreDeduction(); if (score < 0) { @@ -52,12 +56,12 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { score = 0; } - scoreResult.setNeedWarn(score < WARN_SCORE); + scoreResult.setNeedWarn(score < warnScore); } scoreResult.setScore(score); scoreResult.setAnalysisResults(analysisResults); - logger.info("sql analysis result = {}", GsonUtil.bean2Json(scoreResult)); + logger.info("sql analysis result = {}", GsonUtil.bean2Json(scoreResult)); return scoreResult; } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java index e853319..ea00a92 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java @@ -42,20 +42,7 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { } //综合评分计算 - for (SqlScoreResultDetail detail : analysisResults) { - score = score - detail.getScoreDeduction(); - if (score < 0) { - //防止出现负分 - score = 0; - } - - scoreResult.setNeedWarn(score < WARN_SCORE); - } - scoreResult.setScore(score); - scoreResult.setAnalysisResults(analysisResults); - - logger.info("sql analysis result = {}", GsonUtil.bean2Json(scoreResult)); - return scoreResult; + return getSqlScoreResult(score, scoreResult, analysisResults, WARN_SCORE, logger); } private List matchRuleEngine(SqlAnalysisResult result) { From 215e2b67c58f5bc2f1a2d23af1b21d31d0f11e4c Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:35:35 -0300 Subject: [PATCH 19/30] fix: inputStream is nullable here --- .../java/com/jd/sql/analysis/rule/RulesEngineExecutor.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java index c221eb8..587fc06 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java @@ -39,6 +39,10 @@ public static boolean refresh(){ InputStream inputStream; Properties properties = new Properties(); inputStream = RulesEngineExecutor.class.getClassLoader().getResourceAsStream("sql-analysis-rule-config.properties"); + if(inputStream == null){ + logger.error("规则引擎配置文件加载失败"); + return false; + } try { properties.load(new InputStreamReader(inputStream)); inputStream.close(); From 9e0772f9b235645c07be9e64476f02a74985980a Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:36:59 -0300 Subject: [PATCH 20/30] fix: lombok can be used here --- .../analysis/analysis/SqlAnalysisResult.java | 100 +----------------- .../analysis/SqlAnalysisResultList.java | 12 +-- .../analysis/SqlAnalysisSqlTypeEnum.java | 20 +--- .../com/jd/sql/analysis/config/JmqConfig.java | 36 ++----- .../analysis/config/SqlAnalysisConfig.java | 74 ++++--------- .../analysis/extract/SqlExtractResult.java | 21 +--- .../com/jd/sql/analysis/out/OutModelEnum.java | 20 +--- .../analysis/replace/SqlReplaceConfig.java | 14 +-- .../com/jd/sql/analysis/rule/MatchColumn.java | 12 +-- .../com/jd/sql/analysis/rule/MatchType.java | 12 +-- .../jd/sql/analysis/rule/SqlScoreRule.java | 60 +---------- .../jd/sql/analysis/score/SqlScoreResult.java | 44 +------- .../analysis/score/SqlScoreResultDetail.java | 36 +------ .../jd/sql/analysis/util/DuccMonitorUtil.java | 18 ++-- .../jd/sql/analysis/util/KeyNodeLogModel.java | 54 +--------- .../jd/sql/analysis/util/MysqlVersion.java | 12 +-- 16 files changed, 108 insertions(+), 437 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResult.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResult.java index 92221eb..5a29068 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResult.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResult.java @@ -1,10 +1,15 @@ package com.jd.sql.analysis.analysis; +import lombok.Getter; +import lombok.Setter; + /** * @Author huhaitao21 * @Description sql 分析结果dto * @Date 20:41 2022/11/1 **/ +@Setter +@Getter public class SqlAnalysisResult { /** @@ -71,99 +76,4 @@ public class SqlAnalysisResult { */ private String extra; - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getSelectType() { - return selectType; - } - - public void setSelectType(String selectType) { - this.selectType = selectType; - } - - public String getTable() { - return table; - } - - public void setTable(String table) { - this.table = table; - } - - public String getPartitions() { - return partitions; - } - - public void setPartitions(String partitions) { - this.partitions = partitions; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getPossibleKeys() { - return possibleKeys; - } - - public void setPossibleKeys(String possibleKeys) { - this.possibleKeys = possibleKeys; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getKeyLen() { - return keyLen; - } - - public void setKeyLen(String keyLen) { - this.keyLen = keyLen; - } - - public String getRef() { - return ref; - } - - public void setRef(String ref) { - this.ref = ref; - } - - public String getRows() { - return rows; - } - - public void setRows(String rows) { - this.rows = rows; - } - - public Double getFiltered() { - return filtered; - } - - public void setFiltered(Double filtered) { - this.filtered = filtered; - } - - public String getExtra() { - return extra; - } - - public void setExtra(String extra) { - this.extra = extra; - } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResultList.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResultList.java index 449bb3d..3fc07bf 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResultList.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResultList.java @@ -1,5 +1,8 @@ package com.jd.sql.analysis.analysis; +import lombok.Getter; +import lombok.Setter; + import java.util.List; /** @@ -7,6 +10,8 @@ * @Description sql 分析结果 集合 * @Date 20:41 2022/11/1 **/ +@Setter +@Getter public class SqlAnalysisResultList { /** @@ -14,11 +19,4 @@ public class SqlAnalysisResultList { */ private List resultList; - public List getResultList() { - return resultList; - } - - public void setResultList(List resultList) { - this.resultList = resultList; - } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java index 0b94c35..683c4bd 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java @@ -1,10 +1,15 @@ package com.jd.sql.analysis.analysis; +import lombok.Getter; +import lombok.Setter; + /** * @Author huhaitao21 * @Description sql 分析组件支持分析的sql类型 * @Date 19:36 2022/11/3 **/ +@Setter +@Getter public enum SqlAnalysisSqlTypeEnum { SELECT("SELECT", "查询"), @@ -29,19 +34,4 @@ public enum SqlAnalysisSqlTypeEnum { private String description; - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java b/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java index fdde24d..464caee 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java @@ -1,5 +1,6 @@ package com.jd.sql.analysis.config; +import lombok.Getter; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,26 +17,31 @@ public class JmqConfig { /** * 应用 */ + @Getter private static String app; /** * 用户 */ + @Getter private static String user; /** * 密码 */ + @Getter private static String password; /** * mq地址 */ + @Getter private static String address; /** * 发送topic */ + @Getter private static String topic; /** @@ -106,43 +112,23 @@ public static boolean initMqProducer(){ } } - public static String getApp() { - return app; - } - - public static void setApp(String app) { + public static void setApp(String app) { JmqConfig.app = app; } - public static String getUser() { - return user; - } - - public static void setUser(String user) { + public static void setUser(String user) { JmqConfig.user = user; } - public static String getPassword() { - return password; - } - - public static void setPassword(String password) { + public static void setPassword(String password) { JmqConfig.password = password; } - public static String getAddress() { - return address; - } - - public static void setAddress(String address) { + public static void setAddress(String address) { JmqConfig.address = address; } - public static String getTopic() { - return topic; - } - - public static void setTopic(String topic) { + public static void setTopic(String topic) { JmqConfig.topic = topic; } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/config/SqlAnalysisConfig.java b/sql-analysis/src/main/java/com/jd/sql/analysis/config/SqlAnalysisConfig.java index f1ec0f3..b80688d 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/config/SqlAnalysisConfig.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/config/SqlAnalysisConfig.java @@ -3,6 +3,7 @@ import com.jd.sql.analysis.analysis.SqlAnalysisSqlTypeEnum; import com.jd.sql.analysis.rule.SqlScoreRule; import com.jd.sql.analysis.util.DuccMonitorUtil; +import lombok.Getter; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -25,53 +26,63 @@ public class SqlAnalysisConfig { /** * 分析开关,默认关闭 */ + @Getter private static Boolean analysisSwitch = false; /** * 一个id 只检查一次,默认开启 */ + @Getter private static Boolean onlyCheckOnce = true; /** * 两次检查间隔 默认 5分钟 */ + @Getter private static Long checkInterval = 5 * 60 * 1000L; /** * 例外sql id,集合 */ + @Getter private static List exceptSqlIds = new ArrayList<>(); /** * 进行分析的sql类型 */ + @Getter private static List sqlType = new ArrayList<>(); /** * 评分规则加载类, 默认 com.jd.sql.analysis.rule.SqlScoreRuleLoaderDefault */ + @Getter private static String scoreRuleLoadClass; /** * 分析结果输出类,默认日志模式 com.jd.sql.analysis.out.SqlScoreResultOutServiceDefault */ + @Getter private static String outputModel; /** * 分析结果输出类,默认日志模式 com.jd.sql.analysis.out.SqlScoreResultOutServiceDefault */ + @Getter private static String outputClass; /** * 应用名称 */ + @Getter private static String appName; /** * sqlReplaceModelSwitch */ + @Getter private static Boolean sqlReplaceModelSwitch; @@ -123,6 +134,7 @@ public class SqlAnalysisConfig { /** * 评分规则列表 */ + @Getter private static List ruleList = new ArrayList<>(); @@ -193,83 +205,39 @@ public static void init(Properties properties){ } - public static Boolean getAnalysisSwitch() { - return analysisSwitch; - } - - public static void setAnalysisSwitch(Boolean analysisSwitch) { + public static void setAnalysisSwitch(Boolean analysisSwitch) { SqlAnalysisConfig.analysisSwitch = analysisSwitch; } - public static Boolean getOnlyCheckOnce() { - return onlyCheckOnce; - } - - public static void setOnlyCheckOnce(Boolean onlyCheckOnce) { + public static void setOnlyCheckOnce(Boolean onlyCheckOnce) { SqlAnalysisConfig.onlyCheckOnce = onlyCheckOnce; } - public static Long getCheckInterval() { - return checkInterval; - } - - public static void setCheckInterval(Long checkInterval) { + public static void setCheckInterval(Long checkInterval) { SqlAnalysisConfig.checkInterval = checkInterval; } - public static List getExceptSqlIds() { - return exceptSqlIds; - } - - public static void setExceptSqlIds(List exceptSqlIds) { + public static void setExceptSqlIds(List exceptSqlIds) { SqlAnalysisConfig.exceptSqlIds = exceptSqlIds; } - public static List getSqlType() { - return sqlType; - } - - public static void setSqlType(List sqlType) { + public static void setSqlType(List sqlType) { SqlAnalysisConfig.sqlType = sqlType; } - public static String getScoreRuleLoadClass() { - return scoreRuleLoadClass; - } - - public static String getOutputClass() { - return outputClass; - } - - public static List getRuleList() { - return ruleList; - } - - public static void setRuleList(List ruleList) { + public static void setRuleList(List ruleList) { SqlAnalysisConfig.ruleList = ruleList; } - public static String getOutputModel() { - return outputModel; - } - - public static void setOutputModel(String outputModel) { + public static void setOutputModel(String outputModel) { SqlAnalysisConfig.outputModel = outputModel; } - public static String getAppName() { - return appName; - } - - public static void setAppName(String appName) { + public static void setAppName(String appName) { SqlAnalysisConfig.appName = appName; } - public static Boolean getSqlReplaceModelSwitch() { - return sqlReplaceModelSwitch; - } - - public static void setSqlReplaceModelSwitch(Boolean sqlReplaceModelSwitch) { + public static void setSqlReplaceModelSwitch(Boolean sqlReplaceModelSwitch) { SqlAnalysisConfig.sqlReplaceModelSwitch = sqlReplaceModelSwitch; } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtractResult.java b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtractResult.java index e75bbf3..07d39b0 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtractResult.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtractResult.java @@ -1,10 +1,15 @@ package com.jd.sql.analysis.extract; +import lombok.Getter; +import lombok.Setter; + /** * @Author huhaitao21 * @Description sql 提取结果 * @Date 10:09 2022/11/7 **/ +@Setter +@Getter public class SqlExtractResult { /** @@ -18,20 +23,4 @@ public class SqlExtractResult { private String sourceSql; - public String getSqlId() { - return sqlId; - } - - public void setSqlId(String sqlId) { - this.sqlId = sqlId; - } - - public String getSourceSql() { - return sourceSql; - } - - public void setSourceSql(String sourceSql) { - this.sourceSql = sourceSql; - } - } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java index e6f6b03..bb66d3f 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java @@ -1,10 +1,15 @@ package com.jd.sql.analysis.out; +import lombok.Getter; +import lombok.Setter; + /** * @Author huhaitao21 * @Description 分析结果输出模式 * @Date 14:15 2023/2/8 **/ +@Setter +@Getter public enum OutModelEnum { LOG("LOG", "日志方式输出"), MQ("MQ", "发送mq"), @@ -27,19 +32,4 @@ public enum OutModelEnum { */ private String modelDesc; - public String getModelType() { - return modelType; - } - - public void setModelType(String modelType) { - this.modelType = modelType; - } - - public String getModelDesc() { - return modelDesc; - } - - public void setModelDesc(String modelDesc) { - this.modelDesc = modelDesc; - } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java b/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java index 6e68cc1..52d716f 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java @@ -2,6 +2,7 @@ import com.jd.sql.analysis.util.DuccMonitorUtil; import com.jd.sql.analysis.util.GsonUtil; +import lombok.Getter; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,7 +21,13 @@ public class SqlReplaceConfig { /** * 配置明细 + * -- GETTER -- + * 获取sql替换映射对象 + * + * @return + */ + @Getter private static HashMap sqlReplaceMap = new HashMap<>(); /** @@ -49,11 +56,4 @@ public static String getReplaceSqlBySqlId(String sqlId){ return null; } - /** - * 获取sql替换映射对象 - * @return - */ - public static HashMap getSqlReplaceMap() { - return sqlReplaceMap; - } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java index d89e180..09228d4 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java @@ -1,10 +1,15 @@ package com.jd.sql.analysis.rule; +import lombok.Getter; +import lombok.Setter; + /** * @Author huhaitao21 * @Description 匹配列 * @Date 15:50 2022/11/9 **/ +@Setter +@Getter public enum MatchColumn { SELECT_TYPE("selectType"), TABLE("table"), @@ -27,11 +32,4 @@ public enum MatchColumn { this.column = column; } - public String getColumn() { - return column; - } - - public void setColumn(String column) { - this.column = column; - } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java index c814dea..ec44f02 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java @@ -1,10 +1,15 @@ package com.jd.sql.analysis.rule; +import lombok.Getter; +import lombok.Setter; + /** * @Author huhaitao21 * @Description 匹配类型 * @Date 15:50 2022/11/9 **/ +@Setter +@Getter public enum MatchType { EQUAL("等于"), GREATER("大于"), @@ -20,11 +25,4 @@ public enum MatchType { this.type = type; } - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRule.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRule.java index 3134165..b6ef4a6 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRule.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRule.java @@ -1,10 +1,15 @@ package com.jd.sql.analysis.rule; +import lombok.Getter; +import lombok.Setter; + /** * @Author huhaitao21 * @Description 评分规则 * @Date 15:13 2022/11/9 **/ +@Setter +@Getter public class SqlScoreRule { /** @@ -43,59 +48,4 @@ public class SqlScoreRule { */ private Boolean strict ; - public MatchColumn getMatchColumn() { - return matchColumn; - } - - public void setMatchColumn(MatchColumn matchColumn) { - this.matchColumn = matchColumn; - } - - public String getMatchValue() { - return matchValue; - } - - public void setMatchValue(String matchValue) { - this.matchValue = matchValue; - } - - public MatchType getMatchType() { - return matchType; - } - - public void setMatchType(MatchType matchType) { - this.matchType = matchType; - } - - public Integer getScoreDeduction() { - return scoreDeduction; - } - - public void setScoreDeduction(Integer scoreDeduction) { - this.scoreDeduction = scoreDeduction; - } - - public String getReason() { - return reason; - } - - public void setReason(String reason) { - this.reason = reason; - } - - public String getSuggestion() { - return suggestion; - } - - public void setSuggestion(String suggestion) { - this.suggestion = suggestion; - } - - public Boolean getStrict() { - return strict; - } - - public void setStrict(Boolean strict) { - this.strict = strict; - } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResult.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResult.java index 5fd2c80..8cf6caa 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResult.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResult.java @@ -1,5 +1,8 @@ package com.jd.sql.analysis.score; +import lombok.Getter; +import lombok.Setter; + import java.util.List; /** @@ -7,6 +10,8 @@ * @Description sql 评分结果 * @Date 18:33 2022/11/2 **/ +@Setter +@Getter public class SqlScoreResult { /** @@ -34,43 +39,4 @@ public class SqlScoreResult { */ List analysisResults; - public String getSqlId() { - return sqlId; - } - - public void setSqlId(String sqlId) { - this.sqlId = sqlId; - } - - public String getSourceSql() { - return sourceSql; - } - - public void setSourceSql(String sourceSql) { - this.sourceSql = sourceSql; - } - - public Boolean getNeedWarn() { - return needWarn; - } - - public void setNeedWarn(Boolean needWarn) { - this.needWarn = needWarn; - } - - public Integer getScore() { - return score; - } - - public void setScore(Integer score) { - this.score = score; - } - - public List getAnalysisResults() { - return analysisResults; - } - - public void setAnalysisResults(List analysisResults) { - this.analysisResults = analysisResults; - } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResultDetail.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResultDetail.java index 9b31de4..5832b7c 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResultDetail.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResultDetail.java @@ -1,10 +1,15 @@ package com.jd.sql.analysis.score; +import lombok.Getter; +import lombok.Setter; + /** * @Author huhaitao21 * @Description sql 评分结果 * @Date 18:33 2022/11/2 **/ +@Setter +@Getter public class SqlScoreResultDetail { /** @@ -29,35 +34,4 @@ public class SqlScoreResultDetail { private Boolean strict ; - public Integer getScoreDeduction() { - return scoreDeduction; - } - - public void setScoreDeduction(Integer scoreDeduction) { - this.scoreDeduction = scoreDeduction; - } - - public String getReason() { - return reason; - } - - public void setReason(String reason) { - this.reason = reason; - } - - public String getSuggestion() { - return suggestion; - } - - public void setSuggestion(String suggestion) { - this.suggestion = suggestion; - } - - public Boolean getStrict() { - return strict; - } - - public void setStrict(Boolean strict) { - this.strict = strict; - } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/DuccMonitorUtil.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/DuccMonitorUtil.java index 41f076d..b2edf1c 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/DuccMonitorUtil.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/DuccMonitorUtil.java @@ -1,5 +1,6 @@ package com.jd.sql.analysis.util; +import lombok.Getter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,7 +13,14 @@ public class DuccMonitorUtil { private static final Logger log = LoggerFactory.getLogger(DuccMonitorUtil.class); - private static final String duccConfig = ""; + /** + * -- GETTER -- + * 获取ducc配置 + * + * @return + */ + @Getter + private static final String duccConfig = ""; /** * 启动监控 @@ -59,12 +67,4 @@ public static void start(String appName,String uri,String moniterKey){ } - /** - * 获取ducc配置 - * @return - */ - public static String getDuccConfig(){ - return duccConfig; - } - } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogModel.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogModel.java index 29ddb1c..74b8311 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogModel.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogModel.java @@ -1,6 +1,8 @@ package com.jd.sql.analysis.util; import lombok.Builder; +import lombok.Getter; +import lombok.Setter; import java.util.Date; @@ -9,6 +11,8 @@ * @Description 关键节点日志模型 * @Date 16:45 2021/4/9 **/ +@Setter +@Getter @Builder public class KeyNodeLogModel { @@ -45,55 +49,7 @@ public KeyNodeLogModel(){ */ private String describe; - public String getBusinessId() { - return businessId; - } - - public void setBusinessId(String businessId) { - this.businessId = businessId; - } - - public String getModuleName() { - return moduleName; - } - - public void setModuleName(String moduleName) { - this.moduleName = moduleName; - } - - public String getNodeName() { - return nodeName; - } - - public void setNodeName(String nodeName) { - this.nodeName = nodeName; - } - - public Date getBusinessTime() { - return businessTime; - } - - public void setBusinessTime(Date businessTime) { - this.businessTime = businessTime; - } - - public Date getLogTime() { - return logTime; - } - - public void setLogTime(Date logTime) { - this.logTime = logTime; - } - - public String getDescribe() { - return describe; - } - - public void setDescribe(String describe) { - this.describe = describe; - } - - public KeyNodeLogModel(String businessId, String moduleName, String nodeName, Date businessTime, Date logTime, String describe) { + public KeyNodeLogModel(String businessId, String moduleName, String nodeName, Date businessTime, Date logTime, String describe) { this.businessId = businessId; this.moduleName = moduleName; this.nodeName = nodeName; diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java index e11a16b..85676ba 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java @@ -1,10 +1,15 @@ package com.jd.sql.analysis.util; +import lombok.Getter; +import lombok.Setter; + /** * @Author huhaitao21 * @Description //TODO * @Date 20:06 2023/3/16 **/ +@Setter +@Getter public enum MysqlVersion { MYSQL_5_6("MYSQL_5.6"), @@ -17,11 +22,4 @@ public enum MysqlVersion { private String version; - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } } From 29447bac28904aaaa7da8ed4c91ec33d09dba4ae Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 09:39:58 -0300 Subject: [PATCH 21/30] chore: md format cleanup --- README.md | 52 +++++++------------ ...06\346\210\220\346\211\213\345\206\214.md" | 37 +++++++------ 2 files changed, 39 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 3e9f740..792cdaf 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,6 @@ Mybatis-SQL分析组件 **2、线上出现慢sql后,无法快速止损** - - # 解决思路 **1、把问题解决在上线之前,最好的办法就是在测试阶段,甚至在开发阶段就发现一个sql的好坏** @@ -20,26 +18,19 @@ Mybatis-SQL分析组件 部门内部,目前大部分数据库框架采用的mybatis,然后基于mybatis本身的实现机制中,开发一个mybatis组件,可以自动对运行的sql进行提取和分析,定制一套默认的分析规则,让sql在开发环境和测试环境执行的时候,就能够做初步的评估,把有问题的慢sql在这个阶段暴露出来;同时具备sql替换功能,在线上出现问题sql的时候,可以通过ducc配置快速完成对一个sql的在线替换,大大降低线上问题的止损时间。 - - # 开源方案调研 -目前,主流的sql分析组件,核心功能主要放在了两个方向:1、慢sql的分析和优化建议 2、sql的优化重写功能,而且主要偏运维的辅助功能无法做到无侵入的和应用代码进行集成。也就无法实现我们的核心痛点,慢sql提前分析预警和动态sql替换。 +目前,主流的sql分析组件,核心功能主要放在了两个方向:1、慢sql的分析和优化建议 +2、sql的优化重写功能,而且主要偏运维的辅助功能无法做到无侵入的和应用代码进行集成。也就无法实现我们的核心痛点,慢sql提前分析预警和动态sql替换。 ![img](https://github.com/huht123/sql-analysis-img/blob/main/%E5%AF%B9%E6%AF%94%E5%9B%BE.png) - - # 设计方案 **核心功能:SQL分析预警能力、SQL替换能力** - - ![img](https://github.com/huht123/sql-analysis-img/blob/main/%E8%AE%BE%E8%AE%A1%E5%9B%BE.png) - - # 详细设计 主要分为8个功能模块 @@ -74,8 +65,6 @@ Mybatis-SQL分析组件 ## 1、引入依赖jar包 - - ``` io.github.huht123.sql-analysis @@ -100,22 +89,22 @@ Mybatis-SQL分析组件 ``` + 注意:如果使用了多个mybatis组件,建议把该组件放在最前面,防止其它组件对mybatis相关对象进行二次包装,无法获取对应的数据 ## 3、核心配置项 -| 属性 | 用途 | 是否必填 | 默认值 | 备注 | -| --------------------- | ------------------------------------------ | -------- | ------------------ | --------------------------- | -| analysisSwitch | 是否开启分析功能 | 是 | false | | -| onlyCheckOnce | 是否对一个sqlid只分析一次 | 非 | true | | -| checkInterval | 每个sqlid分析间隔 | 非 | 300000毫秒 | onlyCheckOnce 为false才生效 | -| exceptSqlIds | 需要过滤不分析的sqlid | 非 | | | -| sqlType | 分析的sql类型 | 非 | 默认select、update | 支持 | -| scoreRuleLoadClass | 评分规则加载器,用于扩展自定义规则 | 非 | | | -| outModel | 默认输出方式 | 非 | 默认值:LOG | 支持LOG、MQ两种方式 | -| outputClass | 评分结果输出类,用于扩展自定义结果输出方式 | 非 | | | -| sqlReplaceModelSwitch | sql替换模块是否开启 | 非 | 默认 false | | - +| 属性 | 用途 | 是否必填 | 默认值 | 备注 | +|-----------------------|-----------------------|------|-----------------|-------------------------| +| analysisSwitch | 是否开启分析功能 | 是 | false | | +| onlyCheckOnce | 是否对一个sqlid只分析一次 | 非 | true | | +| checkInterval | 每个sqlid分析间隔 | 非 | 300000毫秒 | onlyCheckOnce 为false才生效 | +| exceptSqlIds | 需要过滤不分析的sqlid | 非 | | | +| sqlType | 分析的sql类型 | 非 | 默认select、update | 支持 | +| scoreRuleLoadClass | 评分规则加载器,用于扩展自定义规则 | 非 | | | +| outModel | 默认输出方式 | 非 | 默认值:LOG | 支持LOG、MQ两种方式 | +| outputClass | 评分结果输出类,用于扩展自定义结果输出方式 | 非 | | | +| sqlReplaceModelSwitch | sql替换模块是否开启 | 非 | 默认 false | | ## 4、实践使用方案 @@ -131,7 +120,6 @@ Mybatis-SQL分析组件 ``` - ### 2、慢sql分析-日志输出+mq输出+es存储+Kibana分析 ``` @@ -144,11 +132,11 @@ Mybatis-SQL分析组件 ``` + 实现该接口,自定义输出方式(需要自己保证输出性能,可以采用异步队列) com.jd.sql.analysis.out.SqlScoreResultOutService - ### 3、慢sql替换-配置动态更新sql语句 ``` @@ -160,14 +148,13 @@ Mybatis-SQL分析组件 ``` + 可以集成自己环境的配置中心,通过如下方法或者映射map动态更新 com.jd.sql.analysis.replace.SqlReplaceConfig.getSqlReplaceMap 注意:功能正式修复后,需去掉该配置,该功能仅供应急处理线上问题,不建议作为功能长期使用 - - # 性能测试 测试环境千次普通sql查询,每种场景进行了5次测试 @@ -182,16 +169,12 @@ Mybatis-SQL分析组件 基本无影响 - - # 适用场景 1、慢sql预防 2、线上问题止损 - - # 优势 1、核心优势:执行时分析sql,区别于传统的依赖sql执行耗时来评估慢sql,直接基于语法和索引进行前置分析,不仅能预防某些坏sql在上线后发现是慢sql,还能给出sql优化建议,可以大限度的避免线上产生慢sql。支持动态对线上sql进行替换,可以对线上问题快速止损。 @@ -202,10 +185,11 @@ Mybatis-SQL分析组件 4、成本:接入成本低,无代码侵入。 - # 主要贡献者: + 扈海涛(huhaitao21@jd.com)、杨超(yangchao341@jd.com)、张泽龙(zhangzelong10@jd.com) # 欢迎共同改进和使用咨询 + 扈海涛(huhaitao21@jd.com) diff --git "a/\351\233\206\346\210\220\346\211\213\345\206\214.md" "b/\351\233\206\346\210\220\346\211\213\345\206\214.md" index 836550b..929508b 100644 --- "a/\351\233\206\346\210\220\346\211\213\345\206\214.md" +++ "b/\351\233\206\346\210\220\346\211\213\345\206\214.md" @@ -1,20 +1,25 @@ ## 一、maven依赖添加 ## + io.github.huht123.sql-analysis sql-analysis 1.0 + ## 二、配置组件 ## - + ### 方式一:xml配置 + 注意:如果使用了多个mybatis组件,建议把该组件放在最前面,防止其它组件对mybatis相关对象进行二次包装,无法获取对应的数据 + ### 方式二:yml配置 + mybatis.configuration.interceptors=com.github.pagehelper.PageInterceptor,com.jd.rd.intl.mybatis.plugin.condition.ConditionAdderPlugin - + ```` public class MyBatisInterceptorConfiguration { @Bean @@ -30,24 +35,22 @@ ## 三、核心配置属性 -| 属性 | 用途 | 是否必填 | 默认值 | 备注 | -| --------------------- | ------------------------------------------ | -------- | ------------------ | --------------------------- | -| analysisSwitch | 是否开启分析功能 | 是 | false | | -| onlyCheckOnce | 是否对一个sqlid只分析一次 | 非 | true | | -| checkInterval | 每个sqlid分析间隔 | 非 | 300000毫秒 | onlyCheckOnce 为false才生效 | -| exceptSqlIds | 需要过滤不分析的sqlid | 非 | | | -| sqlType | 分析的sql类型 | 非 | 默认select、update | 支持 | -| scoreRuleLoadClass | 评分规则加载器,用于扩展自定义规则 | 非 | | | -| outModel | 默认输出方式 | 非 | 默认值:LOG | 支持LOG、MQ两种方式 | -| outputClass | 评分结果输出类,用于扩展自定义结果输出方式 | 非 | | | -| sqlReplaceModelSwitch | sql替换模块是否开启 | 非 | 默认 false | | - - +| 属性 | 用途 | 是否必填 | 默认值 | 备注 | +|-----------------------|-----------------------|------|-----------------|-------------------------| +| analysisSwitch | 是否开启分析功能 | 是 | false | | +| onlyCheckOnce | 是否对一个sqlid只分析一次 | 非 | true | | +| checkInterval | 每个sqlid分析间隔 | 非 | 300000毫秒 | onlyCheckOnce 为false才生效 | +| exceptSqlIds | 需要过滤不分析的sqlid | 非 | | | +| sqlType | 分析的sql类型 | 非 | 默认select、update | 支持 | +| scoreRuleLoadClass | 评分规则加载器,用于扩展自定义规则 | 非 | | | +| outModel | 默认输出方式 | 非 | 默认值:LOG | 支持LOG、MQ两种方式 | +| outputClass | 评分结果输出类,用于扩展自定义结果输出方式 | 非 | | | +| sqlReplaceModelSwitch | sql替换模块是否开启 | 非 | 默认 false | | ## 四、自定义SQL评分规则(覆盖内置规则) + classpath路径下添加:sql-analysis-rule-config.properties - rule1.condition=param.type == \"ALL\" rule1.priority=1 rule1.score=40 @@ -90,5 +93,7 @@ classpath路径下添加:sql-analysis-rule-config.properties rule6.reason="遍历行数较少" rule6.suggestion="暂不需要优化" rule6.strict=false + ## 五、常见问题 + ### 1、其它mybatis组件,如果重写了mybatis内置对象,可能影响它 From f340a2ebdc58f716bde30e1bd45659e6549f59ac Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 10:23:08 -0300 Subject: [PATCH 22/30] fix: enum final vars --- .../com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java | 4 ++-- .../src/main/java/com/jd/sql/analysis/out/OutModelEnum.java | 4 ++-- .../src/main/java/com/jd/sql/analysis/rule/MatchColumn.java | 2 +- .../src/main/java/com/jd/sql/analysis/rule/MatchType.java | 2 +- .../src/main/java/com/jd/sql/analysis/util/MysqlVersion.java | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java index 683c4bd..02d7fad 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java @@ -26,12 +26,12 @@ public enum SqlAnalysisSqlTypeEnum { /** * sql类型 */ - private String type; + private final String type; /** * 描述 */ - private String description; + private final String description; } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java index bb66d3f..5c6bbb7 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java @@ -25,11 +25,11 @@ public enum OutModelEnum { /** * 模式类型 */ - private String modelType; + private final String modelType; /** * 模式描述 */ - private String modelDesc; + private final String modelDesc; } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java index 09228d4..4c3779a 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java @@ -26,7 +26,7 @@ public enum MatchColumn { /** * 匹配字段 */ - private String column; + private final String column; MatchColumn(String column){ this.column = column; diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java index ec44f02..d749af2 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java @@ -19,7 +19,7 @@ public enum MatchType { /** * 匹配类型 */ - private String type; + private final String type; MatchType(String type){ this.type = type; diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java index 85676ba..a6b33e5 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java @@ -20,6 +20,6 @@ public enum MysqlVersion { this.version = version; } - private String version; + private final String version; } From 9bd5e6bb0b7e572fc61fa37c3df626041eceb738 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 10:49:26 -0300 Subject: [PATCH 23/30] fix: this can be simplified --- .../java/com/jd/sql/analysis/config/JmqConfig.java | 10 +++------- .../com/jd/sql/analysis/replace/SqlReplaceConfig.java | 9 +++------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java b/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java index 464caee..02e8d61 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java @@ -90,13 +90,9 @@ private static boolean checkConfig(Properties properties) { if(properties==null){ return false; } - if(StringUtils.isBlank(properties.getProperty(MQ_APP)) || StringUtils.isBlank(properties.getProperty(MQ_USER)) || - StringUtils.isBlank(properties.getProperty(MQ_PASSWORD)) || StringUtils.isBlank(properties.getProperty(MQ_ADDRESS)) - || StringUtils.isBlank(properties.getProperty(MQ_TOPIC))){ - return false; - } - - return true; + return !StringUtils.isBlank(properties.getProperty(MQ_APP)) && !StringUtils.isBlank(properties.getProperty(MQ_USER)) && + !StringUtils.isBlank(properties.getProperty(MQ_PASSWORD)) && !StringUtils.isBlank(properties.getProperty(MQ_ADDRESS)) + && !StringUtils.isBlank(properties.getProperty(MQ_TOPIC)); } /** diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java b/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java index 52d716f..3652224 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java @@ -23,9 +23,6 @@ public class SqlReplaceConfig { * 配置明细 * -- GETTER -- * 获取sql替换映射对象 - * - * @return - */ @Getter private static HashMap sqlReplaceMap = new HashMap<>(); @@ -37,7 +34,7 @@ public static void initConfig(){ try{ String configStr = DuccMonitorUtil.getDuccConfig(); if(StringUtils.isNotBlank(configStr)){ - sqlReplaceMap = GsonUtil.json2Bean(configStr,HashMap.class); + sqlReplaceMap = GsonUtil.json2Bean(configStr,HashMap.class); } }catch (Exception e){ log.error("sql analysis replace config init error :",e); @@ -46,8 +43,8 @@ public static void initConfig(){ /** * 根据sqlid 获取替换sql - * @param sqlId - * @return + * @param sqlId id + * @return 替换sql */ public static String getReplaceSqlBySqlId(String sqlId){ if(StringUtils.isNotBlank(sqlId) && Objects.nonNull(sqlReplaceMap)){ From bf07b49c9d7a1450621004857c7713b0c187e4e7 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 10:51:23 -0300 Subject: [PATCH 24/30] fix: deprecated --- .../com/jd/sql/analysis/score/SqlScoreServiceDefault.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java index 293b629..73cd532 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java @@ -17,6 +17,7 @@ * @Author huhaitao21 * @Description 评分服务默认实现 * @Date 20:43 2022/11/1 + * @deprecated **/ @Deprecated public class SqlScoreServiceDefault implements SqlScoreService { @@ -45,10 +46,10 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { } //综合评分计算 - return getSqlScoreResult(score, scoreResult, analysisResults, WARN_SCORE, logger); + return getSqlScoreResult(score, scoreResult, analysisResults); } - static SqlScoreResult getSqlScoreResult(int score, SqlScoreResult scoreResult, List analysisResults, Integer warnScore, Logger logger) { + static SqlScoreResult getSqlScoreResult(int score, SqlScoreResult scoreResult, List analysisResults) { for (SqlScoreResultDetail detail : analysisResults) { score = score - detail.getScoreDeduction(); if (score < 0) { @@ -56,7 +57,7 @@ static SqlScoreResult getSqlScoreResult(int score, SqlScoreResult scoreResult, L score = 0; } - scoreResult.setNeedWarn(score < warnScore); + scoreResult.setNeedWarn(score < SqlScoreServiceDefault.WARN_SCORE); } scoreResult.setScore(score); scoreResult.setAnalysisResults(analysisResults); From c86c23d8fdaf45a88feda1f616b62de0358919f7 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 11:14:24 -0300 Subject: [PATCH 25/30] fix: var --- .../com/jd/sql/analysis/score/SqlScoreServiceDefault.java | 7 +++---- .../jd/sql/analysis/score/SqlScoreServiceRulesEngine.java | 5 +++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java index 73cd532..f96076d 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java @@ -17,7 +17,6 @@ * @Author huhaitao21 * @Description 评分服务默认实现 * @Date 20:43 2022/11/1 - * @deprecated **/ @Deprecated public class SqlScoreServiceDefault implements SqlScoreService { @@ -46,10 +45,10 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { } //综合评分计算 - return getSqlScoreResult(score, scoreResult, analysisResults); + return getSqlScoreResult(score, scoreResult, analysisResults, WARN_SCORE); } - static SqlScoreResult getSqlScoreResult(int score, SqlScoreResult scoreResult, List analysisResults) { + static SqlScoreResult getSqlScoreResult(int score, SqlScoreResult scoreResult, List analysisResults, Integer warnScore) { for (SqlScoreResultDetail detail : analysisResults) { score = score - detail.getScoreDeduction(); if (score < 0) { @@ -57,7 +56,7 @@ static SqlScoreResult getSqlScoreResult(int score, SqlScoreResult scoreResult, L score = 0; } - scoreResult.setNeedWarn(score < SqlScoreServiceDefault.WARN_SCORE); + scoreResult.setNeedWarn(score < warnScore); } scoreResult.setScore(score); scoreResult.setAnalysisResults(analysisResults); diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java index ea00a92..75f4137 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java @@ -3,7 +3,6 @@ import com.jd.sql.analysis.analysis.SqlAnalysisResult; import com.jd.sql.analysis.analysis.SqlAnalysisResultList; import com.jd.sql.analysis.rule.RulesEngineExecutor; -import com.jd.sql.analysis.util.GsonUtil; import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,6 +10,8 @@ import java.util.ArrayList; import java.util.List; +import static com.jd.sql.analysis.score.SqlScoreServiceDefault.getSqlScoreResult; + /** * @Author huhaitao21 * @Description 采用规则引擎计算评分实现方式 @@ -42,7 +43,7 @@ public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { } //综合评分计算 - return getSqlScoreResult(score, scoreResult, analysisResults, WARN_SCORE, logger); + return getSqlScoreResult(score, scoreResult, analysisResults, WARN_SCORE); } private List matchRuleEngine(SqlAnalysisResult result) { From d2db0bae5a2e094d91d69b317fd3690b50451071 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 11:32:52 -0300 Subject: [PATCH 26/30] fix: lombok setters --- .../src/main/java/com/jd/sql/analysis/out/OutModelEnum.java | 1 - .../src/main/java/com/jd/sql/analysis/rule/MatchColumn.java | 1 - .../src/main/java/com/jd/sql/analysis/rule/MatchType.java | 1 - .../src/main/java/com/jd/sql/analysis/util/MysqlVersion.java | 1 - 4 files changed, 4 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java index 5c6bbb7..9819514 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java @@ -8,7 +8,6 @@ * @Description 分析结果输出模式 * @Date 14:15 2023/2/8 **/ -@Setter @Getter public enum OutModelEnum { LOG("LOG", "日志方式输出"), diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java index 4c3779a..5d51677 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java @@ -8,7 +8,6 @@ * @Description 匹配列 * @Date 15:50 2022/11/9 **/ -@Setter @Getter public enum MatchColumn { SELECT_TYPE("selectType"), diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java index d749af2..18a0946 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java @@ -8,7 +8,6 @@ * @Description 匹配类型 * @Date 15:50 2022/11/9 **/ -@Setter @Getter public enum MatchType { EQUAL("等于"), diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java index a6b33e5..0654512 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java @@ -8,7 +8,6 @@ * @Description //TODO * @Date 20:06 2023/3/16 **/ -@Setter @Getter public enum MysqlVersion { From ef2f68879c98a7706073e94ffe46aa1232e3a3e6 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 13:30:34 -0300 Subject: [PATCH 27/30] chore: reformat --- .../jd/sql/analysis/analysis/SqlAnalysis.java | 293 +++++++------- .../analysis/analysis/SqlAnalysisResult.java | 126 +++--- .../analysis/SqlAnalysisResultList.java | 8 +- .../analysis/SqlAnalysisSqlTypeEnum.java | 39 +- .../com/jd/sql/analysis/config/JmqConfig.java | 199 +++++---- .../analysis/config/SqlAnalysisConfig.java | 379 ++++++++---------- .../sql/analysis/core/SqlAnalysisAspect.java | 224 +++++------ .../jd/sql/analysis/extract/SqlExtract.java | 325 ++++++++------- .../analysis/extract/SqlExtractResult.java | 16 +- .../com/jd/sql/analysis/out/OutModelEnum.java | 41 +- .../sql/analysis/out/SqlScoreResultOutMq.java | 30 +- .../analysis/out/SqlScoreResultOutMysql.java | 11 +- .../out/SqlScoreResultOutService.java | 11 +- .../out/SqlScoreResultOutServiceDefault.java | 26 +- .../jd/sql/analysis/replace/SqlReplace.java | 143 +++---- .../analysis/replace/SqlReplaceConfig.java | 71 ++-- .../com/jd/sql/analysis/rule/MatchColumn.java | 37 +- .../com/jd/sql/analysis/rule/MatchType.java | 23 +- .../jd/sql/analysis/rule/RuleFieldEnum.java | 19 +- .../analysis/rule/RulesEngineExecutor.java | 156 +++---- .../jd/sql/analysis/rule/SqlScoreRule.java | 70 ++-- .../sql/analysis/rule/SqlScoreRuleLoader.java | 8 +- .../rule/SqlScoreRuleLoaderDefault.java | 135 +++---- .../rule/SqlScoreRuleLoaderRulesEngine.java | 13 +- .../jd/sql/analysis/score/SqlScoreResult.java | 44 +- .../analysis/score/SqlScoreResultDetail.java | 40 +- .../sql/analysis/score/SqlScoreService.java | 13 +- .../score/SqlScoreServiceDefault.java | 278 ++++++------- .../score/SqlScoreServiceRulesEngine.java | 60 ++- .../jd/sql/analysis/util/DuccMonitorUtil.java | 31 +- .../com/jd/sql/analysis/util/GsonUtil.java | 42 +- .../jd/sql/analysis/util/KeyNodeLogModel.java | 74 ++-- .../jd/sql/analysis/util/KeyNodeLogUtil.java | 267 ++++++------ .../jd/sql/analysis/util/MetaObjectUtil.java | 23 +- .../jd/sql/analysis/util/MysqlVersion.java | 13 +- 35 files changed, 1627 insertions(+), 1661 deletions(-) diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java index ad5956e..21d79a3 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java @@ -1,7 +1,7 @@ package com.jd.sql.analysis.analysis; -import com.jd.sql.analysis.util.GsonUtil; import com.jd.sql.analysis.extract.SqlExtractResult; +import com.jd.sql.analysis.util.GsonUtil; import com.jd.sql.analysis.util.MysqlVersion; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -21,148 +21,151 @@ **/ public class SqlAnalysis { - private static final Logger logger = LoggerFactory.getLogger(SqlAnalysis.class); - - /** - * mysql 版本标识 - */ - private static String mysqlVersion; - - /** - * sql 分析 - * @return - */ - public static SqlAnalysisResultList analysis(SqlExtractResult sqlExtractResult, Connection connection){ - if(sqlExtractResult==null){ - return null; - } - String sourceSql = sqlExtractResult.getSourceSql(); - - - List resultList = new ArrayList<>(); - SqlAnalysisResult sqlAnalysisResutlDto = null; - - //包装分析语句 - String analysisSql = getAnalysisSql(sourceSql); - PreparedStatement pstmt = null; - ResultSet rs = null; - try { - pstmt = connection.prepareStatement(analysisSql); - rs = pstmt.executeQuery(); - while (rs.next()) { - sqlAnalysisResutlDto = convertSqlAnalysisResultDto(rs); - resultList.add(sqlAnalysisResutlDto); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - try { - if (rs != null) { - rs.close(); - } - if (pstmt != null) { - pstmt.close(); - } - } catch (SQLException e) { - e.printStackTrace(); - } - } - logger.info("sql analysis result = {}", GsonUtil.bean2Json(sqlAnalysisResutlDto)); - SqlAnalysisResultList sqlAnalysisResultList = new SqlAnalysisResultList(); - sqlAnalysisResultList.setResultList(resultList); - return sqlAnalysisResultList; - } - - - /** - * 分析结果转换 分析结果dto - * @param resultSet - * @return - */ - private static SqlAnalysisResult convertSqlAnalysisResultDto(ResultSet resultSet) { - SqlAnalysisResult sqlAnalysisResult = new SqlAnalysisResult(); - if(resultSet == null){ - return null; - } - try { - if(StringUtils.isBlank(mysqlVersion)){ - mysqlVersion = getMysqlVersion(resultSet); - } - Long id = resultSet.getLong("id"); - String selectType = resultSet.getString("select_type"); - String table = resultSet.getString("table"); - String type = resultSet.getString("type"); - String possibleKeys = resultSet.getString("possible_keys"); - String key = resultSet.getString("key"); - String keyLen = resultSet.getString("key_len"); - String ref = resultSet.getString("ref"); - String rows = resultSet.getString("rows"); - String extra = resultSet.getString("Extra"); - - sqlAnalysisResult.setId(id); - sqlAnalysisResult.setSelectType(selectType); - sqlAnalysisResult.setTable(table); - sqlAnalysisResult.setType(type); - sqlAnalysisResult.setPossibleKeys(possibleKeys); - sqlAnalysisResult.setKey(key); - sqlAnalysisResult.setKeyLen(keyLen); - sqlAnalysisResult.setRef(ref); - sqlAnalysisResult.setRows(rows); - sqlAnalysisResult.setExtra(extra); - if(mysqlVersion.equals(MysqlVersion.MYSQL_5_7.getVersion())){ - Double filtered = resultSet.getDouble("filtered"); - String partitions = resultSet.getString("partitions"); - sqlAnalysisResult.setPartitions(partitions); - sqlAnalysisResult.setFiltered(filtered); - } - - } catch (SQLException e) { - logger.error("sql analysis convert error",e); - e.printStackTrace(); - } - return sqlAnalysisResult; - } - - /** - * 获取sql分析语句 - * @param sql 拦截前的sql - * @return - */ - private static String getAnalysisSql(String sql) { - sql = "explain " + sql; - return sql; - } - - /** - * 判断查询结果集中是否存在某列 - * @param rs 查询结果集 - * @param columnName 列名 - * @return true 存在; false 不存咋 - */ - public boolean isExistColumn(ResultSet rs, String columnName) { - try { - if (rs.findColumn(columnName) > 0 ) { - return true; - } - } - catch (SQLException e) { - return false; - } - - return false; - } - - public static String getMysqlVersion(ResultSet rs){ - //根据返回字段数识别5.6 或者 5.7以上版本 - String mysqlVersion = MysqlVersion.MYSQL_5_6.getVersion(); - try { - int columnCount = rs.getMetaData().getColumnCount(); - if(columnCount>10){ - mysqlVersion = MysqlVersion.MYSQL_5_7.getVersion(); - } - } catch (Exception e) { - logger.error("sql analysis 获取mysql版本异常",e); - } - return mysqlVersion; - } + private static final Logger logger = LoggerFactory.getLogger(SqlAnalysis.class); + + /** + * mysql 版本标识 + */ + private static String mysqlVersion; + + /** + * sql 分析 + * + * @return + */ + public static SqlAnalysisResultList analysis(SqlExtractResult sqlExtractResult, Connection connection) { + if (sqlExtractResult == null) { + return null; + } + String sourceSql = sqlExtractResult.getSourceSql(); + + + List resultList = new ArrayList<>(); + SqlAnalysisResult sqlAnalysisResutlDto = null; + + //包装分析语句 + String analysisSql = getAnalysisSql(sourceSql); + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + pstmt = connection.prepareStatement(analysisSql); + rs = pstmt.executeQuery(); + while (rs.next()) { + sqlAnalysisResutlDto = convertSqlAnalysisResultDto(rs); + resultList.add(sqlAnalysisResutlDto); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + try { + if (rs != null) { + rs.close(); + } + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + logger.info("sql analysis result = {}", GsonUtil.bean2Json(sqlAnalysisResutlDto)); + SqlAnalysisResultList sqlAnalysisResultList = new SqlAnalysisResultList(); + sqlAnalysisResultList.setResultList(resultList); + return sqlAnalysisResultList; + } + + + /** + * 分析结果转换 分析结果dto + * + * @param resultSet + * @return + */ + private static SqlAnalysisResult convertSqlAnalysisResultDto(ResultSet resultSet) { + SqlAnalysisResult sqlAnalysisResult = new SqlAnalysisResult(); + if (resultSet == null) { + return null; + } + try { + if (StringUtils.isBlank(mysqlVersion)) { + mysqlVersion = getMysqlVersion(resultSet); + } + Long id = resultSet.getLong("id"); + String selectType = resultSet.getString("select_type"); + String table = resultSet.getString("table"); + String type = resultSet.getString("type"); + String possibleKeys = resultSet.getString("possible_keys"); + String key = resultSet.getString("key"); + String keyLen = resultSet.getString("key_len"); + String ref = resultSet.getString("ref"); + String rows = resultSet.getString("rows"); + String extra = resultSet.getString("Extra"); + + sqlAnalysisResult.setId(id); + sqlAnalysisResult.setSelectType(selectType); + sqlAnalysisResult.setTable(table); + sqlAnalysisResult.setType(type); + sqlAnalysisResult.setPossibleKeys(possibleKeys); + sqlAnalysisResult.setKey(key); + sqlAnalysisResult.setKeyLen(keyLen); + sqlAnalysisResult.setRef(ref); + sqlAnalysisResult.setRows(rows); + sqlAnalysisResult.setExtra(extra); + if (mysqlVersion.equals(MysqlVersion.MYSQL_5_7.getVersion())) { + Double filtered = resultSet.getDouble("filtered"); + String partitions = resultSet.getString("partitions"); + sqlAnalysisResult.setPartitions(partitions); + sqlAnalysisResult.setFiltered(filtered); + } + + } catch (SQLException e) { + logger.error("sql analysis convert error", e); + e.printStackTrace(); + } + return sqlAnalysisResult; + } + + /** + * 获取sql分析语句 + * + * @param sql 拦截前的sql + * @return + */ + private static String getAnalysisSql(String sql) { + sql = "explain " + sql; + return sql; + } + + public static String getMysqlVersion(ResultSet rs) { + //根据返回字段数识别5.6 或者 5.7以上版本 + String mysqlVersion = MysqlVersion.MYSQL_5_6.getVersion(); + try { + int columnCount = rs.getMetaData().getColumnCount(); + if (columnCount > 10) { + mysqlVersion = MysqlVersion.MYSQL_5_7.getVersion(); + } + } catch (Exception e) { + logger.error("sql analysis 获取mysql版本异常", e); + } + return mysqlVersion; + } + + /** + * 判断查询结果集中是否存在某列 + * + * @param rs 查询结果集 + * @param columnName 列名 + * @return true 存在; false 不存咋 + */ + public boolean isExistColumn(ResultSet rs, String columnName) { + try { + if (rs.findColumn(columnName) > 0) { + return true; + } + } catch (SQLException e) { + return false; + } + + return false; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResult.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResult.java index 5a29068..859845e 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResult.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResult.java @@ -12,68 +12,68 @@ @Getter public class SqlAnalysisResult { - /** - * 执行序号 - */ - private Long id; - - /** - * 查询类型 - */ - private String selectType; - - /** - * 表名称 - */ - private String table; - - - /** - * 分区 - */ - private String partitions; - - /** - * 访问类型 - * 依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL, - * 除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引 - */ - private String type; - - /** - *查询可能使用到的索引都会在这里列出来,但不一 定被查询实际使用 - */ - private String possibleKeys; - - /** - *查询真正使用到的索引,select_type为index_merge时,这里可能出现两个以上的索引,其他的select_type这里只会出现一个。如果为NULL,则没有使用索引。 - */ - private String key; - - /** - *表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度 - */ - private String keyLen; - - /** - *如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段, - * 如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func - */ - private String ref; - - /** - *这里是执行计划中估算的扫描行数,不是精确值 - */ - private String rows; - - /** - *返回结果的行数占读取行数的百分比,值越大越好 - */ - private Double filtered; - - /** - *重点关注:using filesort和using temporary - */ - private String extra; + /** + * 执行序号 + */ + private Long id; + + /** + * 查询类型 + */ + private String selectType; + + /** + * 表名称 + */ + private String table; + + + /** + * 分区 + */ + private String partitions; + + /** + * 访问类型 + * 依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL, + * 除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引 + */ + private String type; + + /** + * 查询可能使用到的索引都会在这里列出来,但不一 定被查询实际使用 + */ + private String possibleKeys; + + /** + * 查询真正使用到的索引,select_type为index_merge时,这里可能出现两个以上的索引,其他的select_type这里只会出现一个。如果为NULL,则没有使用索引。 + */ + private String key; + + /** + * 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度 + */ + private String keyLen; + + /** + * 如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段, + * 如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func + */ + private String ref; + + /** + * 这里是执行计划中估算的扫描行数,不是精确值 + */ + private String rows; + + /** + * 返回结果的行数占读取行数的百分比,值越大越好 + */ + private Double filtered; + + /** + * 重点关注:using filesort和using temporary + */ + private String extra; } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResultList.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResultList.java index 3fc07bf..36a3ed4 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResultList.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisResultList.java @@ -14,9 +14,9 @@ @Getter public class SqlAnalysisResultList { - /** - * 分析结果集合 - */ - private List resultList; + /** + * 分析结果集合 + */ + private List resultList; } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java index 02d7fad..f4116ec 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java @@ -12,26 +12,25 @@ @Getter public enum SqlAnalysisSqlTypeEnum { - SELECT("SELECT", "查询"), - UPDATE("UPDATE", "更新"), - INSERT("INSERT", "插入"), - DELETE("DELETE", "删除"); - - - SqlAnalysisSqlTypeEnum(String type, String description) { - this.type = type; - this.description = description; - } - - /** - * sql类型 - */ - private final String type; - - /** - * 描述 - */ - private final String description; + SELECT("SELECT", "查询"), + UPDATE("UPDATE", "更新"), + INSERT("INSERT", "插入"), + DELETE("DELETE", "删除"); + + + /** + * sql类型 + */ + private final String type; + /** + * 描述 + */ + private final String description; + + SqlAnalysisSqlTypeEnum(String type, String description) { + this.type = type; + this.description = description; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java b/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java index 02e8d61..f3caa51 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/config/JmqConfig.java @@ -13,118 +13,109 @@ * @Date 18:20 2023/2/9 **/ public class JmqConfig { - private static final Logger logger = LoggerFactory.getLogger(JmqConfig.class); - /** - * 应用 - */ - @Getter - private static String app; - - /** - * 用户 - */ - @Getter - private static String user; - - /** - * 密码 - */ - @Getter - private static String password; - - /** - * mq地址 - */ - @Getter - private static String address; - - /** - * 发送topic - */ - @Getter - private static String topic; - - /** - * 应用名称配置key - */ - private static final String MQ_APP = "mqApp"; - - /** - * 用户配置key - */ - private static final String MQ_USER = "mqUser"; - - /** - * 密码配置key - */ - private static final String MQ_PASSWORD = "mqPassword"; - - /** - * mq地址配置key - */ - private static final String MQ_ADDRESS = "mqAddress"; - - /** - * topic - */ - private static final String MQ_TOPIC = "mqTopic"; - - - /** - * 初始化配置 - * @param properties - */ - public static void initConfig(Properties properties) { - //检查参数 初始化参数 - boolean result = checkConfig(properties); - if(result){ - app = properties.getProperty(MQ_APP); - user = properties.getProperty(MQ_USER); - password = properties.getProperty(MQ_PASSWORD); - address = properties.getProperty(MQ_ADDRESS); - topic = properties.getProperty(MQ_TOPIC); - } - } - - private static boolean checkConfig(Properties properties) { - if(properties==null){ - return false; - } - return !StringUtils.isBlank(properties.getProperty(MQ_APP)) && !StringUtils.isBlank(properties.getProperty(MQ_USER)) && - !StringUtils.isBlank(properties.getProperty(MQ_PASSWORD)) && !StringUtils.isBlank(properties.getProperty(MQ_ADDRESS)) - && !StringUtils.isBlank(properties.getProperty(MQ_TOPIC)); - } - - /** - * 启动生产者 - */ - public static boolean initMqProducer(){ - try{ - //todo 初始化生产者 - return true; - }catch (Exception e){ - logger.error("sql analysis mq config init error"); - return false; - } - } + private static final Logger logger = LoggerFactory.getLogger(JmqConfig.class); + /** + * 应用名称配置key + */ + private static final String MQ_APP = "mqApp"; + /** + * 用户配置key + */ + private static final String MQ_USER = "mqUser"; + /** + * 密码配置key + */ + private static final String MQ_PASSWORD = "mqPassword"; + /** + * mq地址配置key + */ + private static final String MQ_ADDRESS = "mqAddress"; + /** + * topic + */ + private static final String MQ_TOPIC = "mqTopic"; + /** + * 应用 + */ + @Getter + private static String app; + /** + * 用户 + */ + @Getter + private static String user; + /** + * 密码 + */ + @Getter + private static String password; + /** + * mq地址 + */ + @Getter + private static String address; + /** + * 发送topic + */ + @Getter + private static String topic; + + /** + * 初始化配置 + * + * @param properties + */ + public static void initConfig(Properties properties) { + //检查参数 初始化参数 + boolean result = checkConfig(properties); + if (result) { + app = properties.getProperty(MQ_APP); + user = properties.getProperty(MQ_USER); + password = properties.getProperty(MQ_PASSWORD); + address = properties.getProperty(MQ_ADDRESS); + topic = properties.getProperty(MQ_TOPIC); + } + } + + private static boolean checkConfig(Properties properties) { + if (properties == null) { + return false; + } + return !StringUtils.isBlank(properties.getProperty(MQ_APP)) && !StringUtils.isBlank(properties.getProperty(MQ_USER)) && + !StringUtils.isBlank(properties.getProperty(MQ_PASSWORD)) && !StringUtils.isBlank(properties.getProperty(MQ_ADDRESS)) + && !StringUtils.isBlank(properties.getProperty(MQ_TOPIC)); + } + + /** + * 启动生产者 + */ + public static boolean initMqProducer() { + try { + //todo 初始化生产者 + return true; + } catch (Exception e) { + logger.error("sql analysis mq config init error"); + return false; + } + } public static void setApp(String app) { - JmqConfig.app = app; - } + JmqConfig.app = app; + } public static void setUser(String user) { - JmqConfig.user = user; - } + JmqConfig.user = user; + } public static void setPassword(String password) { - JmqConfig.password = password; - } + JmqConfig.password = password; + } public static void setAddress(String address) { - JmqConfig.address = address; - } + JmqConfig.address = address; + } public static void setTopic(String topic) { - JmqConfig.topic = topic; - } + JmqConfig.topic = topic; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/config/SqlAnalysisConfig.java b/sql-analysis/src/main/java/com/jd/sql/analysis/config/SqlAnalysisConfig.java index b80688d..c184963 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/config/SqlAnalysisConfig.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/config/SqlAnalysisConfig.java @@ -21,223 +21,200 @@ public class SqlAnalysisConfig { - private static final Logger logger = LoggerFactory.getLogger(SqlAnalysisConfig.class); - - /** - * 分析开关,默认关闭 - */ - @Getter - private static Boolean analysisSwitch = false; - - /** - * 一个id 只检查一次,默认开启 - */ - @Getter - private static Boolean onlyCheckOnce = true; - - /** - * 两次检查间隔 默认 5分钟 - */ - @Getter - private static Long checkInterval = 5 * 60 * 1000L; - - /** - * 例外sql id,集合 - */ - @Getter - private static List exceptSqlIds = new ArrayList<>(); - - /** - * 进行分析的sql类型 - */ - @Getter - private static List sqlType = new ArrayList<>(); - - - /** - * 评分规则加载类, 默认 com.jd.sql.analysis.rule.SqlScoreRuleLoaderDefault - */ - @Getter - private static String scoreRuleLoadClass; - - /** - * 分析结果输出类,默认日志模式 com.jd.sql.analysis.out.SqlScoreResultOutServiceDefault - */ - @Getter - private static String outputModel; - - /** - * 分析结果输出类,默认日志模式 com.jd.sql.analysis.out.SqlScoreResultOutServiceDefault - */ - @Getter - private static String outputClass; - - - /** - * 应用名称 - */ - @Getter - private static String appName; - - /** - * sqlReplaceModelSwitch - */ - @Getter - private static Boolean sqlReplaceModelSwitch; - - - /** - * 分析开关 配置key - */ - private static final String ANALYSIS_SWITCH_KEY = "analysisSwitch"; - - /** - * 同一id是否只检查一次 配置key - */ - private static final String ONLY_CHECK_ONCE = "onlyCheckOnce"; - - /** - * 检查间隔时间 配置key - */ - private static final String CHECK_INTERVAL = "checkInterval"; - - /** - * 例外sql id 配置key,多个需要逗号分隔 - */ - private static final String EXCEPT_SQL_IDS_KEY = "exceptSqlIds"; - - /** - * 分析开关 配置key ,多个需要逗号分隔 - */ - private static final String SQL_TYPE_KEY = "sqlType"; - - /** - * 规则加载类 配置key - */ - private static final String SCORE_RULE_LOAD_KEY = "scoreRuleLoadClass"; - - /** - * 评分输出类 配置key - */ - private static final String OUTPUT_CLASS_KEY = "outputClass"; - - /** - * 输出模式 配置key - */ - private static final String OUTPUT_MODEL_KEY = "outputModel"; - - /** - * 应用名称 - */ - private static final String APP_NAME = "appName"; - - /** - * 评分规则列表 - */ - @Getter - private static List ruleList = new ArrayList<>(); - - - - /** - * 初始化配置 - * @param properties - */ - public static void init(Properties properties){ - try{ - //加载 需要分析的sql类型 - if(StringUtils.isBlank(properties.getProperty(SQL_TYPE_KEY))){ - //默认 ,select 、update - sqlType.add(SqlAnalysisSqlTypeEnum.SELECT.getType()); - sqlType.add(SqlAnalysisSqlTypeEnum.UPDATE.getType()); - }else{ - String[] sqlTypes = properties.getProperty(SQL_TYPE_KEY).split(","); - CollectionUtils.addAll(sqlType,sqlTypes); - } - - if(StringUtils.isNotBlank(properties.getProperty(ANALYSIS_SWITCH_KEY))){ - analysisSwitch = Boolean.valueOf(properties.getProperty(ANALYSIS_SWITCH_KEY)); - } - if(StringUtils.isNotBlank(properties.getProperty(ONLY_CHECK_ONCE))){ - onlyCheckOnce = Boolean.valueOf(properties.getProperty(ONLY_CHECK_ONCE)); - } - if(StringUtils.isNotBlank(properties.getProperty(CHECK_INTERVAL))){ - checkInterval = Long.valueOf(properties.getProperty(CHECK_INTERVAL)); - } - if(StringUtils.isNotBlank(properties.getProperty(SCORE_RULE_LOAD_KEY))){ - scoreRuleLoadClass = properties.getProperty(SCORE_RULE_LOAD_KEY); - } - if(StringUtils.isNotBlank(properties.getProperty(OUTPUT_CLASS_KEY))){ - outputClass = properties.getProperty(OUTPUT_CLASS_KEY); - } - if(StringUtils.isNotBlank(properties.getProperty(OUTPUT_MODEL_KEY))){ - outputModel = properties.getProperty(OUTPUT_MODEL_KEY); - } - - if(StringUtils.isNotBlank(properties.getProperty(EXCEPT_SQL_IDS_KEY))){ - String[] exceptIds = properties.getProperty(EXCEPT_SQL_IDS_KEY).split(","); - CollectionUtils.addAll(exceptSqlIds,exceptIds); - } - - if(StringUtils.isNotBlank(properties.getProperty(APP_NAME))){ - appName = properties.getProperty(APP_NAME); - }else{ - appName = "default"; - } - - if(StringUtils.isNotBlank(properties.getProperty("sqlReplaceModelSwitch"))){ - sqlReplaceModelSwitch = Boolean.valueOf(properties.getProperty("sqlReplaceModelSwitch")); - } - - //初始化mq配置 - JmqConfig.initConfig(properties); - - //初始化ducc配置 - if(sqlReplaceModelSwitch!=null && sqlReplaceModelSwitch && StringUtils.isNotBlank(properties.getProperty("duccAppName")) - && StringUtils.isNotBlank(properties.getProperty("duccUri")) - && StringUtils.isNotBlank(properties.getProperty("duccMonitorKey"))){ - DuccMonitorUtil.start(properties.getProperty("duccAppName"),properties.getProperty("duccUri"),properties.getProperty("duccMonitorKey")); - } - - }catch (Exception e){ - logger.error("sql analysis config init error",e); - } - - } + private static final Logger logger = LoggerFactory.getLogger(SqlAnalysisConfig.class); + /** + * 分析开关 配置key + */ + private static final String ANALYSIS_SWITCH_KEY = "analysisSwitch"; + /** + * 同一id是否只检查一次 配置key + */ + private static final String ONLY_CHECK_ONCE = "onlyCheckOnce"; + /** + * 检查间隔时间 配置key + */ + private static final String CHECK_INTERVAL = "checkInterval"; + /** + * 例外sql id 配置key,多个需要逗号分隔 + */ + private static final String EXCEPT_SQL_IDS_KEY = "exceptSqlIds"; + /** + * 分析开关 配置key ,多个需要逗号分隔 + */ + private static final String SQL_TYPE_KEY = "sqlType"; + /** + * 规则加载类 配置key + */ + private static final String SCORE_RULE_LOAD_KEY = "scoreRuleLoadClass"; + /** + * 评分输出类 配置key + */ + private static final String OUTPUT_CLASS_KEY = "outputClass"; + /** + * 输出模式 配置key + */ + private static final String OUTPUT_MODEL_KEY = "outputModel"; + /** + * 应用名称 + */ + private static final String APP_NAME = "appName"; + /** + * 分析开关,默认关闭 + */ + @Getter + private static Boolean analysisSwitch = false; + /** + * 一个id 只检查一次,默认开启 + */ + @Getter + private static Boolean onlyCheckOnce = true; + /** + * 两次检查间隔 默认 5分钟 + */ + @Getter + private static Long checkInterval = 5 * 60 * 1000L; + /** + * 例外sql id,集合 + */ + @Getter + private static List exceptSqlIds = new ArrayList<>(); + /** + * 进行分析的sql类型 + */ + @Getter + private static List sqlType = new ArrayList<>(); + /** + * 评分规则加载类, 默认 com.jd.sql.analysis.rule.SqlScoreRuleLoaderDefault + */ + @Getter + private static String scoreRuleLoadClass; + /** + * 分析结果输出类,默认日志模式 com.jd.sql.analysis.out.SqlScoreResultOutServiceDefault + */ + @Getter + private static String outputModel; + /** + * 分析结果输出类,默认日志模式 com.jd.sql.analysis.out.SqlScoreResultOutServiceDefault + */ + @Getter + private static String outputClass; + /** + * 应用名称 + */ + @Getter + private static String appName; + /** + * sqlReplaceModelSwitch + */ + @Getter + private static Boolean sqlReplaceModelSwitch; + /** + * 评分规则列表 + */ + @Getter + private static List ruleList = new ArrayList<>(); + + + /** + * 初始化配置 + * + * @param properties + */ + public static void init(Properties properties) { + try { + //加载 需要分析的sql类型 + if (StringUtils.isBlank(properties.getProperty(SQL_TYPE_KEY))) { + //默认 ,select 、update + sqlType.add(SqlAnalysisSqlTypeEnum.SELECT.getType()); + sqlType.add(SqlAnalysisSqlTypeEnum.UPDATE.getType()); + } else { + String[] sqlTypes = properties.getProperty(SQL_TYPE_KEY).split(","); + CollectionUtils.addAll(sqlType, sqlTypes); + } + + if (StringUtils.isNotBlank(properties.getProperty(ANALYSIS_SWITCH_KEY))) { + analysisSwitch = Boolean.valueOf(properties.getProperty(ANALYSIS_SWITCH_KEY)); + } + if (StringUtils.isNotBlank(properties.getProperty(ONLY_CHECK_ONCE))) { + onlyCheckOnce = Boolean.valueOf(properties.getProperty(ONLY_CHECK_ONCE)); + } + if (StringUtils.isNotBlank(properties.getProperty(CHECK_INTERVAL))) { + checkInterval = Long.valueOf(properties.getProperty(CHECK_INTERVAL)); + } + if (StringUtils.isNotBlank(properties.getProperty(SCORE_RULE_LOAD_KEY))) { + scoreRuleLoadClass = properties.getProperty(SCORE_RULE_LOAD_KEY); + } + if (StringUtils.isNotBlank(properties.getProperty(OUTPUT_CLASS_KEY))) { + outputClass = properties.getProperty(OUTPUT_CLASS_KEY); + } + if (StringUtils.isNotBlank(properties.getProperty(OUTPUT_MODEL_KEY))) { + outputModel = properties.getProperty(OUTPUT_MODEL_KEY); + } + + if (StringUtils.isNotBlank(properties.getProperty(EXCEPT_SQL_IDS_KEY))) { + String[] exceptIds = properties.getProperty(EXCEPT_SQL_IDS_KEY).split(","); + CollectionUtils.addAll(exceptSqlIds, exceptIds); + } + + if (StringUtils.isNotBlank(properties.getProperty(APP_NAME))) { + appName = properties.getProperty(APP_NAME); + } else { + appName = "default"; + } + + if (StringUtils.isNotBlank(properties.getProperty("sqlReplaceModelSwitch"))) { + sqlReplaceModelSwitch = Boolean.valueOf(properties.getProperty("sqlReplaceModelSwitch")); + } + + //初始化mq配置 + JmqConfig.initConfig(properties); + + //初始化ducc配置 + if (sqlReplaceModelSwitch != null && sqlReplaceModelSwitch && StringUtils.isNotBlank(properties.getProperty("duccAppName")) + && StringUtils.isNotBlank(properties.getProperty("duccUri")) + && StringUtils.isNotBlank(properties.getProperty("duccMonitorKey"))) { + DuccMonitorUtil.start(properties.getProperty("duccAppName"), properties.getProperty("duccUri"), properties.getProperty("duccMonitorKey")); + } + + } catch (Exception e) { + logger.error("sql analysis config init error", e); + } + + } public static void setAnalysisSwitch(Boolean analysisSwitch) { - SqlAnalysisConfig.analysisSwitch = analysisSwitch; - } + SqlAnalysisConfig.analysisSwitch = analysisSwitch; + } public static void setOnlyCheckOnce(Boolean onlyCheckOnce) { - SqlAnalysisConfig.onlyCheckOnce = onlyCheckOnce; - } + SqlAnalysisConfig.onlyCheckOnce = onlyCheckOnce; + } public static void setCheckInterval(Long checkInterval) { - SqlAnalysisConfig.checkInterval = checkInterval; - } + SqlAnalysisConfig.checkInterval = checkInterval; + } public static void setExceptSqlIds(List exceptSqlIds) { - SqlAnalysisConfig.exceptSqlIds = exceptSqlIds; - } + SqlAnalysisConfig.exceptSqlIds = exceptSqlIds; + } public static void setSqlType(List sqlType) { - SqlAnalysisConfig.sqlType = sqlType; - } + SqlAnalysisConfig.sqlType = sqlType; + } public static void setRuleList(List ruleList) { - SqlAnalysisConfig.ruleList = ruleList; - } + SqlAnalysisConfig.ruleList = ruleList; + } public static void setOutputModel(String outputModel) { - SqlAnalysisConfig.outputModel = outputModel; - } + SqlAnalysisConfig.outputModel = outputModel; + } public static void setAppName(String appName) { - SqlAnalysisConfig.appName = appName; - } + SqlAnalysisConfig.appName = appName; + } public static void setSqlReplaceModelSwitch(Boolean sqlReplaceModelSwitch) { - SqlAnalysisConfig.sqlReplaceModelSwitch = sqlReplaceModelSwitch; - } + SqlAnalysisConfig.sqlReplaceModelSwitch = sqlReplaceModelSwitch; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java b/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java index 4a9fcd6..060ebf0 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/core/SqlAnalysisAspect.java @@ -39,121 +39,119 @@ * @Date 22:47 2022/10/25 **/ @Intercepts({@Signature( - type = StatementHandler.class, - method = "prepare", - args = {Connection.class, Integer.class} + type = StatementHandler.class, + method = "prepare", + args = {Connection.class, Integer.class} ), @Signature( - type = Executor.class, - method = "update", - args = {MappedStatement.class, Object.class} -),@Signature( - type = Executor.class, - method = "query", - args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class} + type = Executor.class, + method = "update", + args = {MappedStatement.class, Object.class} +), @Signature( + type = Executor.class, + method = "query", + args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class} )}) public class SqlAnalysisAspect implements Interceptor { - final Logger logger = LoggerFactory.getLogger(SqlAnalysisAspect.class); - - /** - * 评分规则服务 - */ - private static final SqlScoreService sqlScoreService = new SqlScoreServiceRulesEngine(); - - /** - * 评分结果输出服务 - */ - private static SqlScoreResultOutService sqlScoreResultOut = new SqlScoreResultOutServiceDefault(); - - @Override - public Object intercept(Invocation invocation) throws Throwable { - try { - Object firstArg = invocation.getArgs()[0]; - - if(SqlAnalysisConfig.getSqlReplaceModelSwitch()!=null && SqlAnalysisConfig.getSqlReplaceModelSwitch() && firstArg instanceof MappedStatement){ - //sql替换模块 - MappedStatement mappedStatement = (MappedStatement)firstArg; - String replaceSql = SqlReplaceConfig.getReplaceSqlBySqlId(mappedStatement.getId()); - if(StringUtils.isNotBlank(replaceSql)){ - SqlReplace.replace(invocation,replaceSql); - } - }else if(SqlAnalysisConfig.getAnalysisSwitch() && firstArg instanceof Connection){ - //sql 分析模块 - //获取入参statement - StatementHandler statementHandler = (StatementHandler)invocation.getTarget(); - - //提取待执行的完整sql语句 - SqlExtractResult sqlExtractResult = SqlExtract.extract(statementHandler); - if(sqlExtractResult!=null){ - //对sql进行分析 - Connection connection = (Connection)invocation.getArgs()[0]; - SqlAnalysisResultList resultList = SqlAnalysis.analysis(sqlExtractResult,connection); - - //对分析结果进行评估 - SqlScoreResult sqlScoreResult = sqlScoreService.score(resultList); - if(sqlScoreResult!=null){ - sqlScoreResult.setSqlId(sqlExtractResult.getSqlId()); - sqlScoreResult.setSourceSql(sqlExtractResult.getSourceSql()); - - //输出评分结果 - sqlScoreResultOut.outResult(sqlScoreResult); - }else{ - logger.error("sql analysis score error {},{}", GsonUtil.bean2Json(resultList),GsonUtil.bean2Json(sqlExtractResult)); - } - } - } - }catch (Exception e) { - logger.error("sql analysis error ",e); - } - // 执行完上面的任务后,不改变原有的sql执行过程 - return invocation.proceed(); - } - - @Override - public Object plugin(Object target) { - return Plugin.wrap(target, this); - } - - @Override - public void setProperties(Properties properties) { - //初始化配置 - SqlAnalysisConfig.init(properties); - - //初始化评分规则 - SqlScoreRuleLoader sqlScoreRuleLoader = new SqlScoreRuleLoaderRulesEngine(); - if(StringUtils.isNotBlank(SqlAnalysisConfig.getScoreRuleLoadClass())){ - try { - sqlScoreRuleLoader = (SqlScoreRuleLoader)Class.forName(SqlAnalysisConfig.getScoreRuleLoadClass()).newInstance(); - } catch (Exception e) { - e.printStackTrace(); - logger.error("sql analysis init score mode error",e); - } - } - boolean loadScoreRuleRes= sqlScoreRuleLoader.loadScoreRule(); - if(!loadScoreRuleRes){ - logger.error("sql analysis loadScoreRule exception"); - } - //初始化输出服务 - //mq方式输出 - if(StringUtils.isNotBlank(SqlAnalysisConfig.getOutputModel()) && SqlAnalysisConfig.getOutputModel().toUpperCase().equals(OutModelEnum.MQ.getModelType())){ - try { - boolean result = JmqConfig.initMqProducer(); - if(result){ - sqlScoreResultOut = new SqlScoreResultOutMq(); - } - } catch (Exception e) { - e.printStackTrace(); - logger.error("sql analysis init mq out mode error",e); - } - } - //自定义方式输出 - if(StringUtils.isNotBlank(SqlAnalysisConfig.getOutputClass())){ - try { - sqlScoreResultOut = (SqlScoreResultOutService)Class.forName(SqlAnalysisConfig.getOutputClass()).newInstance(); - } catch (Exception e) { - e.printStackTrace(); - logger.error("sql analysis init out mode error",e); - } - } - } + /** + * 评分规则服务 + */ + private static final SqlScoreService sqlScoreService = new SqlScoreServiceRulesEngine(); + /** + * 评分结果输出服务 + */ + private static SqlScoreResultOutService sqlScoreResultOut = new SqlScoreResultOutServiceDefault(); + final Logger logger = LoggerFactory.getLogger(SqlAnalysisAspect.class); + + @Override + public Object intercept(Invocation invocation) throws Throwable { + try { + Object firstArg = invocation.getArgs()[0]; + + if (SqlAnalysisConfig.getSqlReplaceModelSwitch() != null && SqlAnalysisConfig.getSqlReplaceModelSwitch() && firstArg instanceof MappedStatement) { + //sql替换模块 + MappedStatement mappedStatement = (MappedStatement) firstArg; + String replaceSql = SqlReplaceConfig.getReplaceSqlBySqlId(mappedStatement.getId()); + if (StringUtils.isNotBlank(replaceSql)) { + SqlReplace.replace(invocation, replaceSql); + } + } else if (SqlAnalysisConfig.getAnalysisSwitch() && firstArg instanceof Connection) { + //sql 分析模块 + //获取入参statement + StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); + + //提取待执行的完整sql语句 + SqlExtractResult sqlExtractResult = SqlExtract.extract(statementHandler); + if (sqlExtractResult != null) { + //对sql进行分析 + Connection connection = (Connection) invocation.getArgs()[0]; + SqlAnalysisResultList resultList = SqlAnalysis.analysis(sqlExtractResult, connection); + + //对分析结果进行评估 + SqlScoreResult sqlScoreResult = sqlScoreService.score(resultList); + if (sqlScoreResult != null) { + sqlScoreResult.setSqlId(sqlExtractResult.getSqlId()); + sqlScoreResult.setSourceSql(sqlExtractResult.getSourceSql()); + + //输出评分结果 + sqlScoreResultOut.outResult(sqlScoreResult); + } else { + logger.error("sql analysis score error {},{}", GsonUtil.bean2Json(resultList), GsonUtil.bean2Json(sqlExtractResult)); + } + } + } + } catch (Exception e) { + logger.error("sql analysis error ", e); + } + // 执行完上面的任务后,不改变原有的sql执行过程 + return invocation.proceed(); + } + + @Override + public Object plugin(Object target) { + return Plugin.wrap(target, this); + } + + @Override + public void setProperties(Properties properties) { + //初始化配置 + SqlAnalysisConfig.init(properties); + + //初始化评分规则 + SqlScoreRuleLoader sqlScoreRuleLoader = new SqlScoreRuleLoaderRulesEngine(); + if (StringUtils.isNotBlank(SqlAnalysisConfig.getScoreRuleLoadClass())) { + try { + sqlScoreRuleLoader = (SqlScoreRuleLoader) Class.forName(SqlAnalysisConfig.getScoreRuleLoadClass()).newInstance(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("sql analysis init score mode error", e); + } + } + boolean loadScoreRuleRes = sqlScoreRuleLoader.loadScoreRule(); + if (!loadScoreRuleRes) { + logger.error("sql analysis loadScoreRule exception"); + } + //初始化输出服务 + //mq方式输出 + if (StringUtils.isNotBlank(SqlAnalysisConfig.getOutputModel()) && SqlAnalysisConfig.getOutputModel().toUpperCase().equals(OutModelEnum.MQ.getModelType())) { + try { + boolean result = JmqConfig.initMqProducer(); + if (result) { + sqlScoreResultOut = new SqlScoreResultOutMq(); + } + } catch (Exception e) { + e.printStackTrace(); + logger.error("sql analysis init mq out mode error", e); + } + } + //自定义方式输出 + if (StringUtils.isNotBlank(SqlAnalysisConfig.getOutputClass())) { + try { + sqlScoreResultOut = (SqlScoreResultOutService) Class.forName(SqlAnalysisConfig.getOutputClass()).newInstance(); + } catch (Exception e) { + e.printStackTrace(); + logger.error("sql analysis init out mode error", e); + } + } + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java index 37505b6..a3d2af6 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtract.java @@ -34,169 +34,168 @@ **/ public class SqlExtract { - private static final Logger logger = LoggerFactory.getLogger(SqlExtract.class); - - /** - * 记录sqlId-check time - */ - private static final ConcurrentHashMap checkedIdMap = new ConcurrentHashMap<>(); - - /** - * 提取完整sql - * @param statementHandler - * @return - */ - public static SqlExtractResult extract(StatementHandler statementHandler){ - - //MetaObjectUtil 通过mybatis 反射工具类,从入参提取相关对象 - //提取 PreparedStatementHandler ,用于提取 MappedStatement - MetaObject delegateMetaObject = MetaObjectUtil.forObject(statementHandler); - if(delegateMetaObject.getValue("delegate")==null){ - logger.warn("sql analysis get delegate null error,{}", GsonUtil.bean2Json(statementHandler.getBoundSql())); - return null; - } - if(!(delegateMetaObject.getValue("delegate") instanceof PreparedStatementHandler)){ - logger.info("sql analysis get delegate is not PreparedStatementHandler,{}", GsonUtil.bean2Json(statementHandler.getBoundSql())); - return null; - } - PreparedStatementHandler preparedStatementHandler = (PreparedStatementHandler)delegateMetaObject.getValue("delegate"); - //提取 MappedStatement,用于组装完成带参数sql - MetaObject metaObject = MetaObjectUtil.forObject(preparedStatementHandler); - MappedStatement mappedStatement = (MappedStatement)metaObject.getValue("mappedStatement"); - - // 获取到节点的id,即sql语句的id - String sqlId = mappedStatement.getId(); - String sqlType = mappedStatement.getSqlCommandType().name(); - logger.debug("sql analysis sqlId ={},sqlType={} " ,sqlId,sqlType); - - //判断是否需要分析 - if(!needAnalysis(sqlId,sqlType)){ - return null; - } - //记录检查时间 - checkedIdMap.put(sqlId,System.currentTimeMillis()); - - // BoundSql就是封装myBatis最终产生的sql类 - Object parameterObject = statementHandler.getParameterHandler().getParameterObject(); - BoundSql boundSql = mappedStatement.getBoundSql(parameterObject); - // 获取节点的配置 - Configuration cOnfiguration= mappedStatement.getConfiguration(); - // 获取到最终的sql语句 - String sql = getSql(cOnfiguration, boundSql); - logger.info("sql analysis sql = {}", sql); - - SqlExtractResult result = new SqlExtractResult(); - result.setSqlId(sqlId); - result.setSourceSql(sql); - return result; - } - - /** - * 是否需要分析 - * @return - */ - private static boolean needAnalysis(String sqlId,String sqlType){ - //判断检查类型 - if(!SqlAnalysisConfig.getSqlType().contains(sqlType)){ - return false; - } - - //判断 例外id - if(SqlAnalysisConfig.getExceptSqlIds().contains(sqlId)){ - return false; - } - - //onlyCheck判断 - if(SqlAnalysisConfig.getOnlyCheckOnce() && checkedIdMap.get(sqlId)!=null){ - return false; - } - - //检查间隔判断 - return checkedIdMap.get(sqlId) == null || (System.currentTimeMillis() - checkedIdMap.get(sqlId)) >= SqlAnalysisConfig.getCheckInterval(); - } - - - - - /** - * 封装了一下sql语句,使得结果返回完整xml路径下的sql语句节点id + sql语句 - */ - private static String getSql(Configuration configuration, BoundSql boundSql){ - String sql = showSql(configuration, boundSql); - StringBuilder str = new StringBuilder(100); - str.append(sql); - return str.toString(); - } - - - /** - * 进行?的替换 - * @param configuration - * @param boundSql - * @return - */ - private static String showSql(Configuration configuration, BoundSql boundSql) { - // 获取参数 - Object parameterObject = boundSql.getParameterObject(); - List parameterMappings = boundSql.getParameterMappings(); - // sql语句中多个空格都用一个空格代替 - String sql = boundSql.getSql().replaceAll("[\\s]+", " "); - if (CollectionUtils.isNotEmpty(parameterMappings) && parameterObject != null) { - // 获取类型处理器注册器,类型处理器的功能是进行java类型和数据库类型的转换 - TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); - // 如果根据parameterObject.getClass()可以找到对应的类型,则替换 - if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { - sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(parameterObject))); - } else { - // MetaObject主要是封装了originalObject对象,提供了get和set的方法用于获取和设置originalObject的属性值,主要支持对JavaBean、Collection、Map三种类型对象的操作 - MetaObject metaObject = configuration.newMetaObject(parameterObject); - for (ParameterMapping parameterMapping : parameterMappings) { - String propertyName = parameterMapping.getProperty(); - if (metaObject.hasGetter(propertyName)) { - Object obj = metaObject.getValue(propertyName); - sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(obj))); - } else if (boundSql.hasAdditionalParameter(propertyName)) { - // 该分支是动态sql - Object obj = boundSql.getAdditionalParameter(propertyName); - sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(obj))); - } else { - // 打印出缺失,提醒该参数缺失并防止错位 - sql = sql.replaceFirst("\\?", "缺失"); - } - } - } - } - return sql; - } - - /** - * 如果参数是String,则添加单引号, 如果是日期,则转换为时间格式器并加单引号; 对参数是null和不是null的情况作了处理 - * @param obj - * @return - */ - private static String getParameterValue(Object obj) - { - String value = null; - if (obj instanceof String) { - value = "'" + obj + "'"; - } else if (obj instanceof Date) { - DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA); - value = "'" + formatter.format(obj) + "'"; - } else if (obj instanceof LocalDateTime) { - value = "'" + Timestamp.valueOf((LocalDateTime) obj) + "'"; - } else if (obj instanceof LocalDate) { - value = "'" + java.sql.Date.valueOf((LocalDate) obj) + "'"; - } else if (obj instanceof LocalTime) { - value = "'" + Time.valueOf((LocalTime) obj) + "'"; - } else{ - if (obj != null) { - value = obj.toString(); - } else { - value = ""; - } - } - return value; - } + private static final Logger logger = LoggerFactory.getLogger(SqlExtract.class); + + /** + * 记录sqlId-check time + */ + private static final ConcurrentHashMap checkedIdMap = new ConcurrentHashMap<>(); + + /** + * 提取完整sql + * + * @param statementHandler + * @return + */ + public static SqlExtractResult extract(StatementHandler statementHandler) { + + //MetaObjectUtil 通过mybatis 反射工具类,从入参提取相关对象 + //提取 PreparedStatementHandler ,用于提取 MappedStatement + MetaObject delegateMetaObject = MetaObjectUtil.forObject(statementHandler); + if (delegateMetaObject.getValue("delegate") == null) { + logger.warn("sql analysis get delegate null error,{}", GsonUtil.bean2Json(statementHandler.getBoundSql())); + return null; + } + if (!(delegateMetaObject.getValue("delegate") instanceof PreparedStatementHandler)) { + logger.info("sql analysis get delegate is not PreparedStatementHandler,{}", GsonUtil.bean2Json(statementHandler.getBoundSql())); + return null; + } + PreparedStatementHandler preparedStatementHandler = (PreparedStatementHandler) delegateMetaObject.getValue("delegate"); + //提取 MappedStatement,用于组装完成带参数sql + MetaObject metaObject = MetaObjectUtil.forObject(preparedStatementHandler); + MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("mappedStatement"); + + // 获取到节点的id,即sql语句的id + String sqlId = mappedStatement.getId(); + String sqlType = mappedStatement.getSqlCommandType().name(); + logger.debug("sql analysis sqlId ={},sqlType={} ", sqlId, sqlType); + + //判断是否需要分析 + if (!needAnalysis(sqlId, sqlType)) { + return null; + } + //记录检查时间 + checkedIdMap.put(sqlId, System.currentTimeMillis()); + + // BoundSql就是封装myBatis最终产生的sql类 + Object parameterObject = statementHandler.getParameterHandler().getParameterObject(); + BoundSql boundSql = mappedStatement.getBoundSql(parameterObject); + // 获取节点的配置 + Configuration cOnfiguration = mappedStatement.getConfiguration(); + // 获取到最终的sql语句 + String sql = getSql(cOnfiguration, boundSql); + logger.info("sql analysis sql = {}", sql); + + SqlExtractResult result = new SqlExtractResult(); + result.setSqlId(sqlId); + result.setSourceSql(sql); + return result; + } + + /** + * 是否需要分析 + * + * @return + */ + private static boolean needAnalysis(String sqlId, String sqlType) { + //判断检查类型 + if (!SqlAnalysisConfig.getSqlType().contains(sqlType)) { + return false; + } + + //判断 例外id + if (SqlAnalysisConfig.getExceptSqlIds().contains(sqlId)) { + return false; + } + + //onlyCheck判断 + if (SqlAnalysisConfig.getOnlyCheckOnce() && checkedIdMap.get(sqlId) != null) { + return false; + } + + //检查间隔判断 + return checkedIdMap.get(sqlId) == null || (System.currentTimeMillis() - checkedIdMap.get(sqlId)) >= SqlAnalysisConfig.getCheckInterval(); + } + + + /** + * 封装了一下sql语句,使得结果返回完整xml路径下的sql语句节点id + sql语句 + */ + private static String getSql(Configuration configuration, BoundSql boundSql) { + String sql = showSql(configuration, boundSql); + return sql; + } + + + /** + * 进行?的替换 + * + * @param configuration + * @param boundSql + * @return + */ + private static String showSql(Configuration configuration, BoundSql boundSql) { + // 获取参数 + Object parameterObject = boundSql.getParameterObject(); + List parameterMappings = boundSql.getParameterMappings(); + // sql语句中多个空格都用一个空格代替 + String sql = boundSql.getSql().replaceAll("[\\s]+", " "); + if (CollectionUtils.isNotEmpty(parameterMappings) && parameterObject != null) { + // 获取类型处理器注册器,类型处理器的功能是进行java类型和数据库类型的转换 + TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); + // 如果根据parameterObject.getClass()可以找到对应的类型,则替换 + if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { + sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(parameterObject))); + } else { + // MetaObject主要是封装了originalObject对象,提供了get和set的方法用于获取和设置originalObject的属性值,主要支持对JavaBean、Collection、Map三种类型对象的操作 + MetaObject metaObject = configuration.newMetaObject(parameterObject); + for (ParameterMapping parameterMapping : parameterMappings) { + String propertyName = parameterMapping.getProperty(); + if (metaObject.hasGetter(propertyName)) { + Object obj = metaObject.getValue(propertyName); + sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(obj))); + } else if (boundSql.hasAdditionalParameter(propertyName)) { + // 该分支是动态sql + Object obj = boundSql.getAdditionalParameter(propertyName); + sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(obj))); + } else { + // 打印出缺失,提醒该参数缺失并防止错位 + sql = sql.replaceFirst("\\?", "缺失"); + } + } + } + } + return sql; + } + + /** + * 如果参数是String,则添加单引号, 如果是日期,则转换为时间格式器并加单引号; 对参数是null和不是null的情况作了处理 + * + * @param obj + * @return + */ + private static String getParameterValue(Object obj) { + String value = null; + if (obj instanceof String) { + value = "'" + obj + "'"; + } else if (obj instanceof Date) { + DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA); + value = "'" + formatter.format(obj) + "'"; + } else if (obj instanceof LocalDateTime) { + value = "'" + Timestamp.valueOf((LocalDateTime) obj) + "'"; + } else if (obj instanceof LocalDate) { + value = "'" + java.sql.Date.valueOf((LocalDate) obj) + "'"; + } else if (obj instanceof LocalTime) { + value = "'" + Time.valueOf((LocalTime) obj) + "'"; + } else { + if (obj != null) { + value = obj.toString(); + } else { + value = ""; + } + } + return value; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtractResult.java b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtractResult.java index 07d39b0..44fee38 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtractResult.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/extract/SqlExtractResult.java @@ -12,15 +12,15 @@ @Getter public class SqlExtractResult { - /** - * 基于mybatis 配置的sql id - */ - private String sqlId; + /** + * 基于mybatis 配置的sql id + */ + private String sqlId; - /** - * 待执行,原sql - */ - private String sourceSql; + /** + * 待执行,原sql + */ + private String sourceSql; } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java index 9819514..2ab62f1 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/OutModelEnum.java @@ -1,34 +1,31 @@ package com.jd.sql.analysis.out; import lombok.Getter; -import lombok.Setter; /** * @Author huhaitao21 - * @Description 分析结果输出模式 + * @Description 分析结果输出模式 * @Date 14:15 2023/2/8 **/ @Getter public enum OutModelEnum { - LOG("LOG", "日志方式输出"), - MQ("MQ", "发送mq"), - MYSQL("MYSQL", "mysql表存储"); - - - - OutModelEnum(String modelType, String modelDesc) { - this.modelType = modelType; - this.modelDesc = modelDesc; - } - - /** - * 模式类型 - */ - private final String modelType; - - /** - * 模式描述 - */ - private final String modelDesc; + LOG("LOG", "日志方式输出"), + MQ("MQ", "发送mq"), + MYSQL("MYSQL", "mysql表存储"); + + + /** + * 模式类型 + */ + private final String modelType; + /** + * 模式描述 + */ + private final String modelDesc; + + OutModelEnum(String modelType, String modelDesc) { + this.modelType = modelType; + this.modelDesc = modelDesc; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java index 4635479..e24b824 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMq.java @@ -11,21 +11,21 @@ **/ public class SqlScoreResultOutMq implements SqlScoreResultOutService { - private static final Logger logger = LoggerFactory.getLogger(SqlScoreResultOutMq.class); + private static final Logger logger = LoggerFactory.getLogger(SqlScoreResultOutMq.class); - @Override - public void outResult(SqlScoreResult sqlScoreResult) { - if(sqlScoreResult==null){ - return; - } - if(sqlScoreResult.getNeedWarn()!=null && sqlScoreResult.getNeedWarn()){ - //发送mq - //todo 待替换为开源组件 - logger.error("sql analysis result sqlId:{}, score:{}",sqlScoreResult.getSqlId(),sqlScoreResult.getScore()); - if(sqlScoreResult.getAnalysisResults()!=null){ - sqlScoreResult.getAnalysisResults().forEach(result-> logger.error("sql analysis result detail-reason:{},suggestion:{}",result.getReason(),result.getSuggestion())); - } - } - } + @Override + public void outResult(SqlScoreResult sqlScoreResult) { + if (sqlScoreResult == null) { + return; + } + if (sqlScoreResult.getNeedWarn() != null && sqlScoreResult.getNeedWarn()) { + //发送mq + //todo 待替换为开源组件 + logger.error("sql analysis result sqlId:{}, score:{}", sqlScoreResult.getSqlId(), sqlScoreResult.getScore()); + if (sqlScoreResult.getAnalysisResults() != null) { + sqlScoreResult.getAnalysisResults().forEach(result -> logger.error("sql analysis result detail-reason:{},suggestion:{}", result.getReason(), result.getSuggestion())); + } + } + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMysql.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMysql.java index c7967e2..c3d535d 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMysql.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutMysql.java @@ -10,11 +10,8 @@ * @Date 17:24 2022/11/7 **/ public class SqlScoreResultOutMysql implements SqlScoreResultOutService { - - private static final Logger logger = LoggerFactory.getLogger(SqlScoreResultOutMysql.class); - - @Override - public void outResult(SqlScoreResult sqlScoreResult) { - //todo 待实现 - } + @Override + public void outResult(SqlScoreResult sqlScoreResult) { + //todo 待实现 + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutService.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutService.java index 2bf6a94..d65dfb7 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutService.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutService.java @@ -9,9 +9,10 @@ **/ public interface SqlScoreResultOutService { - /** - * 输出分析结果 - * @param sqlScoreResult - */ - void outResult(SqlScoreResult sqlScoreResult); + /** + * 输出分析结果 + * + * @param sqlScoreResult + */ + void outResult(SqlScoreResult sqlScoreResult); } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java index 2b9fa0f..1597c75 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/out/SqlScoreResultOutServiceDefault.java @@ -11,18 +11,18 @@ **/ public class SqlScoreResultOutServiceDefault implements SqlScoreResultOutService { - private static final Logger logger = LoggerFactory.getLogger(SqlScoreResultOutServiceDefault.class); + private static final Logger logger = LoggerFactory.getLogger(SqlScoreResultOutServiceDefault.class); - @Override - public void outResult(SqlScoreResult sqlScoreResult) { - if(sqlScoreResult==null){ - return; - } - if(sqlScoreResult.getNeedWarn()!=null && sqlScoreResult.getNeedWarn()){ - logger.error("sql analysis result score:{}",sqlScoreResult.getScore()); - if(sqlScoreResult.getAnalysisResults()!=null){ - sqlScoreResult.getAnalysisResults().forEach(result-> logger.error("sql analysis result detail-reason:{},suggestion:{}",result.getReason(),result.getSuggestion())); - } - } - } + @Override + public void outResult(SqlScoreResult sqlScoreResult) { + if (sqlScoreResult == null) { + return; + } + if (sqlScoreResult.getNeedWarn() != null && sqlScoreResult.getNeedWarn()) { + logger.error("sql analysis result score:{}", sqlScoreResult.getScore()); + if (sqlScoreResult.getAnalysisResults() != null) { + sqlScoreResult.getAnalysisResults().forEach(result -> logger.error("sql analysis result detail-reason:{},suggestion:{}", result.getReason(), result.getSuggestion())); + } + } + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplace.java b/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplace.java index bcc2c30..8d20665 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplace.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplace.java @@ -16,75 +16,76 @@ **/ public class SqlReplace { - private static final Logger logger = LoggerFactory.getLogger(SqlReplace.class); - - public static void replace(Invocation invocation,String newSql){ - // 获取当前执行的SQL语句 - Object[] args = invocation.getArgs(); - MappedStatement mappedStatement = (MappedStatement) args[0]; - Object parameter = args[1]; - // 生成新sql - BoundSql boundSql = mappedStatement.getBoundSql(parameter); - BoundSql newBoundSql = new BoundSql(mappedStatement.getConfiguration(), newSql, boundSql.getParameterMappings(), parameter); - logger.debug("sql analysis - sql replace old:{}",boundSql.getSql()); - logger.debug("sql analysis - sql replace new:{}",newSql); - - boundSql.getParameterMappings().forEach((e) -> { - String prop = e.getProperty(); - if (boundSql.hasAdditionalParameter(prop)) { - newBoundSql.setAdditionalParameter(prop, boundSql.getAdditionalParameter(prop)); - } - - }); - - // 把新的查询放到statement里 - MappedStatement newMs = copyFromMappedStatement(mappedStatement, new BoundSqlSqlSource(newBoundSql)); - args[0] = newMs; - } - - - /** - * 替换sql,生成新的 MappedStatement - * @param ms - * @param newSqlSource - * @return - */ - private static MappedStatement copyFromMappedStatement(MappedStatement ms, SqlSource newSqlSource) { - MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType()); - - builder.resource(ms.getResource()); - builder.fetchSize(ms.getFetchSize()); - builder.statementType(ms.getStatementType()); - builder.keyGenerator(ms.getKeyGenerator()); - if (ms.getKeyProperties() != null && ms.getKeyProperties().length > 0) { - StringBuilder keyPropertiesBuilder = new StringBuilder(); - String[] keyProperties = ms.getKeyProperties(); - Arrays.stream(keyProperties).forEach(key->keyPropertiesBuilder.append(key).append(",")); - keyPropertiesBuilder.delete(keyPropertiesBuilder.length() - 1, keyPropertiesBuilder.length()); - builder.keyProperty(keyPropertiesBuilder.toString()); - } - builder.timeout(ms.getTimeout()); - builder.parameterMap(ms.getParameterMap()); - builder.resultMaps(ms.getResultMaps()); - builder.resultSetType(ms.getResultSetType()); - builder.cache(ms.getCache()); - builder.flushCacheRequired(ms.isFlushCacheRequired()); - builder.useCache(ms.isUseCache()); - - return builder.build(); - } - - - private static class BoundSqlSqlSource implements SqlSource { - private final BoundSql boundSql; - - public BoundSqlSqlSource(BoundSql boundSql) { - this.boundSql = boundSql; - } - - @Override - public BoundSql getBoundSql(Object parameterObject) { - return boundSql; - } - } + private static final Logger logger = LoggerFactory.getLogger(SqlReplace.class); + + public static void replace(Invocation invocation, String newSql) { + // 获取当前执行的SQL语句 + Object[] args = invocation.getArgs(); + MappedStatement mappedStatement = (MappedStatement) args[0]; + Object parameter = args[1]; + // 生成新sql + BoundSql boundSql = mappedStatement.getBoundSql(parameter); + BoundSql newBoundSql = new BoundSql(mappedStatement.getConfiguration(), newSql, boundSql.getParameterMappings(), parameter); + logger.debug("sql analysis - sql replace old:{}", boundSql.getSql()); + logger.debug("sql analysis - sql replace new:{}", newSql); + + boundSql.getParameterMappings().forEach((e) -> { + String prop = e.getProperty(); + if (boundSql.hasAdditionalParameter(prop)) { + newBoundSql.setAdditionalParameter(prop, boundSql.getAdditionalParameter(prop)); + } + + }); + + // 把新的查询放到statement里 + MappedStatement newMs = copyFromMappedStatement(mappedStatement, new BoundSqlSqlSource(newBoundSql)); + args[0] = newMs; + } + + + /** + * 替换sql,生成新的 MappedStatement + * + * @param ms + * @param newSqlSource + * @return + */ + private static MappedStatement copyFromMappedStatement(MappedStatement ms, SqlSource newSqlSource) { + MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), ms.getId(), newSqlSource, ms.getSqlCommandType()); + + builder.resource(ms.getResource()); + builder.fetchSize(ms.getFetchSize()); + builder.statementType(ms.getStatementType()); + builder.keyGenerator(ms.getKeyGenerator()); + if (ms.getKeyProperties() != null && ms.getKeyProperties().length > 0) { + StringBuilder keyPropertiesBuilder = new StringBuilder(); + String[] keyProperties = ms.getKeyProperties(); + Arrays.stream(keyProperties).forEach(key -> keyPropertiesBuilder.append(key).append(",")); + keyPropertiesBuilder.delete(keyPropertiesBuilder.length() - 1, keyPropertiesBuilder.length()); + builder.keyProperty(keyPropertiesBuilder.toString()); + } + builder.timeout(ms.getTimeout()); + builder.parameterMap(ms.getParameterMap()); + builder.resultMaps(ms.getResultMaps()); + builder.resultSetType(ms.getResultSetType()); + builder.cache(ms.getCache()); + builder.flushCacheRequired(ms.isFlushCacheRequired()); + builder.useCache(ms.isUseCache()); + + return builder.build(); + } + + + private static class BoundSqlSqlSource implements SqlSource { + private final BoundSql boundSql; + + public BoundSqlSqlSource(BoundSql boundSql) { + this.boundSql = boundSql; + } + + @Override + public BoundSql getBoundSql(Object parameterObject) { + return boundSql; + } + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java b/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java index 3652224..1ae6755 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/replace/SqlReplaceConfig.java @@ -17,40 +17,41 @@ **/ public class SqlReplaceConfig { - static final Logger log = LoggerFactory.getLogger(SqlReplaceConfig.class); - - /** - * 配置明细 - * -- GETTER -- - * 获取sql替换映射对象 - */ - @Getter - private static HashMap sqlReplaceMap = new HashMap<>(); - - /** - * 初始化配置 - */ - public static void initConfig(){ - try{ - String configStr = DuccMonitorUtil.getDuccConfig(); - if(StringUtils.isNotBlank(configStr)){ - sqlReplaceMap = GsonUtil.json2Bean(configStr,HashMap.class); - } - }catch (Exception e){ - log.error("sql analysis replace config init error :",e); - } - } - - /** - * 根据sqlid 获取替换sql - * @param sqlId id - * @return 替换sql - */ - public static String getReplaceSqlBySqlId(String sqlId){ - if(StringUtils.isNotBlank(sqlId) && Objects.nonNull(sqlReplaceMap)){ - return sqlReplaceMap.get(sqlId); - } - return null; - } + static final Logger log = LoggerFactory.getLogger(SqlReplaceConfig.class); + + /** + * 配置明细 + * -- GETTER -- + * 获取sql替换映射对象 + */ + @Getter + private static HashMap sqlReplaceMap = new HashMap<>(); + + /** + * 初始化配置 + */ + public static void initConfig() { + try { + String configStr = DuccMonitorUtil.getDuccConfig(); + if (StringUtils.isNotBlank(configStr)) { + sqlReplaceMap = GsonUtil.json2Bean(configStr, HashMap.class); + } + } catch (Exception e) { + log.error("sql analysis replace config init error :", e); + } + } + + /** + * 根据sqlid 获取替换sql + * + * @param sqlId id + * @return 替换sql + */ + public static String getReplaceSqlBySqlId(String sqlId) { + if (StringUtils.isNotBlank(sqlId) && Objects.nonNull(sqlReplaceMap)) { + return sqlReplaceMap.get(sqlId); + } + return null; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java index 5d51677..644f994 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchColumn.java @@ -1,7 +1,6 @@ package com.jd.sql.analysis.rule; import lombok.Getter; -import lombok.Setter; /** * @Author huhaitao21 @@ -10,25 +9,25 @@ **/ @Getter public enum MatchColumn { - SELECT_TYPE("selectType"), - TABLE("table"), - PARTITIONS("partitions"), - TYPE("type"), - POSSIBLE_KEYS("possibleKeys"), - KEY("key"), - KEY_LEN("keyLen"), - REF("ref"), - ROWS("rows"), - FILTERED("filtered"), - EXTRA("extra"); + SELECT_TYPE("selectType"), + TABLE("table"), + PARTITIONS("partitions"), + TYPE("type"), + POSSIBLE_KEYS("possibleKeys"), + KEY("key"), + KEY_LEN("keyLen"), + REF("ref"), + ROWS("rows"), + FILTERED("filtered"), + EXTRA("extra"); - /** - * 匹配字段 - */ - private final String column; + /** + * 匹配字段 + */ + private final String column; - MatchColumn(String column){ - this.column = column; - } + MatchColumn(String column) { + this.column = column; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java index 18a0946..1402d14 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/MatchType.java @@ -1,7 +1,6 @@ package com.jd.sql.analysis.rule; import lombok.Getter; -import lombok.Setter; /** * @Author huhaitao21 @@ -10,18 +9,18 @@ **/ @Getter public enum MatchType { - EQUAL("等于"), - GREATER("大于"), - LESS("小于"), - CONTAIN("包含"); + EQUAL("等于"), + GREATER("大于"), + LESS("小于"), + CONTAIN("包含"); - /** - * 匹配类型 - */ - private final String type; + /** + * 匹配类型 + */ + private final String type; - MatchType(String type){ - this.type = type; - } + MatchType(String type) { + this.type = type; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RuleFieldEnum.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RuleFieldEnum.java index 5aaa2e9..90ea475 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RuleFieldEnum.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RuleFieldEnum.java @@ -2,17 +2,18 @@ /** * 规则字段枚举 + * * @author yangchao341 */ public enum RuleFieldEnum { - CONDITION, - PRIORITY, - NAME, - DESCRIPTION, - ACTION, - SCORE, - REASON, - SUGGESTION, - STRICT + CONDITION, + PRIORITY, + NAME, + DESCRIPTION, + ACTION, + SCORE, + REASON, + SUGGESTION, + STRICT } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java index 587fc06..67cda71 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/RulesEngineExecutor.java @@ -20,82 +20,100 @@ /** * 规则引擎执行器 + * * @author yangchao341 */ public class RulesEngineExecutor { - private static final Logger logger = LoggerFactory.getLogger(RulesEngineExecutor.class); + public static final RulesEngine rulesEngine = new DefaultRulesEngine(); + private static final Logger logger = LoggerFactory.getLogger(RulesEngineExecutor.class); + private static Rules rules; - public final static RulesEngine rulesEngine = new DefaultRulesEngine(); - private static Rules rules; + /** + * 匹配规则-评分结果映射关系 + */ + private static ConcurrentHashMap scoreMap; - /** - * 匹配规则-评分结果映射关系 - */ - private static ConcurrentHashMap scoreMap; + public static boolean refresh() { + InputStream inputStream; + Properties properties = new Properties(); + inputStream = RulesEngineExecutor.class.getClassLoader().getResourceAsStream("sql-analysis-rule-config.properties"); + if (inputStream == null) { + logger.error("规则引擎配置文件加载失败"); + return false; + } + try { + properties.load(new InputStreamReader(inputStream)); + inputStream.close(); + } catch (IOException e) { + logger.error("规则引擎配置文件加载失败", e); + } + Map ruleMap = new HashMap<>(); + ConcurrentHashMap innerScoreMap = new ConcurrentHashMap<>(); + properties.forEach((key, value) -> { + String[] keyArr = StringUtils.split(key.toString(), '.'); + if (keyArr.length >= 2) { + MVELRule rule = ruleMap.getOrDefault(keyArr[0], new MVELRule().name(keyArr[0]).then("ret.add(\"" + keyArr[0] + "\")")); + SqlScoreResultDetail score = innerScoreMap.getOrDefault(keyArr[0], new SqlScoreResultDetail()); + switch (RuleFieldEnum.valueOf(keyArr[1].toUpperCase())) { + case CONDITION: + rule.when(value.toString()); + break; + case ACTION: + rule.then(value.toString()); + break; + case NAME: + rule.name(value.toString()); + break; + case DESCRIPTION: + rule.description(value.toString()); + break; + case PRIORITY: + rule.priority(NumberUtils.toInt(value.toString())); + break; + case SCORE: + score.setScoreDeduction(NumberUtils.toInt(value.toString())); + break; + case REASON: + score.setReason(value.toString()); + break; + case SUGGESTION: + score.setSuggestion(value.toString()); + break; + case STRICT: + score.setStrict(Boolean.valueOf(value.toString())); + break; + } + ruleMap.put(keyArr[0], rule); + innerScoreMap.put(keyArr[0], score); + } + }); + Rules newRules = new Rules(); + for (Map.Entry ruleEntry : ruleMap.entrySet()) { + newRules.register(ruleEntry.getValue()); + } + rules = newRules; + scoreMap = innerScoreMap; - public static boolean refresh(){ - InputStream inputStream; - Properties properties = new Properties(); - inputStream = RulesEngineExecutor.class.getClassLoader().getResourceAsStream("sql-analysis-rule-config.properties"); - if(inputStream == null){ - logger.error("规则引擎配置文件加载失败"); - return false; - } - try { - properties.load(new InputStreamReader(inputStream)); - inputStream.close(); - } catch (IOException e) { - logger.error("规则引擎配置文件加载失败",e); - } - Map ruleMap = new HashMap<>(); - ConcurrentHashMap innerScoreMap = new ConcurrentHashMap<>(); - properties.forEach((key, value) -> { - String[] keyArr = StringUtils.split(key.toString(),'.'); - if(keyArr.length >= 2){ - MVELRule rule = ruleMap.getOrDefault(keyArr[0],new MVELRule().name(keyArr[0]).then("ret.add(\"" + keyArr[0] + "\")")); - SqlScoreResultDetail score = innerScoreMap.getOrDefault(keyArr[0],new SqlScoreResultDetail()); - switch (RuleFieldEnum.valueOf(keyArr[1].toUpperCase())){ - case CONDITION: rule.when(value.toString());break; - case ACTION: rule.then(value.toString());break; - case NAME: rule.name(value.toString());break; - case DESCRIPTION: rule.description(value.toString());break; - case PRIORITY: rule.priority(NumberUtils.toInt(value.toString()));break; - case SCORE: score.setScoreDeduction(NumberUtils.toInt(value.toString()));break; - case REASON: score.setReason(value.toString());break; - case SUGGESTION: score.setSuggestion(value.toString());break; - case STRICT: score.setStrict(Boolean.valueOf(value.toString()));break; - } - ruleMap.put(keyArr[0],rule); - innerScoreMap.put(keyArr[0],score); - } - }); - Rules newRules = new Rules(); - for(Map.Entry ruleEntry : ruleMap.entrySet()){ - newRules.register(ruleEntry.getValue()); - } - rules = newRules; - scoreMap = innerScoreMap; + return true; + } - return true; - } - - public static List executeEngine(SqlAnalysisResult sqlAnalysisResult) { - ArrayList retList = new ArrayList<>(); - ArrayList ret = new ArrayList<>(); - // 创建事实 - Facts facts = new Facts(); - facts.put("param", sqlAnalysisResult); - facts.put("ret", ret); - // 执行规则 - rulesEngine.fire(rules, facts); - ret = facts.get("ret"); - for(String item : ret){ - if(scoreMap.get(item) != null){ - retList.add(scoreMap.get(item)); - } - } - return retList; - } + public static List executeEngine(SqlAnalysisResult sqlAnalysisResult) { + ArrayList retList = new ArrayList<>(); + ArrayList ret = new ArrayList<>(); + // 创建事实 + Facts facts = new Facts(); + facts.put("param", sqlAnalysisResult); + facts.put("ret", ret); + // 执行规则 + rulesEngine.fire(rules, facts); + ret = facts.get("ret"); + for (String item : ret) { + if (scoreMap.get(item) != null) { + retList.add(scoreMap.get(item)); + } + } + return retList; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRule.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRule.java index b6ef4a6..0188810 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRule.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRule.java @@ -12,40 +12,40 @@ @Getter public class SqlScoreRule { - /** - * 检查字段 - */ - private MatchColumn matchColumn; - - /** - * 匹配值 - */ - private String matchValue; - - /** - * 匹配规则 - */ - private MatchType matchType; - - /** - * 减分值 - */ - private Integer scoreDeduction; - - /** - * 原因 - */ - private String reason; - - /** - * 建议 - */ - private String suggestion ; - - - /** - * 是否严格规则,是的-直接触发警告,否-依赖综合评分进行警告 - */ - private Boolean strict ; + /** + * 检查字段 + */ + private MatchColumn matchColumn; + + /** + * 匹配值 + */ + private String matchValue; + + /** + * 匹配规则 + */ + private MatchType matchType; + + /** + * 减分值 + */ + private Integer scoreDeduction; + + /** + * 原因 + */ + private String reason; + + /** + * 建议 + */ + private String suggestion; + + + /** + * 是否严格规则,是的-直接触发警告,否-依赖综合评分进行警告 + */ + private Boolean strict; } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoader.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoader.java index 0adf7e2..141c23d 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoader.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoader.java @@ -7,9 +7,9 @@ **/ public interface SqlScoreRuleLoader { - /** - * 加载评分规则 - */ - boolean loadScoreRule(); + /** + * 加载评分规则 + */ + boolean loadScoreRule(); } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderDefault.java index 3153c3d..2eaecd3 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderDefault.java @@ -10,82 +10,79 @@ * @Author huhaitao21 * @Description 评分规则管理实现 * @Date 20:43 2022/11/1 + * @deprecated **/ @Deprecated public class SqlScoreRuleLoaderDefault implements SqlScoreRuleLoader { + @Override + public boolean loadScoreRule() { + List ruleList = SqlAnalysisConfig.getRuleList(); + //无索引规则 + SqlScoreRule sqlScoreRule = new SqlScoreRule(); + sqlScoreRule.setStrict(true); + sqlScoreRule.setMatchColumn(MatchColumn.TYPE); + sqlScoreRule.setMatchType(MatchType.EQUAL); + sqlScoreRule.setMatchValue("ALL"); + sqlScoreRule.setReason("不走索引"); + sqlScoreRule.setSuggestion("建议创建索引"); + sqlScoreRule.setScoreDeduction(40); + ruleList.add(sqlScoreRule); - private static final Logger logger = LoggerFactory.getLogger(SqlScoreRuleLoaderDefault.class); + //排序不走索引规则 + sqlScoreRule = new SqlScoreRule(); + sqlScoreRule.setStrict(false); + sqlScoreRule.setMatchColumn(MatchColumn.EXTRA); + sqlScoreRule.setMatchType(MatchType.CONTAIN); + sqlScoreRule.setMatchValue("filesort"); + sqlScoreRule.setReason("排序不走索引"); + sqlScoreRule.setSuggestion("建议优化索引或者优化sql"); + sqlScoreRule.setScoreDeduction(20); + ruleList.add(sqlScoreRule); + //索引效果不佳规则 + sqlScoreRule = new SqlScoreRule(); + sqlScoreRule.setStrict(false); + sqlScoreRule.setMatchColumn(MatchColumn.FILTERED); + sqlScoreRule.setMatchType(MatchType.LESS); + sqlScoreRule.setMatchValue("60"); + sqlScoreRule.setReason("索引过滤效果不佳"); + sqlScoreRule.setSuggestion("建议优化索引或者优化sql"); + sqlScoreRule.setScoreDeduction(20); + ruleList.add(sqlScoreRule); - @Override - public boolean loadScoreRule() { - List ruleList = SqlAnalysisConfig.getRuleList(); - //无索引规则 - SqlScoreRule sqlScoreRule = new SqlScoreRule(); - sqlScoreRule.setStrict(true); - sqlScoreRule.setMatchColumn(MatchColumn.TYPE); - sqlScoreRule.setMatchType(MatchType.EQUAL); - sqlScoreRule.setMatchValue("ALL"); - sqlScoreRule.setReason("不走索引"); - sqlScoreRule.setSuggestion("建议创建索引"); - sqlScoreRule.setScoreDeduction(40); - ruleList.add(sqlScoreRule); + //索引效果不佳规则 + sqlScoreRule = new SqlScoreRule(); + sqlScoreRule.setStrict(false); + sqlScoreRule.setMatchColumn(MatchColumn.ROWS); + sqlScoreRule.setMatchType(MatchType.GREATER); + sqlScoreRule.setMatchValue("50000"); + sqlScoreRule.setReason("遍历行数过多"); + sqlScoreRule.setSuggestion("建议优化索引或者优化sql"); + sqlScoreRule.setScoreDeduction(40); + ruleList.add(sqlScoreRule); - //排序不走索引规则 - sqlScoreRule = new SqlScoreRule(); - sqlScoreRule.setStrict(false); - sqlScoreRule.setMatchColumn(MatchColumn.EXTRA); - sqlScoreRule.setMatchType(MatchType.CONTAIN); - sqlScoreRule.setMatchValue("filesort"); - sqlScoreRule.setReason("排序不走索引"); - sqlScoreRule.setSuggestion("建议优化索引或者优化sql"); - sqlScoreRule.setScoreDeduction(20); - ruleList.add(sqlScoreRule); + //索引效果不佳规则 + sqlScoreRule = new SqlScoreRule(); + sqlScoreRule.setStrict(false); + sqlScoreRule.setMatchColumn(MatchColumn.ROWS); + sqlScoreRule.setMatchType(MatchType.GREATER); + sqlScoreRule.setMatchValue("5000"); + sqlScoreRule.setReason("遍历行数过多"); + sqlScoreRule.setSuggestion("建议优化索引或者优化sql"); + sqlScoreRule.setScoreDeduction(10); + ruleList.add(sqlScoreRule); - //索引效果不佳规则 - sqlScoreRule = new SqlScoreRule(); - sqlScoreRule.setStrict(false); - sqlScoreRule.setMatchColumn(MatchColumn.FILTERED); - sqlScoreRule.setMatchType(MatchType.LESS); - sqlScoreRule.setMatchValue("60"); - sqlScoreRule.setReason("索引过滤效果不佳"); - sqlScoreRule.setSuggestion("建议优化索引或者优化sql"); - sqlScoreRule.setScoreDeduction(20); - ruleList.add(sqlScoreRule); - - //索引效果不佳规则 - sqlScoreRule = new SqlScoreRule(); - sqlScoreRule.setStrict(false); - sqlScoreRule.setMatchColumn(MatchColumn.ROWS); - sqlScoreRule.setMatchType(MatchType.GREATER); - sqlScoreRule.setMatchValue("50000"); - sqlScoreRule.setReason("遍历行数过多"); - sqlScoreRule.setSuggestion("建议优化索引或者优化sql"); - sqlScoreRule.setScoreDeduction(40); - ruleList.add(sqlScoreRule); - - //索引效果不佳规则 - sqlScoreRule = new SqlScoreRule(); - sqlScoreRule.setStrict(false); - sqlScoreRule.setMatchColumn(MatchColumn.ROWS); - sqlScoreRule.setMatchType(MatchType.GREATER); - sqlScoreRule.setMatchValue("5000"); - sqlScoreRule.setReason("遍历行数过多"); - sqlScoreRule.setSuggestion("建议优化索引或者优化sql"); - sqlScoreRule.setScoreDeduction(10); - ruleList.add(sqlScoreRule); - - //表内数据极少,甚至无数据 加分避免误报 - sqlScoreRule = new SqlScoreRule(); - sqlScoreRule.setStrict(false); - sqlScoreRule.setMatchColumn(MatchColumn.ROWS); - sqlScoreRule.setMatchType(MatchType.LESS); - sqlScoreRule.setMatchValue("50"); - sqlScoreRule.setReason("遍历行数较少"); - sqlScoreRule.setSuggestion("暂不需要优化"); - sqlScoreRule.setScoreDeduction(-20); - ruleList.add(sqlScoreRule); - return true; - } + //表内数据极少,甚至无数据 加分避免误报 + sqlScoreRule = new SqlScoreRule(); + sqlScoreRule.setStrict(false); + sqlScoreRule.setMatchColumn(MatchColumn.ROWS); + sqlScoreRule.setMatchType(MatchType.LESS); + sqlScoreRule.setMatchValue("50"); + sqlScoreRule.setReason("遍历行数较少"); + sqlScoreRule.setSuggestion("暂不需要优化"); + sqlScoreRule.setScoreDeduction(-20); + ruleList.add(sqlScoreRule); + return true; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderRulesEngine.java b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderRulesEngine.java index a54c0ab..ea9fc98 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderRulesEngine.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/rule/SqlScoreRuleLoaderRulesEngine.java @@ -9,13 +9,8 @@ * @Date 20:43 2022/11/1 **/ public class SqlScoreRuleLoaderRulesEngine implements SqlScoreRuleLoader { - - private static final Logger logger = LoggerFactory.getLogger(SqlScoreRuleLoaderRulesEngine.class); - - - @Override - public boolean loadScoreRule() { - return RulesEngineExecutor.refresh(); - } - + @Override + public boolean loadScoreRule() { + return RulesEngineExecutor.refresh(); + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResult.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResult.java index 8cf6caa..f4aadc8 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResult.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResult.java @@ -14,29 +14,25 @@ @Getter public class SqlScoreResult { - /** - * sql id - */ - private String sqlId; - - /** - * 执行的原始sql - */ - private String sourceSql; - - /** - * 是否需要警告 - */ - private Boolean needWarn; - - /** - * 综合评分 - */ - private Integer score; - - /** - * 分析结果明细 - */ - List analysisResults; + /** + * 分析结果明细 + */ + List analysisResults; + /** + * sql id + */ + private String sqlId; + /** + * 执行的原始sql + */ + private String sourceSql; + /** + * 是否需要警告 + */ + private Boolean needWarn; + /** + * 综合评分 + */ + private Integer score; } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResultDetail.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResultDetail.java index 5832b7c..b59a8ae 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResultDetail.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreResultDetail.java @@ -12,26 +12,26 @@ @Getter public class SqlScoreResultDetail { - /** - * 减分值 - */ - private Integer scoreDeduction; - - /** - * 原因 - */ - private String reason; - - /** - * 建议 - */ - private String suggestion ; - - - /** - * 是否严格规则,是的-直接触发警告,否-依赖综合评分进行警告(暂不使用) - */ - private Boolean strict ; + /** + * 减分值 + */ + private Integer scoreDeduction; + + /** + * 原因 + */ + private String reason; + + /** + * 建议 + */ + private String suggestion; + + + /** + * 是否严格规则,是的-直接触发警告,否-依赖综合评分进行警告(暂不使用) + */ + private Boolean strict; } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreService.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreService.java index bc43db5..1b99ef9 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreService.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreService.java @@ -9,11 +9,12 @@ **/ public interface SqlScoreService { - /** - * 计算sql评分 - * @param sqlAnalysisResutlDto - * @return - */ - SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResutlDto); + /** + * 计算sql评分 + * + * @param sqlAnalysisResutlDto + * @return + */ + SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResutlDto); } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java index f96076d..55ac8da 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceDefault.java @@ -17,149 +17,149 @@ * @Author huhaitao21 * @Description 评分服务默认实现 * @Date 20:43 2022/11/1 + * @deprecated **/ @Deprecated public class SqlScoreServiceDefault implements SqlScoreService { - private static final Logger logger = LoggerFactory.getLogger(SqlScoreServiceDefault.class); - - private static final Integer WARN_SCORE = 80; - - - @Override - public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { - if (sqlAnalysisResultList == null || CollectionUtils.isEmpty(sqlAnalysisResultList.getResultList())) { - return null; - } - //默认100分,扣分制 - int score = 100; - SqlScoreResult scoreResult = new SqlScoreResult(); - - List analysisResults = new ArrayList<>(); - //遍历分析结果,匹配评分规则 - for (SqlAnalysisResult result : sqlAnalysisResultList.getResultList()) { - List detail = matchRule(result); - if (CollectionUtils.isNotEmpty(detail)) { - analysisResults.addAll(detail); - } - } - - //综合评分计算 - return getSqlScoreResult(score, scoreResult, analysisResults, WARN_SCORE); - } - - static SqlScoreResult getSqlScoreResult(int score, SqlScoreResult scoreResult, List analysisResults, Integer warnScore) { - for (SqlScoreResultDetail detail : analysisResults) { - score = score - detail.getScoreDeduction(); - if (score < 0) { - //防止出现负分 - score = 0; - } - - scoreResult.setNeedWarn(score < warnScore); - } - scoreResult.setScore(score); - scoreResult.setAnalysisResults(analysisResults); - - logger.info("sql analysis result = {}", GsonUtil.bean2Json(scoreResult)); - return scoreResult; - } - - /** - * 规则匹配 返回 计算明细 - * - * @param result - * @return - */ - private List matchRule(SqlAnalysisResult result) { - List detailList = new ArrayList<>(); - - if (CollectionUtils.isEmpty(SqlAnalysisConfig.getRuleList())) { - return null; - } - for (SqlScoreRule sqlScoreRule : SqlAnalysisConfig.getRuleList()) { - try { - SqlScoreResultDetail detail = new SqlScoreResultDetail(); - //根据属性,获取属性值 - String columnName = sqlScoreRule.getMatchColumn().getColumn(); - Object value = getValue(result, columnName); - if (value == null) { - continue; - } - //根据匹配规则对属性进行匹配 - boolean matchResult = matchColumn(sqlScoreRule, value); - - if (matchResult) { - detail.setScoreDeduction(sqlScoreRule.getScoreDeduction()); - detail.setReason(sqlScoreRule.getReason()); - detail.setSuggestion(sqlScoreRule.getSuggestion()); - detail.setStrict(sqlScoreRule.getStrict()); - detailList.add(detail); - } - - } catch (Exception e) { - e.printStackTrace(); - logger.error("sql analysis matchRule error:", e); - } - - - } - return detailList; - } - - /** - * 根据字段名称提取属性值 - * - * @param result - * @param columnName - * @return - */ - private Object getValue(SqlAnalysisResult result, String columnName) { - try { - String methodName = "get" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1); - Class sqlAnalysisResultClass = SqlAnalysisResult.class; - Method getMethod = sqlAnalysisResultClass.getDeclaredMethod(methodName); - return getMethod.invoke(result); - } catch (Exception e) { - logger.error("sql analysis get value error :", e); - } - return null; - } - - /** - * 匹配字段值 - * - * @param sqlScoreRule - * @param value 字段值 - * @return - */ - private boolean matchColumn(SqlScoreRule sqlScoreRule, Object value) { - boolean matchResult = false; - switch (sqlScoreRule.getMatchType()) { - case EQUAL: - if (value.toString().equals(sqlScoreRule.getMatchValue())) { - matchResult = true; - } - break; - case GREATER: - if (Double.parseDouble(value.toString()) > Double.parseDouble(sqlScoreRule.getMatchValue())) { - matchResult = true; - } - break; - case LESS: - if (Double.parseDouble(value.toString()) < Double.parseDouble(sqlScoreRule.getMatchValue())) { - matchResult = true; - } - break; - case CONTAIN: - if (value.toString().contains(sqlScoreRule.getMatchValue())) { - matchResult = true; - } - break; - default: - } - return matchResult; - } + private static final Logger logger = LoggerFactory.getLogger(SqlScoreServiceDefault.class); + + private static final Integer WARN_SCORE = 80; + + static SqlScoreResult getSqlScoreResult(int score, SqlScoreResult scoreResult, List analysisResults, Integer warnScore) { + for (SqlScoreResultDetail detail : analysisResults) { + score = score - detail.getScoreDeduction(); + if (score < 0) { + //防止出现负分 + score = 0; + } + + scoreResult.setNeedWarn(score < warnScore); + } + scoreResult.setScore(score); + scoreResult.setAnalysisResults(analysisResults); + + logger.info("sql analysis result = {}", GsonUtil.bean2Json(scoreResult)); + return scoreResult; + } + + @Override + public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { + if (sqlAnalysisResultList == null || CollectionUtils.isEmpty(sqlAnalysisResultList.getResultList())) { + return null; + } + //默认100分,扣分制 + int score = 100; + SqlScoreResult scoreResult = new SqlScoreResult(); + + List analysisResults = new ArrayList<>(); + //遍历分析结果,匹配评分规则 + for (SqlAnalysisResult result : sqlAnalysisResultList.getResultList()) { + List detail = matchRule(result); + if (CollectionUtils.isNotEmpty(detail)) { + analysisResults.addAll(detail); + } + } + + //综合评分计算 + return getSqlScoreResult(score, scoreResult, analysisResults, WARN_SCORE); + } + + /** + * 规则匹配 返回 计算明细 + * + * @param result + * @return + */ + private List matchRule(SqlAnalysisResult result) { + List detailList = new ArrayList<>(); + + if (CollectionUtils.isEmpty(SqlAnalysisConfig.getRuleList())) { + return null; + } + for (SqlScoreRule sqlScoreRule : SqlAnalysisConfig.getRuleList()) { + try { + SqlScoreResultDetail detail = new SqlScoreResultDetail(); + //根据属性,获取属性值 + String columnName = sqlScoreRule.getMatchColumn().getColumn(); + Object value = getValue(result, columnName); + if (value == null) { + continue; + } + //根据匹配规则对属性进行匹配 + boolean matchResult = matchColumn(sqlScoreRule, value); + + if (matchResult) { + detail.setScoreDeduction(sqlScoreRule.getScoreDeduction()); + detail.setReason(sqlScoreRule.getReason()); + detail.setSuggestion(sqlScoreRule.getSuggestion()); + detail.setStrict(sqlScoreRule.getStrict()); + detailList.add(detail); + } + + } catch (Exception e) { + e.printStackTrace(); + logger.error("sql analysis matchRule error:", e); + } + + + } + return detailList; + } + + /** + * 根据字段名称提取属性值 + * + * @param result + * @param columnName + * @return + */ + private Object getValue(SqlAnalysisResult result, String columnName) { + try { + String methodName = "get" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1); + Class sqlAnalysisResultClass = SqlAnalysisResult.class; + Method getMethod = sqlAnalysisResultClass.getDeclaredMethod(methodName); + return getMethod.invoke(result); + } catch (Exception e) { + logger.error("sql analysis get value error :", e); + } + return null; + } + + /** + * 匹配字段值 + * + * @param sqlScoreRule + * @param value 字段值 + * @return + */ + private boolean matchColumn(SqlScoreRule sqlScoreRule, Object value) { + boolean matchResult = false; + switch (sqlScoreRule.getMatchType()) { + case EQUAL: + if (value.toString().equals(sqlScoreRule.getMatchValue())) { + matchResult = true; + } + break; + case GREATER: + if (Double.parseDouble(value.toString()) > Double.parseDouble(sqlScoreRule.getMatchValue())) { + matchResult = true; + } + break; + case LESS: + if (Double.parseDouble(value.toString()) < Double.parseDouble(sqlScoreRule.getMatchValue())) { + matchResult = true; + } + break; + case CONTAIN: + if (value.toString().contains(sqlScoreRule.getMatchValue())) { + matchResult = true; + } + break; + default: + } + return matchResult; + } } \ No newline at end of file diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java index 75f4137..39a83a0 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/score/SqlScoreServiceRulesEngine.java @@ -4,8 +4,6 @@ import com.jd.sql.analysis.analysis.SqlAnalysisResultList; import com.jd.sql.analysis.rule.RulesEngineExecutor; import org.apache.commons.collections4.CollectionUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; @@ -19,34 +17,32 @@ **/ public class SqlScoreServiceRulesEngine implements SqlScoreService { - private static final Logger logger = LoggerFactory.getLogger(SqlScoreServiceRulesEngine.class); - - private static final Integer WARN_SCORE = 80; - - - @Override - public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { - if (sqlAnalysisResultList == null || CollectionUtils.isEmpty(sqlAnalysisResultList.getResultList())) { - return null; - } - //默认100分,扣分制 - int score = 100; - SqlScoreResult scoreResult = new SqlScoreResult(); - - List analysisResults = new ArrayList<>(); - //遍历分析结果,匹配评分规则 - for (SqlAnalysisResult result : sqlAnalysisResultList.getResultList()) { - List detail = matchRuleEngine(result); - if (CollectionUtils.isNotEmpty(detail)) { - analysisResults.addAll(detail); - } - } - - //综合评分计算 - return getSqlScoreResult(score, scoreResult, analysisResults, WARN_SCORE); - } - - private List matchRuleEngine(SqlAnalysisResult result) { - return RulesEngineExecutor.executeEngine(result); - } + private static final Integer WARN_SCORE = 80; + + + @Override + public SqlScoreResult score(SqlAnalysisResultList sqlAnalysisResultList) { + if (sqlAnalysisResultList == null || CollectionUtils.isEmpty(sqlAnalysisResultList.getResultList())) { + return null; + } + //默认100分,扣分制 + int score = 100; + SqlScoreResult scoreResult = new SqlScoreResult(); + + List analysisResults = new ArrayList<>(); + //遍历分析结果,匹配评分规则 + for (SqlAnalysisResult result : sqlAnalysisResultList.getResultList()) { + List detail = matchRuleEngine(result); + if (CollectionUtils.isNotEmpty(detail)) { + analysisResults.addAll(detail); + } + } + + //综合评分计算 + return getSqlScoreResult(score, scoreResult, analysisResults, WARN_SCORE); + } + + private List matchRuleEngine(SqlAnalysisResult result) { + return RulesEngineExecutor.executeEngine(result); + } } \ No newline at end of file diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/DuccMonitorUtil.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/DuccMonitorUtil.java index b2edf1c..edcd02e 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/DuccMonitorUtil.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/DuccMonitorUtil.java @@ -12,25 +12,26 @@ **/ public class DuccMonitorUtil { - private static final Logger log = LoggerFactory.getLogger(DuccMonitorUtil.class); + private static final Logger log = LoggerFactory.getLogger(DuccMonitorUtil.class); /** * -- GETTER -- - * 获取ducc配置 + * 获取ducc配置 * * @return */ @Getter private static final String duccConfig = ""; - /** - * 启动监控 - * @param appName jone或者jdos应用名称 - * @param uri uri格式详解参见:https://git.jd.com/laf/laf-config/wikis/客户端使用指南->UCC配置服务 - * @param moniterKey 存储sql替换配置的key - */ - public static void start(String appName,String uri,String moniterKey){ - try{ - //todo 配置中心监听 + /** + * 启动监控 + * + * @param appName jone或者jdos应用名称 + * @param uri uri格式详解参见:https://git.jd.com/laf/laf-config/wikis/客户端使用指南->UCC配置服务 + * @param moniterKey 存储sql替换配置的key + */ + public static void start(String appName, String uri, String moniterKey) { + try { + //todo 配置中心监听 // //创建ConfiguratorManager 实例,有1个就可以 // ConfiguratorManager configuratorManager = ConfiguratorManager.getInstance() ; // //设置appName,jone或者jdos部署可自动获取,无需配置 @@ -61,10 +62,10 @@ public static void start(String appName,String uri,String moniterKey){ // SqlReplaceConfig.initConfig(); // } // }); - }catch (Exception e){ - log.error("sql analysis ducc 监听启动失败"); - } + } catch (Exception e) { + log.error("sql analysis ducc 监听启动失败"); + } - } + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/GsonUtil.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/GsonUtil.java index 52195dd..a91b85c 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/GsonUtil.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/GsonUtil.java @@ -10,28 +10,28 @@ **/ public class GsonUtil { - private static final Gson GSON = new GsonBuilder().create(); + private static final Gson GSON = new GsonBuilder().create(); - /** - * 对象、集合转json - * - * @param obj 对象 - * @return json - */ - public static String bean2Json(Object obj) { - return GSON.toJson(obj); - } + /** + * 对象、集合转json + * + * @param obj 对象 + * @return json + */ + public static String bean2Json(Object obj) { + return GSON.toJson(obj); + } - /** - * json转对象 - * - * @param jsonString json - * @param objClass 对象类型 - * @param 对象类型 - * @return 对象 - */ - public static T json2Bean(String jsonString, Class objClass) { - return GSON.fromJson(jsonString, objClass); - } + /** + * json转对象 + * + * @param jsonString json + * @param objClass 对象类型 + * @param 对象类型 + * @return 对象 + */ + public static T json2Bean(String jsonString, Class objClass) { + return GSON.fromJson(jsonString, objClass); + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogModel.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogModel.java index 74b8311..81d66c5 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogModel.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogModel.java @@ -16,45 +16,41 @@ @Builder public class KeyNodeLogModel { - public KeyNodeLogModel(){ - - } - /** - * 业务id - */ - private String businessId; - - /** - * 业务模块名称 - */ - private String moduleName; - - /** - * 节点名称 - */ - private String nodeName; - - /** - * 业务时间 - */ - private Date businessTime; - - /** - * 日志时间 - */ - private Date logTime; - - /** - * 描述 - */ - private String describe; + /** + * 业务id + */ + private String businessId; + /** + * 业务模块名称 + */ + private String moduleName; + /** + * 节点名称 + */ + private String nodeName; + /** + * 业务时间 + */ + private Date businessTime; + /** + * 日志时间 + */ + private Date logTime; + /** + * 描述 + */ + private String describe; + + public KeyNodeLogModel() { + + } public KeyNodeLogModel(String businessId, String moduleName, String nodeName, Date businessTime, Date logTime, String describe) { - this.businessId = businessId; - this.moduleName = moduleName; - this.nodeName = nodeName; - this.businessTime = businessTime; - this.logTime = logTime; - this.describe = describe; - } + this.businessId = businessId; + this.moduleName = moduleName; + this.nodeName = nodeName; + this.businessTime = businessTime; + this.logTime = logTime; + this.describe = describe; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java index 39661a9..6cdcba1 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/KeyNodeLogUtil.java @@ -19,130 +19,133 @@ **/ public class KeyNodeLogUtil { - private static final Logger log = LoggerFactory.getLogger(KeyNodeLogUtil.class); - - - private static RingBuffer ringBuffer = null; - - static { - initDisruptor(); - } - - - public static void initDisruptor(){ - // 指定RingBuffer的大小 - int bufferSize = 1024; - //批量提交日志大小 - int batchLogSize = 10; - - // 生产者的线程工厂 - ThreadFactory threadFactory = r -> new Thread(r, "logDisruptorThread"); - - // RingBuffer生产工厂,初始化RingBuffer的时候使用 - EventFactory factory = KeyNodeLogModel::new; - - // 阻塞策略 - BlockingWaitStrategy strategy = new BlockingWaitStrategy(); - - // 创建disruptor,采用单生产者模式 - Disruptor disruptor = new Disruptor<>(factory, bufferSize, threadFactory, ProducerType.SINGLE, strategy); - ringBuffer = disruptor.getRingBuffer(); - - // 处理Event的handler - EventHandler handler = (element, sequence, endOfBatch) -> { - if(Objects.isNull(element)){ - return; - } - sendSingleLog(element); - }; - // 设置EventHandler - disruptor.handleEventsWith(handler); - - // 启动disruptor的线程 - disruptor.start(); - } - - /** - * 发布disruptor事件 - * @param model - */ - public static void applyLogEvent(KeyNodeLogModel model){ - if(ringBuffer==null){ - //disruptor未初始化 - log.error("disruptor未初始化,使用单发mq"); - sendSingleLog(model); - return; - } - - // 获取下一个可用位置的下标 - long sequence; - try { - sequence = ringBuffer.tryNext(); - } catch (InsufficientCapacityException e) { - log.error("disruptor队列不足,使用单发mq"); - sendSingleLog(model); - return; - } - try{ - // 返回可用位置的元素 - KeyNodeLogModel event = ringBuffer.get(sequence); - // 设置该位置元素的值 - event.setBusinessId(model.getBusinessId()); - event.setBusinessTime(model.getBusinessTime()); - event.setDescribe(model.getDescribe()); - event.setLogTime(model.getLogTime()); - event.setModuleName(model.getModuleName()); - event.setNodeName(model.getNodeName()); - }catch (Exception e){ - log.error("disruptor发布event失败",e); - }finally{ - ringBuffer.publish(sequence); - } - } - - /** - * 单条日志发送 - * @param model - */ - public static void sendSingleLog(KeyNodeLogModel model){ - String content = GsonUtil.bean2Json(model); - try { - sendMessage(JmqConfig.getTopic(), model.getBusinessId(),content); - } catch (Exception e) { - log.error("sql analysis out mq error{}", model.getBusinessId(), e); - } - } - - - public static void sendLog(String businessId, String modelName, String nodeName, String describe,Date businessTime) { - KeyNodeLogModel model = KeyNodeLogModel.builder() - .businessId(businessId) - .businessTime(businessTime) - .logTime(new Date()) - .moduleName(modelName) - .nodeName(nodeName) - .describe(describe) - .build(); - - if(!checkModel(model)){ - return; - } - - applyLogEvent(model); - } - - /** - * 检测模块 是否需要发送 - * @param model - * @return - */ - public static boolean checkModel(KeyNodeLogModel model){ - return !StringUtils.isBlank(model.getBusinessId()) && !StringUtils.isBlank(model.getModuleName()) && !StringUtils.isBlank(model.getNodeName()); - } - - public static void sendMessage(String topic,String businessId,String messageBody) { - try { - //todo 替换开源mq消息发送 + private static final Logger log = LoggerFactory.getLogger(KeyNodeLogUtil.class); + + + private static RingBuffer ringBuffer = null; + + static { + initDisruptor(); + } + + + public static void initDisruptor() { + // 指定RingBuffer的大小 + int bufferSize = 1024; + //批量提交日志大小 + int batchLogSize = 10; + + // 生产者的线程工厂 + ThreadFactory threadFactory = r -> new Thread(r, "logDisruptorThread"); + + // RingBuffer生产工厂,初始化RingBuffer的时候使用 + EventFactory factory = KeyNodeLogModel::new; + + // 阻塞策略 + BlockingWaitStrategy strategy = new BlockingWaitStrategy(); + + // 创建disruptor,采用单生产者模式 + Disruptor disruptor = new Disruptor<>(factory, bufferSize, threadFactory, ProducerType.SINGLE, strategy); + ringBuffer = disruptor.getRingBuffer(); + + // 处理Event的handler + EventHandler handler = (element, sequence, endOfBatch) -> { + if (Objects.isNull(element)) { + return; + } + sendSingleLog(element); + }; + // 设置EventHandler + disruptor.handleEventsWith(handler); + + // 启动disruptor的线程 + disruptor.start(); + } + + /** + * 发布disruptor事件 + * + * @param model + */ + public static void applyLogEvent(KeyNodeLogModel model) { + if (ringBuffer == null) { + //disruptor未初始化 + log.error("disruptor未初始化,使用单发mq"); + sendSingleLog(model); + return; + } + + // 获取下一个可用位置的下标 + long sequence; + try { + sequence = ringBuffer.tryNext(); + } catch (InsufficientCapacityException e) { + log.error("disruptor队列不足,使用单发mq"); + sendSingleLog(model); + return; + } + try { + // 返回可用位置的元素 + KeyNodeLogModel event = ringBuffer.get(sequence); + // 设置该位置元素的值 + event.setBusinessId(model.getBusinessId()); + event.setBusinessTime(model.getBusinessTime()); + event.setDescribe(model.getDescribe()); + event.setLogTime(model.getLogTime()); + event.setModuleName(model.getModuleName()); + event.setNodeName(model.getNodeName()); + } catch (Exception e) { + log.error("disruptor发布event失败", e); + } finally { + ringBuffer.publish(sequence); + } + } + + /** + * 单条日志发送 + * + * @param model + */ + public static void sendSingleLog(KeyNodeLogModel model) { + String content = GsonUtil.bean2Json(model); + try { + sendMessage(JmqConfig.getTopic(), model.getBusinessId(), content); + } catch (Exception e) { + log.error("sql analysis out mq error{}", model.getBusinessId(), e); + } + } + + + public static void sendLog(String businessId, String modelName, String nodeName, String describe, Date businessTime) { + KeyNodeLogModel model = KeyNodeLogModel.builder() + .businessId(businessId) + .businessTime(businessTime) + .logTime(new Date()) + .moduleName(modelName) + .nodeName(nodeName) + .describe(describe) + .build(); + + if (!checkModel(model)) { + return; + } + + applyLogEvent(model); + } + + /** + * 检测模块 是否需要发送 + * + * @param model + * @return + */ + public static boolean checkModel(KeyNodeLogModel model) { + return !StringUtils.isBlank(model.getBusinessId()) && !StringUtils.isBlank(model.getModuleName()) && !StringUtils.isBlank(model.getNodeName()); + } + + public static void sendMessage(String topic, String businessId, String messageBody) { + try { + //todo 替换开源mq消息发送 // if(producer==null){ // initProducer(); // } @@ -152,12 +155,12 @@ public static void sendMessage(String topic,String businessId,String messageBody // } // Message message = new Message(topic, messageBody, businessId); // producer.send(message); - } catch (Exception e) { - e.printStackTrace(); - log.error("sql analysis send mq error : {}",e); - } - } - - public static synchronized void initProducer(){ - } + } catch (Exception e) { + e.printStackTrace(); + log.error("sql analysis send mq error : {}", e); + } + } + + public static synchronized void initProducer() { + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/MetaObjectUtil.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/MetaObjectUtil.java index fd5d742..e516514 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/MetaObjectUtil.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/MetaObjectUtil.java @@ -14,18 +14,19 @@ * @Date 19:53 2022/11/1 **/ public class MetaObjectUtil { - private static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory(); - private static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory(); - private static final ReflectorFactory DEFAULT_REFLECTOR_FACTORY = new DefaultReflectorFactory(); + private static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory(); + private static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory(); + private static final ReflectorFactory DEFAULT_REFLECTOR_FACTORY = new DefaultReflectorFactory(); - /** - * MetaObject 对象实例化 - * @param object - * @return - */ - public static MetaObject forObject(Object object) { - return MetaObject.forObject(object, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, DEFAULT_REFLECTOR_FACTORY); - } + /** + * MetaObject 对象实例化 + * + * @param object + * @return + */ + public static MetaObject forObject(Object object) { + return MetaObject.forObject(object, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, DEFAULT_REFLECTOR_FACTORY); + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java b/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java index 0654512..f5ad2a1 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/util/MysqlVersion.java @@ -1,7 +1,6 @@ package com.jd.sql.analysis.util; import lombok.Getter; -import lombok.Setter; /** * @Author huhaitao21 @@ -11,14 +10,14 @@ @Getter public enum MysqlVersion { - MYSQL_5_6("MYSQL_5.6"), - MYSQL_5_7( "MYSQL_5.7"); + MYSQL_5_6("MYSQL_5.6"), + MYSQL_5_7("MYSQL_5.7"); - MysqlVersion(String version) { - this.version = version; - } + private final String version; - private final String version; + MysqlVersion(String version) { + this.version = version; + } } From 3c3bf937da52c7da6236ab43b97112cba3ef6c73 Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 13:57:11 -0300 Subject: [PATCH 28/30] refactor: sample --- .../analysis_samples/mapper/TaskMapper.java | 4 +- .../analysis_samples/util/MyBatisUtil.java | 132 +++++++++--------- .../jd/sql/analysis/analysis/SqlAnalysis.java | 2 +- .../analysis/SqlAnalysisSqlTypeEnum.java | 1 - 4 files changed, 72 insertions(+), 67 deletions(-) diff --git a/sql-analysis-samples/src/main/java/com/jd/sql/analysis_samples/mapper/TaskMapper.java b/sql-analysis-samples/src/main/java/com/jd/sql/analysis_samples/mapper/TaskMapper.java index 8f95b63..e1404ee 100644 --- a/sql-analysis-samples/src/main/java/com/jd/sql/analysis_samples/mapper/TaskMapper.java +++ b/sql-analysis-samples/src/main/java/com/jd/sql/analysis_samples/mapper/TaskMapper.java @@ -8,11 +8,11 @@ public interface TaskMapper { int deleteByPrimaryKey(Long id); - int insert(Task record); + int insert(Task task); Task selectByPrimaryKey(Long id); - int updateByPrimaryKey(Task record); + int updateByPrimaryKey(Task task); /** * 通过实体作为筛选条件查询 diff --git a/sql-analysis-samples/src/main/java/com/jd/sql/analysis_samples/util/MyBatisUtil.java b/sql-analysis-samples/src/main/java/com/jd/sql/analysis_samples/util/MyBatisUtil.java index b605cfa..db4c4d7 100644 --- a/sql-analysis-samples/src/main/java/com/jd/sql/analysis_samples/util/MyBatisUtil.java +++ b/sql-analysis-samples/src/main/java/com/jd/sql/analysis_samples/util/MyBatisUtil.java @@ -3,6 +3,7 @@ import com.jd.sql.analysis.util.GsonUtil; import com.jd.sql.analysis_samples.mapper.TaskMapper; import com.jd.sql.analysis_samples.po.Task; +import lombok.Getter; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; @@ -18,74 +19,79 @@ * @Date 14:35 2022/11/11 **/ public class MyBatisUtil { - public static SqlSessionFactory sqlSessionFactory; + @Getter + private static SqlSessionFactory sqlSessionFactory; - static { - InputStream fis = null; - InputStream inputStream = null; - try { - //创建Properties对象 - Properties prop = new Properties(); - //创建输入流,指向配置文件,getResourceAsStream可以从classpath加载资源 - fis= Resources.getResourceAsStream("jdbc.properties"); - //加载属性文件 - prop.load(fis); + static { + InputStream fis = null; + InputStream inputStream = null; + try { + //创建Properties对象 + Properties prop = new Properties(); + //创建输入流,指向配置文件,getResourceAsStream可以从classpath加载资源 + fis = Resources.getResourceAsStream("jdbc.properties"); + //加载属性文件 + prop.load(fis); - // 从类路径下加载资源文件mybatis-config.xml - String resource = "mybatis-config.xml"; - InputStream is = Resources.getResourceAsStream(resource); - // 由 SqlSessionFactoryBuilder创建SqlSessionFactory - sqlSessionFactory = new SqlSessionFactoryBuilder().build(is,"dev",prop); - } catch (IOException e) { - e.printStackTrace(); - }finally { - if(fis != null){ - try { - fis.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - if(inputStream != null){ - try { - inputStream.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - } + // 从类路径下加载资源文件mybatis-config.xml + String resource = "mybatis-config.xml"; + InputStream is = Resources.getResourceAsStream(resource); + // 由 SqlSessionFactoryBuilder创建SqlSessionFactory + setSqlSessionFactory(new SqlSessionFactoryBuilder().build(is, "dev", prop)); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } - public static void main(String[]args){ - SqlSession sqlSession = getSqlSession(); - System.out.println(sqlSession); - TaskMapper mapper = sqlSession.getMapper(TaskMapper.class); + public static void main(String[] args) { + SqlSession sqlSession = getSqlSession(); + System.out.println(sqlSession); + TaskMapper mapper = sqlSession.getMapper(TaskMapper.class); - Long id = 21L; - Task task = mapper.selectByPrimaryKey(id); - System.out.println(GsonUtil.bean2Json(task)); - } + Long id = 21L; + Task task = mapper.selectByPrimaryKey(id); + System.out.println(GsonUtil.bean2Json(task)); + } - /** - * 由 SqlSessionFactory创建SqlSession - * - * @return - */ - public static SqlSession getSqlSession() { - return sqlSessionFactory.openSession(); - } + /** + * 由 SqlSessionFactory创建SqlSession + * + * @return + */ + public static SqlSession getSqlSession() { + return getSqlSessionFactory().openSession(); + } - /** - * 关闭SqlSession - * - * @param sqlSession - */ - public static void closeSqlSession(SqlSession sqlSession) { - if (sqlSession != null) { - sqlSession.close(); - } - } + /** + * 关闭SqlSession + * + * @param sqlSession + */ + public static void closeSqlSession(SqlSession sqlSession) { + if (sqlSession != null) { + sqlSession.close(); + } + } + + public static void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { + MyBatisUtil.sqlSessionFactory = sqlSessionFactory; + } } diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java index 21d79a3..1505d4f 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysis.java @@ -34,7 +34,7 @@ public class SqlAnalysis { * @return */ public static SqlAnalysisResultList analysis(SqlExtractResult sqlExtractResult, Connection connection) { - if (sqlExtractResult == null) { + if (sqlExtractResult == null || connection == null) { return null; } String sourceSql = sqlExtractResult.getSourceSql(); diff --git a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java index f4116ec..aa98819 100644 --- a/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java +++ b/sql-analysis/src/main/java/com/jd/sql/analysis/analysis/SqlAnalysisSqlTypeEnum.java @@ -8,7 +8,6 @@ * @Description sql 分析组件支持分析的sql类型 * @Date 19:36 2022/11/3 **/ -@Setter @Getter public enum SqlAnalysisSqlTypeEnum { From 3d75351d4cd17ff1531d4491be2356ee5e32b52d Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 13:57:30 -0300 Subject: [PATCH 29/30] tests: add some new tests --- .../src/test/java/SqlAnalysisTest.java | 74 +++++++++++++------ 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/sql-analysis-samples/src/test/java/SqlAnalysisTest.java b/sql-analysis-samples/src/test/java/SqlAnalysisTest.java index eb37da0..86daa50 100644 --- a/sql-analysis-samples/src/test/java/SqlAnalysisTest.java +++ b/sql-analysis-samples/src/test/java/SqlAnalysisTest.java @@ -1,11 +1,17 @@ +import com.jd.sql.analysis.analysis.SqlAnalysis; +import com.jd.sql.analysis.extract.SqlExtractResult; import com.jd.sql.analysis_samples.mapper.TaskMapper; import com.jd.sql.analysis_samples.po.Task; import com.jd.sql.analysis_samples.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; +import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import java.util.List; +import static org.junit.Assert.assertNull; + /** * @Author huhaitao21 * @Description SqlAnalysisTest @@ -13,27 +19,51 @@ **/ public class SqlAnalysisTest { - private TaskMapper mapper; - - @Test - public void testFastSql(){ - //走索引 - SqlSession sqlSession = MyBatisUtil.getSqlSession(); - mapper = sqlSession.getMapper(TaskMapper.class); - Task task = new Task(); - task.setCreateUser("zhangsan1"); - List list = mapper.queryAll(task); - - } - - @Test - public void testSimpleSlowSql(){ - //不走索引 - SqlSession sqlSession = MyBatisUtil.getSqlSession(); - mapper = sqlSession.getMapper(TaskMapper.class); - Task task = new Task(); - task.setTitle("测试"); - List list = mapper.queryAll(task); - } + private TaskMapper mapper; + private SqlSession sqlSession; + + @Before + public void setUp() { + sqlSession = MyBatisUtil.getSqlSession(); + mapper = sqlSession.getMapper(TaskMapper.class); + } + + @Test + public void testAnalysisWithNullConnection() { + SqlExtractResult sqlExtractResult = new SqlExtractResult(); + sqlExtractResult.setSourceSql("SELECT * FROM task"); + assertNull(SqlAnalysis.analysis(sqlExtractResult, null)); + } + + @Test + public void testFastSql() { + Task task = new Task(); + task.setCreateUser("zhangsan1"); + List list = mapper.queryAll(task); + Assert.assertNotNull(list); + + } + + @Test + public void testSimpleSlowSql() { + Task task = new Task(); + task.setTitle("测试"); + List list = mapper.queryAll(task); + Assert.assertNotNull(list); + } + + + @Test + public void testNewSql1() { + SqlExtractResult sqlExtractResult = new SqlExtractResult(); + sqlExtractResult.setSourceSql("SELECT * FROM task WHERE create_user = 'zhangsan1'"); + Assert.assertNotNull(SqlAnalysis.analysis(sqlExtractResult, sqlSession.getConnection())); + } + @Test + public void testNewSql2() { + SqlExtractResult sqlExtractResult = new SqlExtractResult(); + sqlExtractResult.setSourceSql("SELECT * FROM task WHERE title = '测试'"); + Assert.assertNotNull(SqlAnalysis.analysis(sqlExtractResult, sqlSession.getConnection())); + } } From fb2012ef654532ab6d7b0f52c296855100c7477a Mon Sep 17 00:00:00 2001 From: "Breno A." Date: Wed, 1 May 2024 14:33:07 -0300 Subject: [PATCH 30/30] chore: readme cleanup --- README.md | 13 +++++------ ...06\346\210\220\346\211\213\345\206\214.md" | 22 +++++++++---------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 792cdaf..d393c58 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ Mybatis-SQL分析组件 ## 1、引入依赖jar包 -``` +```xml io.github.huht123.sql-analysis sql-analysis @@ -75,7 +75,7 @@ Mybatis-SQL分析组件 ## 2、配置组件xml -``` +```xml @@ -110,7 +110,7 @@ Mybatis-SQL分析组件 ### 1、慢sql分析-日志输出+关键词告警 -``` +```xml @@ -122,7 +122,7 @@ Mybatis-SQL分析组件 ### 2、慢sql分析-日志输出+mq输出+es存储+Kibana分析 -``` +```xml @@ -139,7 +139,7 @@ Mybatis-SQL分析组件 ### 3、慢sql替换-配置动态更新sql语句 -``` +```xml @@ -191,5 +191,4 @@ Mybatis-SQL分析组件 # 欢迎共同改进和使用咨询 -扈海涛(huhaitao21@jd.com) - +扈海涛(huhaitao21@jd.com) \ No newline at end of file diff --git "a/\351\233\206\346\210\220\346\211\213\345\206\214.md" "b/\351\233\206\346\210\220\346\211\213\345\206\214.md" index 929508b..75cddec 100644 --- "a/\351\233\206\346\210\220\346\211\213\345\206\214.md" +++ "b/\351\233\206\346\210\220\346\211\213\345\206\214.md" @@ -20,18 +20,18 @@ mybatis.configuration.interceptors=com.github.pagehelper.PageInterceptor,com.jd.rd.intl.mybatis.plugin.condition.ConditionAdderPlugin -```` +```java public class MyBatisInterceptorConfiguration { - @Bean - public Interceptor getSqlAnalysisAspect() { - SqlAnalysisAspect plugin = new SqlAnalysisAspect(); - Properties properties = new Properties(); - properties.setProperty("analysisSwitch", "true"); - plugin.setProperties(properties); - return plugin; - } - } -```` + @Bean + public Interceptor getSqlAnalysisAspect() { + SqlAnalysisAspect plugin = new SqlAnalysisAspect(); + Properties properties = new Properties(); + properties.setProperty("analysisSwitch", "true"); + plugin.setProperties(properties); + return plugin; + } +} +``` ## 三、核心配置属性