From cbdb866f4191f052d981d50a77ee5d3826ff5a91 Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Tue, 20 Nov 2012 09:34:18 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B0=95=EC=9A=B4=EB=8D=95]=20[LUCYSUS-1744]?= =?UTF-8?q?=20=EC=B6=94=EC=A0=81=20=EB=8C=80=EC=83=81=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EB=A5=BC=20=20=ED=98=B8=EC=B6=9C=EB=90=98=EB=8A=94=20?= =?UTF-8?q?api=20=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=ED=95=A8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-tomcat-profiler/trunk@881 84d0f5b1-2673-498c-a247-62c4ff18d310 --- src/main/java/com/profiler/context/Trace.java | 14 +++ .../ExecuteMethodInterceptor.java | 2 +- .../interceptor/DriverConnectInterceptor.java | 12 +-- .../PreparedStatementCreateInterceptor.java | 2 +- .../StatementExecuteQueryInterceptor.java | 18 +++- .../interceptor/TransactionInterceptor.java | 96 +++++++++++-------- .../db/mysql/MySQLConnectionImplModifier.java | 10 +- .../com/profiler/util/JavaAssistUtils.java | 14 ++- 8 files changed, 105 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/profiler/context/Trace.java b/src/main/java/com/profiler/context/Trace.java index 76676cce5..d5bbbbc37 100644 --- a/src/main/java/com/profiler/context/Trace.java +++ b/src/main/java/com/profiler/context/Trace.java @@ -226,10 +226,24 @@ public final class Trace { } } + public void recordApi(MethodDescriptor methodDescriptor) { + String method = methodDescriptor.getClassName() + "." + methodDescriptor.getMethodName() + methodDescriptor.getSimpleParameterDescriptor() + ":" + methodDescriptor.getLineNumber(); + recordAttribute("API", method); + } + public void recordApi(MethodDescriptor methodDescriptor, Object[] args) { // API 저장 방법의 개선 필요. String method = methodDescriptor.getClassName() + "." + methodDescriptor.getMethodName() + methodDescriptor.getSimpleParameterDescriptor() + ":" + methodDescriptor.getLineNumber(); recordAttribute("API", method); + recocordArgs(args); + } + + private void recocordArgs(Object[] args) { + if (args != null) { + for (int i = 0; i < args.length; i++) { + recordAttribute("args[" + i + "]", args[i]); + } + } } public void recordAttribute(final String key, final String value) { diff --git a/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java b/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java index 646a6683f..7a34958d1 100644 --- a/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/connector/interceptors/ExecuteMethodInterceptor.java @@ -73,7 +73,7 @@ public class ExecuteMethodInterceptor implements StaticAroundInterceptor, ByteCo if (trace == null) { return; } - trace.recordApi(descriptor, args); + trace.recordApi(descriptor); trace.recordException(result); trace.markAfterTime(); diff --git a/src/main/java/com/profiler/modifier/db/interceptor/DriverConnectInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/DriverConnectInterceptor.java index 33a2088b7..68d912c94 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/DriverConnectInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/DriverConnectInterceptor.java @@ -73,15 +73,9 @@ public class DriverConnectInterceptor implements StaticAroundInterceptor, ByteCo } trace.recordRpcName(databaseInfo.getType() + "/" + databaseInfo.getDatabaseId(), databaseInfo.getUrl()); trace.recordTerminalEndPoint(databaseInfo.getUrl()); - trace.recordAttribute("JDBCConnection", "create"); - if (success) { - trace.recordAttribute("Success", "true"); - } else { - Throwable th = (Throwable) result; - trace.recordAttribute("Success", "false"); - trace.recordAttribute("Exception", th.getMessage()); - } - trace.recordApi(descriptor, args); + + trace.recordApi(descriptor, new Object[]{args[0]}); + trace.recordException(result); trace.markAfterTime(); trace.traceBlockEnd(); 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 1496745cd..bb863a638 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementCreateInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementCreateInterceptor.java @@ -74,7 +74,7 @@ public class PreparedStatementCreateInterceptor implements StaticAroundIntercept this.setSql.invoke(result, sql); trace.recordException(result); - trace.recordAttribute("PreparedStatement", sql); +// trace.recordAttribute("PreparedStatement", sql); } trace.recordApi(descriptor, args); 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 3dd919f3f..29e2da23b 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteQueryInterceptor.java @@ -3,6 +3,8 @@ package com.profiler.modifier.db.interceptor; 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; @@ -16,11 +18,12 @@ import java.util.logging.Logger; /** * @author netspider */ -public class StatementExecuteQueryInterceptor implements StaticAroundInterceptor { +public class StatementExecuteQueryInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport { private final Logger logger = Logger.getLogger(StatementExecuteQueryInterceptor.class.getName()); private final MetaObject getUrl = new MetaObject("__getUrl"); + private MethodDescriptor descriptor; @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { @@ -46,9 +49,9 @@ public class StatementExecuteQueryInterceptor implements StaticAroundInterceptor DatabaseInfo databaseInfo = (DatabaseInfo) this.getUrl.invoke(target); trace.recordRpcName(databaseInfo.getType() + "/" + databaseInfo.getDatabaseId(), databaseInfo.getUrl()); trace.recordTerminalEndPoint(databaseInfo.getUrl()); - if (args.length > 0) { - trace.recordAttribute("Statement", args[0]); - } +// if (args.length > 0) { +// trace.recordAttribute("Statement", args[0]); +// } } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { @@ -71,10 +74,15 @@ public class StatementExecuteQueryInterceptor implements StaticAroundInterceptor if (trace == null) { return; } - + trace.recordApi(descriptor, args); trace.recordException(result); trace.markAfterTime(); trace.traceBlockEnd(); } + + @Override + public void setMethodDescriptor(MethodDescriptor descriptor) { + this.descriptor = descriptor; + } } diff --git a/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java b/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java index b7e3d2654..694a52ffd 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java @@ -5,20 +5,21 @@ import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; -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; -public class TransactionInterceptor implements StaticAroundInterceptor { +public class TransactionInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport { private final Logger logger = Logger.getLogger(TransactionInterceptor.class.getName()); private final MetaObject getUrl = new MetaObject("__getUrl"); + private MethodDescriptor descriptor; @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { @@ -62,7 +63,7 @@ public class TransactionInterceptor implements StaticAroundInterceptor { if (target instanceof Connection) { Connection con = (Connection) target; if ("setAutoCommit".equals(methodName)) { - afterStartTransaction(trace, con, args[0], result); + afterStartTransaction(trace, con, args, result); } else if ("commit".equals(methodName)) { afterCommit(trace, con, result); } else if ("rollback".equals(methodName)) { @@ -79,37 +80,39 @@ public class TransactionInterceptor implements StaticAroundInterceptor { DatabaseInfo databaseInfo = (DatabaseInfo) this.getUrl.invoke(target); trace.recordRpcName(getRpcName(databaseInfo), databaseInfo.getUrl()); trace.recordTerminalEndPoint(databaseInfo.getUrl()); - } private String getRpcName(DatabaseInfo databaseInfo) { return databaseInfo.getType() + "/" + databaseInfo.getDatabaseId(); } - private void afterStartTransaction(Trace trace, Connection target, Object arg, Object result) { + private void afterStartTransaction(Trace trace, Connection target, Object[] arg, Object result) { try { - Boolean autocommit = (Boolean) arg; - boolean success = InterceptorUtils.isSuccess(result); - if (!autocommit) { - // transaction start; - if (success) { - trace.recordAttribute("Transaction", "begin"); - } else { - trace.recordAttribute("Transaction", "begin fail"); - Throwable th = (Throwable) result; - trace.recordAttribute("Exception", th.getMessage()); - } - - } else { - if (success) { - trace.recordAttribute("Transaction", "autoCommit:false"); - } else { - trace.recordAttribute("Transaction", "autoCommit:false fail"); - Throwable th = (Throwable) result; - trace.recordAttribute("Exception", th.getMessage()); - } - - } + trace.recordApi(descriptor, arg); + trace.recordException(result); +// Boolean autocommit = (Boolean) arg; +// boolean success = InterceptorUtils.isSuccess(result); +// if (!autocommit) { +// // transaction start; +// if (success) { +// trace.recordAttribute("Transaction", "begin"); +// trace.recordApi(descriptor, null); +// } else { +// trace.recordAttribute("Transaction", "begin fail"); +// Throwable th = (Throwable) result; +// trace.recordAttribute("Exception", th.getMessage()); +// } +// +// } else { +// if (success) { +// trace.recordAttribute("Transaction", "autoCommit:false"); +// } else { +// trace.recordAttribute("Transaction", "autoCommit:false fail"); +// Throwable th = (Throwable) result; +// trace.recordAttribute("Exception", th.getMessage()); +// } +// +// } } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { logger.log(Level.WARNING, e.getMessage(), e); @@ -137,14 +140,17 @@ public class TransactionInterceptor implements StaticAroundInterceptor { trace.recordRpcName(getRpcName(databaseInfo), databaseInfo.getUrl()); trace.recordTerminalEndPoint(databaseInfo.getUrl()); - boolean success = InterceptorUtils.isSuccess(result); - if (success) { - trace.recordAttribute("Transaction", "commit"); - } else { - trace.recordAttribute("Transaction", "commit fail"); - Throwable th = (Throwable) result; - trace.recordAttribute("Exception", th.getMessage()); - } + trace.recordApi(descriptor); + trace.recordException(result); + +// boolean success = InterceptorUtils.isSuccess(result); +// if (success) { +// trace.recordAttribute("Transaction", "commit"); +// } else { +// trace.recordAttribute("Transaction", "commit fail"); +// Throwable th = (Throwable) result; +// trace.recordAttribute("Exception", th.getMessage()); +// } } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { @@ -173,12 +179,14 @@ public class TransactionInterceptor implements StaticAroundInterceptor { trace.recordRpcName(getRpcName(databaseInfo), databaseInfo.getUrl()); trace.recordTerminalEndPoint(databaseInfo.getUrl()); - boolean success = InterceptorUtils.isSuccess(result); - if (success) { - trace.recordAttribute("Transaction", "rollback"); - } else { - trace.recordAttribute("Transaction", "rollback fail"); - } + trace.recordApi(descriptor); + trace.recordException(result); +// boolean success = InterceptorUtils.isSuccess(result); +// if (success) { +// trace.recordAttribute("Transaction", "rollback"); +// } else { +// trace.recordAttribute("Transaction", "rollback fail"); +// } trace.recordException(result); } catch (Exception e) { if (logger.isLoggable(Level.WARNING)) { @@ -190,4 +198,8 @@ public class TransactionInterceptor implements StaticAroundInterceptor { } } + @Override + public void setMethodDescriptor(MethodDescriptor descriptor) { + this.descriptor = descriptor; + } } diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java index 55bf5b1fb..e02db5a0f 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifier.java @@ -54,10 +54,12 @@ public class MySQLConnectionImplModifier extends AbstractModifier { mysqlConnection.addInterceptor("prepareStatement", new String[]{"java.lang.String"}, preparedStatement); - Interceptor transaction = new TransactionInterceptor(); - int interceptorId = mysqlConnection.addInterceptor("setAutoCommit", new String[]{"boolean"}, transaction); - mysqlConnection.reuseInterceptor("commit", null, interceptorId); - mysqlConnection.reuseInterceptor("rollback", null, interceptorId); + Interceptor setAutocommit = new TransactionInterceptor(); + mysqlConnection.addInterceptor("setAutoCommit", new String[]{"boolean"}, setAutocommit); + Interceptor commit = new TransactionInterceptor(); + mysqlConnection.addInterceptor("commit", null, commit); + Interceptor rollback = new TransactionInterceptor(); + mysqlConnection.addInterceptor("rollback", null, rollback); printClassConvertComplete(javassistClassName); diff --git a/src/main/java/com/profiler/util/JavaAssistUtils.java b/src/main/java/com/profiler/util/JavaAssistUtils.java index ae02d14af..1310c1672 100644 --- a/src/main/java/com/profiler/util/JavaAssistUtils.java +++ b/src/main/java/com/profiler/util/JavaAssistUtils.java @@ -163,6 +163,9 @@ public class JavaAssistUtils { public static String[] getParameterVariableName(CtBehavior method) throws NotFoundException { LocalVariableAttribute localVariableAttribute = lookupLocalVariableAttribute(method); + if (localVariableAttribute == null) { + return getParameterDefaultVariableName(method); + } return getParameterVariableName(method, localVariableAttribute); } @@ -185,7 +188,7 @@ public class JavaAssistUtils { // 이거 참고함. if (localVariableAttribute == null) { // null이라는건 debug모드로 컴파일 되지 않았다는 의미이다. - // parameter class명을 default로 하자. + // parameter class명을 default로 넘기는 건 아래 메소드가 함. getParameterDefaultVariableName. return null; } CtClass[] parameterTypes = method.getParameterTypes(); @@ -209,4 +212,13 @@ public class JavaAssistUtils { } return parameterVariableNames; } + + public static String[] getParameterDefaultVariableName(CtBehavior method) throws NotFoundException { + CtClass[] parameterTypes = method.getParameterTypes(); + String[] variableName = new String[parameterTypes.length]; + for (int i = 0; i < variableName.length; i++) { + variableName[i] = parameterTypes[i].getSimpleName().toLowerCase(); + } + return variableName; + } }