From 468a120ab4e35204b667bcdc2463a1988fa44cee Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Tue, 27 Nov 2012 06:27:03 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B0=95=EC=9A=B4=EB=8D=95]=20[LUCYSUS-1744]?= =?UTF-8?q?=20api=20=EB=A5=BC=20=EC=83=81=EC=88=98=EB=A1=9C=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91=ED=95=98=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C.?= 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@927 84d0f5b1-2673-498c-a247-62c4ff18d310 --- src/main/java/com/profiler/Agent.java | 6 ++++ .../com/profiler/context/SpanUpdater.java | 3 +- src/main/java/com/profiler/context/Trace.java | 17 ++++++++-- .../com/profiler/context/TraceContext.java | 10 +++++- .../profiler/interceptor/ApiIdSupport.java | 8 +++++ .../interceptor/DefaultMethodDescriptor.java | 34 ++++--------------- .../interceptor/MethodDescriptor.java | 4 --- .../interceptor/bci/JavaAssistClass.java | 20 +++++++---- .../interceptor/DriverConnectInterceptor.java | 13 +++++-- .../PreparedStatementCreateInterceptor.java | 16 +++++---- ...paredStatementExecuteQueryInterceptor.java | 12 +++++-- .../StatementExecuteUpdateInterceptor.java | 26 +++++++------- .../interceptor/TransactionInterceptor.java | 18 +++++++--- .../db/mysql/MySQLStatementModifier.java | 11 ++++-- .../com/profiler/util/JavaAssistUtils.java | 23 ------------- .../modifier/mapping/ApiUtilsTest.java | 27 +++++++++++++++ .../profiler/util/JavaAssistUtilsTest.java | 7 ++-- 17 files changed, 159 insertions(+), 96 deletions(-) create mode 100644 src/main/java/com/profiler/interceptor/ApiIdSupport.java create mode 100644 src/test/java/com/profiler/modifier/mapping/ApiUtilsTest.java diff --git a/src/main/java/com/profiler/Agent.java b/src/main/java/com/profiler/Agent.java index f637adf73..dd119c4bf 100644 --- a/src/main/java/com/profiler/Agent.java +++ b/src/main/java/com/profiler/Agent.java @@ -6,6 +6,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.profiler.common.dto.thrift.AgentInfo; +import com.profiler.common.mapping.ApiMappingTable; import com.profiler.common.util.SpanUtils; import com.profiler.context.TraceContext; import com.profiler.sender.DataSender; @@ -46,6 +47,11 @@ public class Agent { TraceContext traceContext = TraceContext.getTraceContext(); traceContext.setDataSender(this.dataSender); systemMonitor.setDataSender(dataSender); + + // 매핑 테이블 초기화를 위해 엑세스 + + ApiMappingTable.findApiId("test", null, null); + } private String getId(String key, String defaultValue) { diff --git a/src/main/java/com/profiler/context/SpanUpdater.java b/src/main/java/com/profiler/context/SpanUpdater.java index bf81e943b..347a804d4 100644 --- a/src/main/java/com/profiler/context/SpanUpdater.java +++ b/src/main/java/com/profiler/context/SpanUpdater.java @@ -1,5 +1,6 @@ package com.profiler.context; +@Deprecated public interface SpanUpdater { - Span updateSpan(Span span); + Span updateSpan(Span span); } diff --git a/src/main/java/com/profiler/context/Trace.java b/src/main/java/com/profiler/context/Trace.java index e05a4057f..1192b9117 100644 --- a/src/main/java/com/profiler/context/Trace.java +++ b/src/main/java/com/profiler/context/Trace.java @@ -227,17 +227,27 @@ public final class Trace { if (methodDescriptor == null) { return; } - String method = methodDescriptor.getClassName() + "." + methodDescriptor.getMethodName() + methodDescriptor.getSimpleParameterDescriptor() + ":" + methodDescriptor.getLineNumber(); + String method = methodDescriptor.getClassName() + "." + methodDescriptor.getMethodName() + methodDescriptor.getParameterDescriptor() + ":" + methodDescriptor.getLineNumber(); recordAttribute("API", method); } public void recordApi(MethodDescriptor methodDescriptor, Object[] args) { // API 저장 방법의 개선 필요. - String method = methodDescriptor.getClassName() + "." + methodDescriptor.getMethodName() + methodDescriptor.getSimpleParameterDescriptor() + ":" + methodDescriptor.getLineNumber(); + String method = methodDescriptor.getClassName() + "." + methodDescriptor.getMethodName() + methodDescriptor.getParameterDescriptor() + ":" + methodDescriptor.getLineNumber(); recordAttribute("API", method); recocordArgs(args); } + public void recordApi(int apiId) { + recordAttribute("API-ID", apiId); + } + + public void recordApi(int apiId, Object[] args) { + recordAttribute("API-ID", apiId); + recocordArgs(args); + } + + private void recocordArgs(Object[] args) { if (args != null) { for (int i = 0; i < args.length; i++) { @@ -310,4 +320,7 @@ public final class Trace { } + public void setTransactionId(int transactionId) { + + } } \ No newline at end of file diff --git a/src/main/java/com/profiler/context/TraceContext.java b/src/main/java/com/profiler/context/TraceContext.java index ec0e5e4ec..1e37c4ef4 100644 --- a/src/main/java/com/profiler/context/TraceContext.java +++ b/src/main/java/com/profiler/context/TraceContext.java @@ -5,6 +5,8 @@ import com.profiler.sender.DataSender; import com.profiler.sender.LoggingDataSender; import com.profiler.util.NamedThreadLocal; +import java.util.concurrent.atomic.AtomicInteger; + public class TraceContext { private static TraceContext CONTEXT = new TraceContext(); @@ -19,9 +21,13 @@ public class TraceContext { return CONTEXT; } - private ThreadLocal threadLocal = new NamedThreadLocal("TraceContext"); + private ThreadLocal threadLocal = new NamedThreadLocal("Trace"); + private final ActiveThreadCounter activeThreadCounter = new ActiveThreadCounter(); + // internal stacktrace 추적때 필요한 unique 아이디, activethreadcount의 slow 타임 계산의 위해서도 필요할듯 함. + private final AtomicInteger transactionId = new AtomicInteger(0); + private static final DataSender DEFAULT_DATA_SENDER = new LoggingDataSender(); private DataSender dataSender = DEFAULT_DATA_SENDER; @@ -43,6 +49,8 @@ public class TraceContext { } // datasender연결 부분 수정 필요. trace.setDataSender(this.dataSender); + // +// trace.setTransactionId(transactionId.getAndIncrement()); threadLocal.set(trace); } diff --git a/src/main/java/com/profiler/interceptor/ApiIdSupport.java b/src/main/java/com/profiler/interceptor/ApiIdSupport.java new file mode 100644 index 000000000..9d1caf931 --- /dev/null +++ b/src/main/java/com/profiler/interceptor/ApiIdSupport.java @@ -0,0 +1,8 @@ +package com.profiler.interceptor; + +/** + * + */ +public interface ApiIdSupport { + void setApiId(int apiId); +} diff --git a/src/main/java/com/profiler/interceptor/DefaultMethodDescriptor.java b/src/main/java/com/profiler/interceptor/DefaultMethodDescriptor.java index 855d409e1..b61cc4d19 100644 --- a/src/main/java/com/profiler/interceptor/DefaultMethodDescriptor.java +++ b/src/main/java/com/profiler/interceptor/DefaultMethodDescriptor.java @@ -5,12 +5,10 @@ package com.profiler.interceptor; */ public class DefaultMethodDescriptor implements MethodDescriptor { private String className; - private String simpleClassName; private String methodName; private String[] parameterTypes; - private String[] simpleParameterTypes; private String[] parameterVariableName; @@ -18,14 +16,19 @@ public class DefaultMethodDescriptor implements MethodDescriptor { private String parameterDescriptor; - private String simpleParameterDescriptor; - private int lineNumber; public DefaultMethodDescriptor() { } + public DefaultMethodDescriptor(String className, String methodName, String[] parameterTypes, String[] parameterVariableName) { + this.className = className; + this.methodName = methodName; + this.parameterTypes = parameterTypes; + this.parameterVariableName = parameterVariableName; + } + public String getParameterDescriptor() { return parameterDescriptor; } @@ -34,14 +37,6 @@ public class DefaultMethodDescriptor implements MethodDescriptor { this.parameterDescriptor = parameterDescriptor; } - public String getSimpleParameterDescriptor() { - return simpleParameterDescriptor; - } - - public void setSimpleParameterDescriptor(String simpleParameterDescriptor) { - this.simpleParameterDescriptor = simpleParameterDescriptor; - } - public void setMethodName(String methodName) { this.methodName = methodName; @@ -69,14 +64,6 @@ public class DefaultMethodDescriptor implements MethodDescriptor { return className; } - @Override - public String getSimpleClassName() { - return simpleClassName; - } - - public void setSimpleClassName(String simpleClassName) { - this.simpleClassName = simpleClassName; - } public void setClassName(String className) { this.className = className; @@ -92,13 +79,6 @@ public class DefaultMethodDescriptor implements MethodDescriptor { return parameterVariableName; } - public String[] getSimpleParameterTypes() { - return simpleParameterTypes; - } - - public void setSimpleParameterTypes(String[] simpleParameterTypes) { - this.simpleParameterTypes = simpleParameterTypes; - } public int getLineNumber() { return lineNumber; diff --git a/src/main/java/com/profiler/interceptor/MethodDescriptor.java b/src/main/java/com/profiler/interceptor/MethodDescriptor.java index 51ea3bdef..9e1e9936d 100644 --- a/src/main/java/com/profiler/interceptor/MethodDescriptor.java +++ b/src/main/java/com/profiler/interceptor/MethodDescriptor.java @@ -10,18 +10,14 @@ public interface MethodDescriptor { String getClassName(); - String getSimpleClassName(); String[] getParameterTypes(); - String[] getSimpleParameterTypes(); - String[] getParameterVariableName(); String getParameterDescriptor(); - String getSimpleParameterDescriptor(); int getLineNumber(); } diff --git a/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java b/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java index de81fb112..b7b51470f 100644 --- a/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java +++ b/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java @@ -4,6 +4,8 @@ import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; +import com.profiler.common.mapping.ApiMappingTable; +import com.profiler.common.mapping.ApiUtils; import com.profiler.interceptor.*; import com.profiler.util.JavaAssistUtils; import javassist.*; @@ -166,6 +168,9 @@ public class JavaAssistClass implements InstrumentClass { if (interceptor instanceof ByteCodeMethodDescriptorSupport) { setMethodDescriptor(behavior, (ByteCodeMethodDescriptorSupport) interceptor); } + if (interceptor instanceof ApiIdSupport) { + setApiId(behavior, (ApiIdSupport) interceptor); + } } else { interceptor = InterceptorRegistry.getInterceptor(interceptorId); } @@ -197,6 +202,13 @@ public class JavaAssistClass implements InstrumentClass { } } + private void setApiId(CtBehavior behavior, ApiIdSupport interceptor) throws NotFoundException { + CtClass[] parameterTypes = behavior.getParameterTypes(); + String[] parameterType = JavaAssistUtils.getParameterType(parameterTypes); + int apiId = ApiMappingTable.findApiId(ctClass.getName(), behavior.getName(), parameterType); + interceptor.setApiId(apiId); + } + private void setMethodDescriptor(CtBehavior behavior, ByteCodeMethodDescriptorSupport interceptor) throws NotFoundException { DefaultMethodDescriptor methodDescriptor = new DefaultMethodDescriptor(); @@ -204,26 +216,20 @@ public class JavaAssistClass implements InstrumentClass { methodDescriptor.setMethodName(methodName); methodDescriptor.setClassName(ctClass.getName()); - methodDescriptor.setSimpleClassName(ctClass.getSimpleName()); CtClass[] parameterTypes = behavior.getParameterTypes(); String[] parameterType = JavaAssistUtils.getParameterType(parameterTypes); methodDescriptor.setParameterTypes(parameterType); - String[] parameterSimpleType = JavaAssistUtils.getParameterSimpleType(parameterTypes); - methodDescriptor.setSimpleParameterTypes(parameterSimpleType); - String[] parameterVariableName = JavaAssistUtils.getParameterVariableName(behavior); methodDescriptor.setParameterVariableName(parameterVariableName); int lineNumber = JavaAssistUtils.getLineNumber(behavior); methodDescriptor.setLineNumber(lineNumber); - String parameterDescription = JavaAssistUtils.mergeParameterVariableNameDescription(parameterType, parameterVariableName); + String parameterDescription = ApiUtils.mergeParameterVariableNameDescription(parameterType, parameterVariableName); methodDescriptor.setParameterDescriptor(parameterDescription); - String simpleParameterDescription = JavaAssistUtils.mergeParameterVariableNameDescription(parameterType, parameterVariableName); - methodDescriptor.setSimpleParameterDescriptor(simpleParameterDescription); interceptor.setMethodDescriptor(methodDescriptor); } 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 8ef49fba5..9084c1f3e 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/DriverConnectInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/DriverConnectInterceptor.java @@ -3,6 +3,7 @@ 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.ApiIdSupport; import com.profiler.interceptor.ByteCodeMethodDescriptorSupport; import com.profiler.interceptor.MethodDescriptor; import com.profiler.interceptor.StaticAroundInterceptor; @@ -19,13 +20,15 @@ import java.util.logging.Logger; /** * */ -public class DriverConnectInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport { +public class DriverConnectInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport, ApiIdSupport { private final Logger logger = Logger.getLogger(DriverConnectInterceptor.class.getName()); private final MetaObject setUrl = new MetaObject("__setUrl", Object.class); private JDBCUrlParser urlParser = new JDBCUrlParser(); + private MethodDescriptor descriptor; + private int apiId; @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { @@ -74,7 +77,8 @@ public class DriverConnectInterceptor implements StaticAroundInterceptor, ByteCo trace.recordRpcName(databaseInfo.getType(), databaseInfo.getDatabaseId(), databaseInfo.getUrl()); trace.recordEndPoint(databaseInfo.getUrl()); - trace.recordApi(descriptor, new Object[]{args[0]}); +// trace.recordApi(descriptor, new Object[]{args[0]}); + trace.recordApi(apiId, new Object[]{args[0]}); trace.recordException(result); trace.markAfterTime(); @@ -94,4 +98,9 @@ public class DriverConnectInterceptor implements StaticAroundInterceptor, ByteCo public void setMethodDescriptor(MethodDescriptor descriptor) { this.descriptor = descriptor; } + + @Override + public void setApiId(int apiId) { + this.apiId = apiId; + } } 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 3246f2aba..789639e9c 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementCreateInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementCreateInterceptor.java @@ -2,10 +2,7 @@ package com.profiler.modifier.db.interceptor; import com.profiler.context.Trace; import com.profiler.context.TraceContext; -import com.profiler.interceptor.ByteCodeMethodDescriptorSupport; -import com.profiler.interceptor.MethodDescriptor; -import com.profiler.interceptor.StaticAfterInterceptor; -import com.profiler.interceptor.StaticAroundInterceptor; +import com.profiler.interceptor.*; import com.profiler.modifier.db.util.DatabaseInfo; import com.profiler.util.InterceptorUtils; import com.profiler.util.MetaObject; @@ -16,7 +13,7 @@ import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; -public class PreparedStatementCreateInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport { +public class PreparedStatementCreateInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport, ApiIdSupport { private final Logger logger = Logger.getLogger(PreparedStatementCreateInterceptor.class.getName()); private MethodDescriptor descriptor; @@ -26,6 +23,7 @@ public class PreparedStatementCreateInterceptor implements StaticAroundIntercept private final MetaObject setUrl = new MetaObject("__setUrl", Object.class); private final MetaObject setSql = new MetaObject("__setSql", String.class); + private int apiId; @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { @@ -77,7 +75,8 @@ public class PreparedStatementCreateInterceptor implements StaticAroundIntercept // trace.recordAttribute("PreparedStatement", sql); } - trace.recordApi(descriptor, args); +// trace.recordApi(descriptor, args); + trace.recordApi(apiId, args); trace.markAfterTime(); trace.traceBlockEnd(); @@ -88,4 +87,9 @@ public class PreparedStatementCreateInterceptor implements StaticAroundIntercept public void setMethodDescriptor(MethodDescriptor descriptor) { this.descriptor = descriptor; } + + @Override + public void setApiId(int apiId) { + this.apiId = apiId; + } } 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 214607c50..6c9308807 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/PreparedStatementExecuteQueryInterceptor.java @@ -3,6 +3,7 @@ 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.ApiIdSupport; import com.profiler.interceptor.ByteCodeMethodDescriptorSupport; import com.profiler.interceptor.MethodDescriptor; import com.profiler.interceptor.StaticAroundInterceptor; @@ -18,7 +19,7 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport { +public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport, ApiIdSupport { private final Logger logger = Logger.getLogger(PreparedStatementExecuteQueryInterceptor.class.getName()); @@ -28,6 +29,7 @@ public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInt private final MetaObject setBindValue = new MetaObject("__setBindValue", Map.class); private MethodDescriptor descriptor; + private int apiId; @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { @@ -57,7 +59,8 @@ public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInt String bindString = toBindVariable(bindValue); trace.recordAttribute("BindValue", bindString); - trace.recordApi(descriptor, args); +// trace.recordApi(descriptor, args); + trace.recordApi(apiId); clean(target); @@ -118,4 +121,9 @@ public class PreparedStatementExecuteQueryInterceptor implements StaticAroundInt public void setMethodDescriptor(MethodDescriptor descriptor) { this.descriptor = descriptor; } + + @Override + public void setApiId(int apiId) { + this.apiId = apiId; + } } 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 f32e0114c..22d6a5907 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/StatementExecuteUpdateInterceptor.java @@ -3,6 +3,7 @@ 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.ApiIdSupport; import com.profiler.interceptor.StaticAroundInterceptor; import com.profiler.modifier.db.util.DatabaseInfo; import com.profiler.util.MetaObject; @@ -17,11 +18,12 @@ import java.util.logging.Logger; * * @author netspider */ -public class StatementExecuteUpdateInterceptor implements StaticAroundInterceptor { +public class StatementExecuteUpdateInterceptor implements StaticAroundInterceptor, ApiIdSupport { private final Logger logger = Logger.getLogger(StatementExecuteUpdateInterceptor.class.getName()); private final MetaObject getUrl = new MetaObject("__getUrl"); + private int apiId; @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { @@ -42,17 +44,10 @@ public class StatementExecuteUpdateInterceptor implements StaticAroundIntercepto trace.markBeforeTime(); try { - if (args.length > 0) { - DatabaseInfo databaseInfo = (DatabaseInfo) this.getUrl.invoke(target); - trace.recordRpcName(databaseInfo.getType(), databaseInfo.getDatabaseId(), databaseInfo.getUrl()); - trace.recordEndPoint(databaseInfo.getUrl()); - trace.recordAttribute("Query", args[0]); - } else { - DatabaseInfo databaseInfo = (DatabaseInfo) this.getUrl.invoke(target); - trace.recordRpcName(databaseInfo.getType(), databaseInfo.getDatabaseId(), databaseInfo.getUrl()); - trace.recordEndPoint(databaseInfo.getUrl()); - trace.recordAttribute("Query", "args size is 0"); - } + DatabaseInfo databaseInfo = (DatabaseInfo) this.getUrl.invoke(target); + trace.recordRpcName(databaseInfo.getType(), databaseInfo.getDatabaseId(), databaseInfo.getUrl()); + trace.recordEndPoint(databaseInfo.getUrl()); + trace.recordApi(apiId, args); } catch (Exception e) { @@ -76,8 +71,15 @@ public class StatementExecuteUpdateInterceptor implements StaticAroundIntercepto return; } + trace.recordException(result); + // TODO 결과, 수행시간을.알수 있어야 될듯. trace.markAfterTime(); trace.traceBlockEnd(); } + + @Override + public void setApiId(int apiId) { + this.apiId = apiId; + } } 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 94bababe5..a7ca2b409 100644 --- a/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/interceptor/TransactionInterceptor.java @@ -7,6 +7,7 @@ import java.util.logging.Logger; import com.profiler.context.Trace; import com.profiler.context.TraceContext; +import com.profiler.interceptor.ApiIdSupport; import com.profiler.interceptor.ByteCodeMethodDescriptorSupport; import com.profiler.interceptor.MethodDescriptor; import com.profiler.interceptor.StaticAroundInterceptor; @@ -14,12 +15,13 @@ import com.profiler.modifier.db.util.DatabaseInfo; import com.profiler.util.MetaObject; import com.profiler.util.StringUtils; -public class TransactionInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport { +public class TransactionInterceptor implements StaticAroundInterceptor, ByteCodeMethodDescriptorSupport, ApiIdSupport { private final Logger logger = Logger.getLogger(TransactionInterceptor.class.getName()); private final MetaObject getUrl = new MetaObject("__getUrl"); private MethodDescriptor descriptor; + private int apiId; @Override public void before(Object target, String className, String methodName, String parameterDescription, Object[] args) { @@ -83,7 +85,8 @@ public class TransactionInterceptor implements StaticAroundInterceptor, ByteCode private void afterStartTransaction(Trace trace, Connection target, Object[] arg, Object result) { try { - trace.recordApi(descriptor, arg); +// trace.recordApi(descriptor, arg); + trace.recordApi(apiId, arg); trace.recordException(result); // Boolean autocommit = (Boolean) arg; // boolean success = InterceptorUtils.isSuccess(result); @@ -135,7 +138,8 @@ public class TransactionInterceptor implements StaticAroundInterceptor, ByteCode trace.recordRpcName(databaseInfo.getType(), databaseInfo.getDatabaseId(), databaseInfo.getUrl()); trace.recordEndPoint(databaseInfo.getUrl()); - trace.recordApi(descriptor); +// trace.recordApi(descriptor); + trace.recordApi(apiId); trace.recordException(result); // boolean success = InterceptorUtils.isSuccess(result); @@ -174,7 +178,8 @@ public class TransactionInterceptor implements StaticAroundInterceptor, ByteCode trace.recordRpcName(databaseInfo.getType(), databaseInfo.getDatabaseId(), databaseInfo.getUrl()); trace.recordEndPoint(databaseInfo.getUrl()); - trace.recordApi(descriptor); +// trace.recordApi(descriptor); + trace.recordApi(apiId); trace.recordException(result); // boolean success = InterceptorUtils.isSuccess(result); // if (success) { @@ -197,4 +202,9 @@ public class TransactionInterceptor implements StaticAroundInterceptor, ByteCode public void setMethodDescriptor(MethodDescriptor descriptor) { this.descriptor = descriptor; } + + @Override + public void setApiId(int apiId) { + this.apiId = apiId; + } } diff --git a/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java b/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java index 96a336160..863a6b683 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java @@ -37,8 +37,15 @@ public class MySQLStatementModifier extends AbstractModifier { statementClass.addInterceptor("executeQuery", new String[]{"java.lang.String"}, interceptor); // TODO 이거 고쳐야 됨. - Interceptor executeUpdate = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.profiler.modifier.db.interceptor.StatementExecuteUpdateInterceptor"); - statementClass.addInterceptor("executeUpdate", new String[]{"java.lang.String", "boolean", "boolean"}, executeUpdate); + Interceptor executeUpdate1 = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.profiler.modifier.db.interceptor.StatementExecuteUpdateInterceptor"); + statementClass.addInterceptor("executeUpdate", new String[]{"java.lang.String"}, executeUpdate1); + Interceptor executeUpdate2 = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.profiler.modifier.db.interceptor.StatementExecuteUpdateInterceptor"); + statementClass.addInterceptor("executeUpdate", new String[]{"java.lang.String", "boolean"}, executeUpdate2); + + Interceptor executeUpdate3 = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.profiler.modifier.db.interceptor.StatementExecuteUpdateInterceptor"); + statementClass.addInterceptor("execute", new String[]{"java.lang.String"}, executeUpdate3); + Interceptor executeUpdate4 = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.profiler.modifier.db.interceptor.StatementExecuteUpdateInterceptor"); + statementClass.addInterceptor("execute", new String[]{"java.lang.String", "boolean"}, executeUpdate4); statementClass.addTraceVariable("__url", "__setUrl", "__getUrl", "java.lang.Object"); return statementClass.toBytecode(); diff --git a/src/main/java/com/profiler/util/JavaAssistUtils.java b/src/main/java/com/profiler/util/JavaAssistUtils.java index 6fe6b3903..1096410d1 100644 --- a/src/main/java/com/profiler/util/JavaAssistUtils.java +++ b/src/main/java/com/profiler/util/JavaAssistUtils.java @@ -85,29 +85,6 @@ public class JavaAssistUtils { return sb.toString(); } - public static String mergeParameterVariableNameDescription(String[] paramterType, String[] variableName) { - if (paramterType.length != variableName.length) { - throw new IllegalArgumentException("args size not equal"); - } - if (paramterType.length == 0) { - return EMTPY_ARRAY; - } - - StringBuilder sb = new StringBuilder(64); - sb.append('('); - int end = paramterType.length - 1; - for (int i = 0; i < paramterType.length; i++) { - sb.append(paramterType[i]); - sb.append(' '); - sb.append(variableName[i]); - if (i < end) { - sb.append(", "); - } - } - sb.append(')'); - return sb.toString(); - } - public static String getParameterDescription(String[] params) { if (params == null) { diff --git a/src/test/java/com/profiler/modifier/mapping/ApiUtilsTest.java b/src/test/java/com/profiler/modifier/mapping/ApiUtilsTest.java new file mode 100644 index 000000000..27dc2e578 --- /dev/null +++ b/src/test/java/com/profiler/modifier/mapping/ApiUtilsTest.java @@ -0,0 +1,27 @@ +package com.profiler.modifier.mapping; + +import com.profiler.common.mapping.ApiUtils; +import junit.framework.Assert; +import org.junit.Test; + +import java.math.MathContext; + +/** + * + */ +public class ApiUtilsTest { + // 2147483647 + // xxxxxxxx - yyy xxxx는 class 명, yyy는 함수명매칭하자. 하자. + @Test + public void testParseClassId() throws Exception { + int i = ApiUtils.parseClassId(2147483647); + Assert.assertEquals(i, 2147483); + + } + + @Test + public void testParseMethodId() throws Exception { + int i = ApiUtils.parseMethodId(2147483647); + Assert.assertEquals(i, 647); + } +} diff --git a/src/test/java/com/profiler/util/JavaAssistUtilsTest.java b/src/test/java/com/profiler/util/JavaAssistUtilsTest.java index 0649cb450..cb50e0fc8 100644 --- a/src/test/java/com/profiler/util/JavaAssistUtilsTest.java +++ b/src/test/java/com/profiler/util/JavaAssistUtilsTest.java @@ -1,5 +1,6 @@ package com.profiler.util; +import com.profiler.common.mapping.ApiUtils; import javassist.*; import org.junit.Assert; import org.junit.Before; @@ -62,7 +63,7 @@ public class JavaAssistUtilsTest { String[] parameterType = JavaAssistUtils.getParameterType(setParams.getParameterTypes()); logger.info(Arrays.toString(parameterType)); - String s = JavaAssistUtils.mergeParameterVariableNameDescription(parameterType, paramName); + String s = ApiUtils.mergeParameterVariableNameDescription(parameterType, paramName); logger.info(s); } @@ -85,7 +86,7 @@ public class JavaAssistUtilsTest { String[] parameterType = JavaAssistUtils.getParameterType(setParams.getParameterTypes()); logger.info(Arrays.toString(parameterType)); - String s = JavaAssistUtils.mergeParameterVariableNameDescription(parameterType, paramName); + String s = ApiUtils.mergeParameterVariableNameDescription(parameterType, paramName); logger.info(s); } @@ -107,7 +108,7 @@ public class JavaAssistUtilsTest { String[] parameterType = JavaAssistUtils.getParameterType(setParams.getParameterTypes()); logger.info(Arrays.toString(parameterType)); - String s = JavaAssistUtils.mergeParameterVariableNameDescription(parameterType, paramName); + String s = ApiUtils.mergeParameterVariableNameDescription(parameterType, paramName); logger.info(s); }