diff --git a/src/main/java/com/profiler/context/Trace.java b/src/main/java/com/profiler/context/Trace.java index fa7554b9b..3ae7c51ba 100644 --- a/src/main/java/com/profiler/context/Trace.java +++ b/src/main/java/com/profiler/context/Trace.java @@ -284,8 +284,16 @@ public final class Trace { recordAttribute(key, (Object) value); } - public void recordSqlInfo(String sql) { + public ParsingResult recordSqlInfo(String sql) { + if (sql == null) { + return null; + } ParsingResult parsingResult = parseSql(sql); + recordSqlParsingResult(parsingResult); + return parsingResult; + } + + public void recordSqlParsingResult(ParsingResult parsingResult) { recordAttribute(AnnotationNames.SQL_ID, parsingResult.getSql().hashCode()); String output = parsingResult.getOutput(); if (output != null && output.length() != 0) { @@ -295,7 +303,6 @@ public final class Trace { public ParsingResult parseSql(String sql) { - Assert.notNull(sql, "sql must not null"); // 해당 api의 구현을 그냥 tarceContext api에 만들어야 될듯 하다. ParsingResult parsingResult = this.sqlParser.normalizedSql(sql); diff --git a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementCreateInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementCreateInterceptor.java index 789639e9c..388b43164 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementCreateInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementCreateInterceptor.java @@ -1,5 +1,6 @@ package com.profiler.modifier.db.interceptor; +import com.profiler.common.util.ParsingResult; import com.profiler.context.Trace; import com.profiler.context.TraceContext; import com.profiler.interceptor.*; @@ -22,7 +23,7 @@ public class PreparedStatementCreateInterceptor implements StaticAroundIntercept private final MetaObject getUrl = new MetaObject("__getUrl"); private final MetaObject setUrl = new MetaObject("__setUrl", Object.class); - private final MetaObject setSql = new MetaObject("__setSql", String.class); + private final MetaObject setSql = new MetaObject("__setSql", Object.class); private int apiId; @Override @@ -69,14 +70,17 @@ public class PreparedStatementCreateInterceptor implements StaticAroundIntercept DatabaseInfo databaseInfo = (DatabaseInfo) getUrl.invoke(target); this.setUrl.invoke(result, databaseInfo); String sql = (String) args[0]; - this.setSql.invoke(result, sql); + + ParsingResult parsingResult = trace.recordSqlInfo(sql); + if (parsingResult != null) { + this.setSql.invoke(result, parsingResult); + } trace.recordException(result); -// trace.recordAttribute("PreparedStatement", sql); } // trace.recordApi(descriptor, args); - trace.recordApi(apiId, args); + trace.recordApi(apiId); trace.markAfterTime(); trace.traceBlockEnd(); diff --git a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java index 5c28a86f8..3f8488630 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java @@ -8,6 +8,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.profiler.common.AnnotationNames; +import com.profiler.common.util.ParsingResult; import com.profiler.context.Trace; import com.profiler.context.TraceContext; import com.profiler.interceptor.ApiIdSupport; @@ -22,7 +23,7 @@ public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInt private final Logger logger = Logger.getLogger(PreparedStatementExecuteQueryInterceptor.class.getName()); - private final MetaObject getSql = new MetaObject("__getSql"); + private final MetaObject getSql = new MetaObject("__getSql"); private final MetaObject getUrl = new MetaObject("__getUrl"); private final MetaObject getBindValue = new MetaObject("__getBindValue"); private final MetaObject setBindValue = new MetaObject("__setBindValue", Map.class); @@ -51,11 +52,9 @@ public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInt DatabaseInfo databaseInfo = (DatabaseInfo) getUrl.invoke(target); trace.recordRpcName(databaseInfo.getType(), databaseInfo.getDatabaseId(), databaseInfo.getUrl()); trace.recordEndPoint(databaseInfo.getUrl()); - String sql = getSql.invoke(target); + ParsingResult parsingResult = (ParsingResult) getSql.invoke(target); - // 일단 중복처리 - trace.recordAttribute(AnnotationNames.SQL, sql); - trace.recordSqlInfo(sql); + trace.recordSqlParsingResult(parsingResult); Map bindValue = getBindValue.invoke(target); String bindString = toBindVariable(bindValue); @@ -63,7 +62,7 @@ public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInt // trace.recordApi(descriptor, args); trace.recordApi(apiId); - + // clean 타이밍을 변경해야 될듯 하다. clean(target); diff --git a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java index 2c63b089a..3b111625b 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java @@ -1,15 +1,11 @@ package com.profiler.modifier.db.interceptor; -import com.profiler.common.AnnotationNames; -import com.profiler.common.util.ParsingResult; -import com.profiler.context.Annotation; import com.profiler.context.Trace; import com.profiler.context.TraceContext; import com.profiler.interceptor.ByteCodeMethodDescriptorSupport; import com.profiler.interceptor.MethodDescriptor; import com.profiler.interceptor.StaticAroundInterceptor; import com.profiler.modifier.db.util.DatabaseInfo; -import com.profiler.util.InterceptorUtils; import com.profiler.util.MetaObject; import com.profiler.util.StringUtils; @@ -81,8 +77,7 @@ public class StatementExecuteQueryInterceptor implements StaticAroundInterceptor Object arg = args[0]; if (arg instanceof String) { trace.recordSqlInfo((String) arg); - // TODO 일단 중복 처리. - trace.recordAttribute(AnnotationNames.SQL, args[0]); + // TODO parsing result 추가 처리 고려 } } diff --git a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java index 3c630c859..879f043c3 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java @@ -47,13 +47,11 @@ public class StatementExecuteUpdateInterceptor implements StaticAroundIntercepto DatabaseInfo databaseInfo = (DatabaseInfo) this.getUrl.invoke(target); trace.recordRpcName(databaseInfo.getType(), databaseInfo.getDatabaseId(), databaseInfo.getUrl()); trace.recordEndPoint(databaseInfo.getUrl()); - trace.recordApi(apiId, args); + trace.recordApi(apiId); if (args.length > 0) { Object arg = args[0]; if (arg instanceof String) { trace.recordSqlInfo((String) arg); - // TODO 일단 중복 처리. - trace.recordAttribute(AnnotationNames.SQL, args[0]); } } diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java index 931f8e406..6a623ad43 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLPreparedStatementModifier.java @@ -54,7 +54,7 @@ public class MySQLPreparedStatementModifier extends AbstractModifier { preparedStatement.addInterceptor("executeUpdate", null, executeUpdate); preparedStatement.addTraceVariable("__url", "__setUrl", "__getUrl", "java.lang.Object"); - preparedStatement.addTraceVariable("__sql", "__setSql", "__getSql", "java.lang.String"); + preparedStatement.addTraceVariable("__sql", "__setSql", "__getSql", "java.lang.Object"); preparedStatement.addTraceVariable("__bindValue", "__setBindValue", "__getBindValue", "java.util.Map", "java.util.Collections.synchronizedMap(new java.util.HashMap());"); bindVariableIntercept(preparedStatement, classLoader, protectedDomain);