diff --git a/compile.txt b/compile.txt new file mode 100644 index 000000000..658d35663 --- /dev/null +++ b/compile.txt @@ -0,0 +1,5 @@ +mvn package -Dmaven.test.skip +이렇게 하면 그냥 패키징 + +mvn package -Dmaven.test.skip -P withThrift +antrun 하고 패키징 \ No newline at end of file diff --git a/src/main/java/com/profiler/StopWatch.java b/src/main/java/com/profiler/StopWatch.java index f13431a20..fb1d6625e 100644 --- a/src/main/java/com/profiler/StopWatch.java +++ b/src/main/java/com/profiler/StopWatch.java @@ -23,7 +23,9 @@ public class StopWatch { public static long stopAndGetElapsed(String name) { Map map = local.get(); if (map == null) { - throw new IllegalStateException("Stopwatch is not started."); + //throw new IllegalStateException("Stopwatch is not started."); + // TODO application 에러로 전달되는경우가 있어서 일단 0으로 + return 0; } else { return System.nanoTime() - map.get(name); } diff --git a/src/main/java/com/profiler/context/Trace.java b/src/main/java/com/profiler/context/Trace.java index 8283d365a..9771f0927 100644 --- a/src/main/java/com/profiler/context/Trace.java +++ b/src/main/java/com/profiler/context/Trace.java @@ -1,9 +1,5 @@ package com.profiler.context; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.profiler.sender.DataSender; import com.profiler.util.NamedThreadLocal; /** @@ -13,8 +9,6 @@ import com.profiler.util.NamedThreadLocal; */ public final class Trace { - private static final Logger logger = Logger.getLogger(Trace.class.getName()); - private static final DeadlineSpanMap spanMap = new DeadlineSpanMap(); private static final ThreadLocal traceId = new NamedThreadLocal("TraceId"); @@ -42,6 +36,15 @@ public final class Trace { return id; } + public static boolean removeTraceId() { + TraceID traceID = traceId.get(); + if(traceID != null) { + traceId.remove(); + return true; + } + return false; + } + /** * Get current TraceID. If it was not set this will return null. * @@ -77,16 +80,9 @@ public final class Trace { } } - static void logSpan(Span span) { - try { - // TODO: send span to server - System.out.println("\n\nWrite span hash=" + span.hashCode() + ", value=" + span + ", spanMap.size=" + spanMap.size() + ", threadid=" + Thread.currentThread().getId() + "\n\n"); - - DataSender.getInstance().addDataToSend(span.toThrift()); - } catch (Exception e) { - e.printStackTrace(); - logger.log(Level.SEVERE, e.getMessage()); - } + public static void logSpan(Span span) { + // TODO: send span to server + System.out.println("\n\nWrite span hash=" + span.hashCode() + ", value=" + span + ", spanMap.size=" + spanMap.size() + ", threadid=" + Thread.currentThread().getId() + "\n\n"); } public static void record(Annotation annotation) { @@ -107,18 +103,13 @@ public final class Trace { if (!tracingEnabled) return; - try { - mutate(getTraceId(), new SpanUpdater() { - @Override - public Span updateSpan(Span span) { - span.addAnnotation(new HippoBinaryAnnotation(System.currentTimeMillis(), key, value)); - return span; - } - }); - } catch (Exception e) { - e.printStackTrace(); - logger.log(Level.SEVERE, e.getMessage()); - } + mutate(getTraceId(), new SpanUpdater() { + @Override + public Span updateSpan(Span span) { + span.addAnnotation(new HippoBinaryAnnotation(System.currentTimeMillis(), key, value)); + return span; + } + }); } public static void recordMessage(String message) { @@ -131,55 +122,41 @@ public final class Trace { public static void recordRpcName(final String service, final String rpc) { if (!tracingEnabled) return; - try { - mutate(getTraceId(), new SpanUpdater() { - @Override - public Span updateSpan(Span span) { - span.setServiceName(service); - span.setName(rpc); - return span; - } - }); - } catch (Exception e) { - e.printStackTrace(); - logger.log(Level.SEVERE, e.getMessage()); - } + + mutate(getTraceId(), new SpanUpdater() { + @Override + public Span updateSpan(Span span) { + span.setServiceName(service); + span.setName(rpc); + return span; + } + }); } public static void recordEndPoint(final String ip, final int port) { if (!tracingEnabled) return; - try { - mutate(getTraceId(), new SpanUpdater() { - @Override - public Span updateSpan(Span span) { - // set endpoint to both span and annotations - span.setEndPoint(new EndPoint(ip, port)); - return span; - } - }); - } catch (Exception e) { - e.printStackTrace(); - logger.log(Level.SEVERE, e.getMessage()); - } + mutate(getTraceId(), new SpanUpdater() { + @Override + public Span updateSpan(Span span) { + // set endpoint to both span and annotations + span.setEndPoint(new EndPoint(ip, port)); + return span; + } + }); } private static void annotate(final String value, final Long duration) { if (!tracingEnabled) return; - try { - mutate(getTraceId(), new SpanUpdater() { - @Override - public Span updateSpan(Span span) { - span.addAnnotation(new HippoAnnotation(System.currentTimeMillis(), value, duration)); - return span; - } - }); - } catch (Exception e) { - e.printStackTrace(); - logger.log(Level.SEVERE, e.getMessage()); - } + mutate(getTraceId(), new SpanUpdater() { + @Override + public Span updateSpan(Span span) { + span.addAnnotation(new HippoAnnotation(System.currentTimeMillis(), value, duration)); + return span; + } + }); } } \ No newline at end of file diff --git a/src/main/java/com/profiler/interceptor/bci/InstrumentClass.java b/src/main/java/com/profiler/interceptor/bci/InstrumentClass.java index 4e494fcc0..9ff9bb062 100644 --- a/src/main/java/com/profiler/interceptor/bci/InstrumentClass.java +++ b/src/main/java/com/profiler/interceptor/bci/InstrumentClass.java @@ -3,6 +3,7 @@ package com.profiler.interceptor.bci; import com.profiler.interceptor.Interceptor; public interface InstrumentClass { + boolean addInterceptor(String methodName, String[] args, Interceptor interceptor); boolean addInterceptor(String methodName, String[] args, Interceptor interceptor, Type type); diff --git a/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java b/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java index 72c9804f2..85582239b 100644 --- a/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java +++ b/src/main/java/com/profiler/interceptor/bci/JavaAssistClass.java @@ -30,6 +30,10 @@ public class JavaAssistClass implements InstrumentClass { this.ctClass = ctClass; } + public CtClass getCtClass() { + return ctClass; + } + @Override public boolean addInterceptor(String methodName, String[] args, Interceptor interceptor) { return addInterceptor(methodName, args, interceptor, Type.auto); @@ -89,7 +93,8 @@ public class JavaAssistClass implements InstrumentClass { after.append("{"); addGetStaticAfterInterceptor(after, id); String target = getTarget(behavior); - after.append(" interceptor.after(" + target + ", \"" + ctClass.getName() + "\", \"" + methodName + "\", $args, ($w)$_);"); + String returnType = getReturnType(behavior); + after.append(" interceptor.after(" + target + ", \"" + ctClass.getName() + "\", \"" + methodName + "\", $args, " + returnType + ");"); after.append("}"); String buildAfter = after.toString(); if (logger.isLoggable(Level.INFO)) { @@ -121,6 +126,16 @@ public class JavaAssistClass implements InstrumentClass { } } + public String getReturnType(CtBehavior behavior) throws NotFoundException { + if(behavior instanceof CtMethod) { + CtClass returnType = ((CtMethod) behavior).getReturnType(); + if(CtClass.voidType == returnType) { + return "null"; + } + } + return "($w)$_"; + } + private boolean isStatic(CtBehavior behavior) { int modifiers = behavior.getModifiers(); return java.lang.reflect.Modifier.isStatic(modifiers); @@ -287,4 +302,6 @@ public class JavaAssistClass implements InstrumentClass { } return null; } + + } diff --git a/src/main/java/com/profiler/modifier/db/ConnectionTrace.java b/src/main/java/com/profiler/modifier/db/ConnectionTrace.java index 644d59751..b321cb418 100644 --- a/src/main/java/com/profiler/modifier/db/ConnectionTrace.java +++ b/src/main/java/com/profiler/modifier/db/ConnectionTrace.java @@ -20,6 +20,10 @@ public class ConnectionTrace { this.connectionMap.put(connection, url); } + public String getConnectionUrl(Connection connection) { + return this.connectionMap.get(connection); + } + public void closeConnection(Connection connection) { this.connectionMap.remove(connection); 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 d9306afa5..f6d8abaa3 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java +++ b/src/main/java/com/profiler/modifier/db/mysql/MySQLStatementModifier.java @@ -4,44 +4,73 @@ import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; -import javassist.ByteArrayClassPath; +import com.profiler.interceptor.Interceptor; +import com.profiler.interceptor.bci.JavaAssistClass; +import javassist.*; import com.profiler.interceptor.bci.ByteCodeInstrumentor; import com.profiler.interceptor.bci.InstrumentClass; import com.profiler.modifier.AbstractModifier; +import javassist.bytecode.AccessFlag; public class MySQLStatementModifier extends AbstractModifier { - private final Logger logger = Logger.getLogger(MySQLStatementModifier.class.getName()); + private final Logger logger = Logger.getLogger(MySQLStatementModifier.class.getName()); - public MySQLStatementModifier(ByteCodeInstrumentor byteCodeInstrumentor) { - super(byteCodeInstrumentor); - } + public MySQLStatementModifier(ByteCodeInstrumentor byteCodeInstrumentor) { + super(byteCodeInstrumentor); + } - public String getTargetClass() { - return "com/mysql/jdbc/StatementImpl"; - } + public String getTargetClass() { + return "com/mysql/jdbc/StatementImpl"; + } - public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isLoggable(Level.INFO)) { - logger.info("Modifing. " + javassistClassName); - } + public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { + if (logger.isLoggable(Level.INFO)) { + logger.info("Modifing. " + javassistClassName); + } - byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); - classPool.insertClassPath(new ByteArrayClassPath(javassistClassName, classFileBuffer)); + byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); +// classPool.insertClassPath(new ByteArrayClassPath(javassistClassName, classFileBuffer)); - InstrumentClass aClass = byteCodeInstrumentor.getClass(javassistClassName); + InstrumentClass aClass = byteCodeInstrumentor.getClass(javassistClassName); + Interceptor interceptor = newInterceptor(classLoader, protectedDomain, "com.profiler.modifier.db.mysql.interceptors.ExecuteQueryMethodInterceptor"); + boolean executeQuery = aClass.addInterceptor("executeQuery", new String[]{"java.lang.String"}, interceptor); + if (logger.isLoggable(Level.INFO)) { + logger.info("executeQuery =" + executeQuery); + } - boolean instrumented = aClass.addInterceptor("executeQuery", new String[] { "java.lang.String" }, newInterceptor(classLoader, protectedDomain, "com.profiler.modifier.db.mysql.interceptors.ExecuteQueryMethodInterceptor")); + Interceptor interceptor1 = newInterceptor(classLoader, protectedDomain, "com.profiler.modifier.db.mysql.interceptors.ExecuteUpdateMethodInterceptor"); + boolean executeUpdate = aClass.addInterceptor("executeUpdate", new String[]{"java.lang.String", "boolean", "boolean"}, interceptor1); + if (logger.isLoggable(Level.INFO)) { + logger.info("executeUpdate =" + executeUpdate); + } + addTraceData((JavaAssistClass) aClass); - instrumented &= aClass.addInterceptor("executeUpdate", new String[] { "java.lang.String", "boolean", "boolean" }, newInterceptor(classLoader, protectedDomain, "com.profiler.modifier.db.mysql.interceptors.ExecuteUpdateMethodInterceptor")); - System.out.println("instrumented=" + instrumented); - - if (!instrumented) { - return null; - } + if (executeQuery && executeQuery) { + return aClass.toBytecode(); + } + return null; + } - return aClass.toBytecode(); - } + private void addTraceData(JavaAssistClass aClass) { + try { + ClassPool classPool1 = byteCodeInstrumentor.getClassPool(); + JavaAssistClass jc = (JavaAssistClass) aClass; + CtClass ctClass = jc.getCtClass(); + CtClass string = classPool1.get("java.lang.String"); + CtField traceUrl = new CtField(string, "__url", ctClass); + traceUrl.setModifiers(AccessFlag.PUBLIC); + ctClass.addField(traceUrl); + CtMethod setUrl = CtNewMethod.setter("__setUrl", traceUrl); + ctClass.addMethod(setUrl); + CtMethod getUrl = CtNewMethod.getter("__getUrl", traceUrl); + ctClass.addMethod(getUrl); + } catch (NotFoundException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } catch (CannotCompileException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } + } } \ No newline at end of file diff --git a/src/main/java/com/profiler/modifier/db/mysql/interceptors/CloseConnectionInterceptor.java b/src/main/java/com/profiler/modifier/db/mysql/interceptors/CloseConnectionInterceptor.java index 344ec47fc..591cc49ba 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/interceptors/CloseConnectionInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/mysql/interceptors/CloseConnectionInterceptor.java @@ -7,18 +7,23 @@ import com.profiler.modifier.db.ConnectionTrace; import com.profiler.util.InterceptorUtils; import java.sql.Connection; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; public class CloseConnectionInterceptor implements StaticBeforeInterceptor { + private final Logger logger = Logger.getLogger(CloseConnectionInterceptor.class.getName()); + public void before(Object target, String className, String methodName, Object[] args) { - if(!(target instanceof Connection)) { - return; + if (logger.isLoggable(Level.INFO)) { + logger.info("before className:" + className + " methodName:" + methodName + " args:" + Arrays.toString(args)); + } + if (target instanceof Connection) { + ConnectionTrace connectionTrace = ConnectionTrace.getConnectionTrace(); + connectionTrace.closeConnection((Connection) target); } - - ConnectionTrace connectionTrace = ConnectionTrace.getConnectionTrace(); - connectionTrace.closeConnection((Connection) target); - } diff --git a/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateConnectionInterceptor.java b/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateConnectionInterceptor.java index c03abd7c4..abccde59a 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateConnectionInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateConnectionInterceptor.java @@ -5,22 +5,30 @@ import com.profiler.modifier.db.ConnectionTrace; import com.profiler.util.InterceptorUtils; import java.sql.Connection; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; public class CreateConnectionInterceptor implements StaticAfterInterceptor { + private final Logger logger = Logger.getLogger(CreateConnectionInterceptor.class.getName()); + @Override public void after(Object target, String className, String methodName, Object[] args, Object result) { + if (logger.isLoggable(Level.INFO)) { + logger.info("after className:" + className + " methodName:" + methodName + " args:" + Arrays.toString(args) + " result:" + result); + } if (InterceptorUtils.isThrowable(result)) { return; } - if (!(result instanceof Connection)) { - return; - } - String url = (String) args[4]; - if (url instanceof String) { - ConnectionTrace connectionTrace = ConnectionTrace.getConnectionTrace(); - connectionTrace.createConnection((Connection)result, url); + if (result instanceof Connection) { + Object url = args[4]; + if (url instanceof String) { + ConnectionTrace connectionTrace = ConnectionTrace.getConnectionTrace(); + connectionTrace.createConnection((Connection)result, (String) url); + } } + } } diff --git a/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateStatementInterceptor.java b/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateStatementInterceptor.java index f5b1ac336..cef5e5e1b 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateStatementInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/mysql/interceptors/CreateStatementInterceptor.java @@ -3,15 +3,76 @@ package com.profiler.modifier.db.mysql.interceptors; import com.profiler.context.Trace; import com.profiler.interceptor.StaticAfterInterceptor; import com.profiler.interceptor.StaticBeforeInterceptor; +import com.profiler.modifier.db.ConnectionTrace; +import com.profiler.util.ReflectionUtils; +import java.beans.Statement; +import java.io.FileDescriptor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.sql.Connection; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; public class CreateStatementInterceptor implements StaticAfterInterceptor { + private final Logger logger = Logger.getLogger(CreateStatementInterceptor.class.getName()); + + private Field urlField; + @Override public void after(Object target, String className, String methodName, Object[] args, Object result) { + if (logger.isLoggable(Level.INFO)) { + logger.info("after className:" + className + " methodName:" + methodName + " args:" + Arrays.toString(args) + " result:" + result); + } if (Trace.getCurrentTraceId() == null) { return; } + if (target instanceof Connection) { + ConnectionTrace connectionTrace = ConnectionTrace.getConnectionTrace(); + String connectionUrl = connectionTrace.getConnectionUrl((Connection) target); + + try { + Method setUrl = result.getClass().getMethod("__setUrl", String.class); + setUrl.invoke(result, connectionUrl); + } catch (NoSuchMethodException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } catch (InvocationTargetException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } catch (IllegalAccessException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } +// Method[] declaredMethods = result.getClass().getDeclaredMethods(); +// for(Method m : declaredMethods) { +// System.out.println(m); +// } +// Field urlField = getURLField(result); +// urlField.setAccessible(true); +// urlField.set(result, connectionUrl); + } + + + } + + private Field getURLField(Object result) { + Field urlField = this.urlField; + if(urlField == null) { + urlField = ReflectionUtils.findField(result.getClass(), "__url"); + this.urlField = urlField; + } + return urlField; + } + + private Field findField(Object result, String fieldName) { + Field[] declaredFields = result.getClass().getDeclaredFields(); + for(Field f: declaredFields) { + if(f.getName().equals(fieldName)) { + return f; + } + } + return null; } } diff --git a/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteQueryMethodInterceptor.java b/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteQueryMethodInterceptor.java index 62bc7db13..a2edc8e32 100644 --- a/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteQueryMethodInterceptor.java +++ b/src/main/java/com/profiler/modifier/db/mysql/interceptors/ExecuteQueryMethodInterceptor.java @@ -4,8 +4,14 @@ import com.profiler.StopWatch; import com.profiler.context.Annotation; import com.profiler.context.Trace; import com.profiler.interceptor.StaticAroundInterceptor; +import com.profiler.util.ReflectionUtils; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.net.URL; +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @@ -14,17 +20,26 @@ import java.net.URL; */ public class ExecuteQueryMethodInterceptor implements StaticAroundInterceptor { + private final Logger logger = Logger.getLogger(ExecuteQueryMethodInterceptor.class.getName()); + @Override public void before(Object target, String className, String methodName, Object[] args) { + if (logger.isLoggable(Level.INFO)) { + logger.info("before className:" + className + " methodName:" + methodName + " args:" + Arrays.toString(args)); + } + if (Trace.getCurrentTraceId() == null) { + return; + } + try { /** * If method was not called by request handler, we skip tagging. */ - if (Trace.getCurrentTraceId() == null) { - return; - } + Method getUrl = target.getClass().getMethod("__getUrl"); + String url = (String) getUrl.invoke(target); + System.out.println("url:" + url); - Trace.recordRpcName("mysql", "url*****"); + Trace.recordRpcName("mysql", url); // // TODO: add destination address @@ -44,10 +59,15 @@ public class ExecuteQueryMethodInterceptor implements StaticAroundInterceptor { @Override public void after(Object target, String className, String methodName, Object[] args, Object result) { - if (Trace.getCurrentTraceId() == null) { + if (logger.isLoggable(Level.INFO)) { + logger.info("after className:" + className + " methodName:" + methodName + " args:" + Arrays.toString(args) + " result:" + result); + } + + if (Trace.getCurrentTraceId() == null) { return; } + Trace.record(Annotation.ClientRecv, StopWatch.stopAndGetElapsed("ExecuteQueryMethodInterceptor")); } } diff --git a/src/main/java/com/profiler/util/ReflectionUtils.java b/src/main/java/com/profiler/util/ReflectionUtils.java new file mode 100644 index 000000000..f36e6dda6 --- /dev/null +++ b/src/main/java/com/profiler/util/ReflectionUtils.java @@ -0,0 +1,15 @@ +package com.profiler.util; + +import java.lang.reflect.Field; + +public class ReflectionUtils { + public static Field findField(Class targetClass, String fieldName) { + Field[] declaredFields = targetClass.getDeclaredFields(); + for (Field f : declaredFields) { + if (f.getName().equals(fieldName)) { + return f; + } + } + return null; + } +} diff --git a/src/test/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifierTest.java b/src/test/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifierTest.java index 4642cda36..c3dc162e1 100644 --- a/src/test/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifierTest.java +++ b/src/test/java/com/profiler/modifier/db/mysql/MySQLConnectionImplModifierTest.java @@ -1,5 +1,6 @@ package com.profiler.modifier.db.mysql; +import com.profiler.context.Trace; import com.profiler.modifier.db.ConnectionTrace; import com.profiler.util.TestClassLoader; import org.junit.Assert; @@ -8,6 +9,7 @@ import org.junit.Test; import java.sql.Connection; import java.sql.Driver; +import java.sql.Statement; import java.util.Properties; import java.util.Set; import java.util.logging.Logger; @@ -21,8 +23,11 @@ public class MySQLConnectionImplModifierTest { public void setUp() throws Exception { loader = new TestClassLoader(); - MySQLConnectionImplModifier modifier = new MySQLConnectionImplModifier(loader.getInstrumentor()); - loader.addModifier(modifier); + MySQLConnectionImplModifier connectionModifier = new MySQLConnectionImplModifier(loader.getInstrumentor()); + loader.addModifier(connectionModifier); + + MySQLStatementModifier statementModifier = new MySQLStatementModifier(loader.getInstrumentor()); + loader.addModifier(statementModifier); // loader.delegateLoadingOf(ConnectionTrace.class.getName()); @@ -43,6 +48,7 @@ public class MySQLConnectionImplModifierTest { properties.setProperty("password", "testlucy"); Connection connect = driver.connect("jdbc:mysql://10.98.133.22:3306/hippo", properties); + Trace.getTraceId(); logger.info("Connection class name:" + connect.getClass().getName()); logger.info("Connection class cl:" + connect.getClass().getClassLoader()); @@ -50,10 +56,15 @@ public class MySQLConnectionImplModifierTest { Assert.assertEquals(connectionList.size(), 1); logger.info("connection size:" + connectionList.size()); + Statement statement = connect.createStatement(); + statement.executeQuery("select 1"); + statement.close(); + connect.close(); Assert.assertEquals(connectionList.size(), 0); logger.info("connection size:" + connectionList.size()); + Trace.removeTraceId(); } } diff --git a/src/test/java/com/profiler/util/TestClassLoader.java b/src/test/java/com/profiler/util/TestClassLoader.java index 6c25f7c00..c1d8eeb91 100644 --- a/src/test/java/com/profiler/util/TestClassLoader.java +++ b/src/test/java/com/profiler/util/TestClassLoader.java @@ -1,5 +1,8 @@ package com.profiler.util; +import com.profiler.StopWatch; +import com.profiler.context.Annotation; +import com.profiler.context.Trace; import com.profiler.interceptor.*; import com.profiler.interceptor.bci.ByteCodeInstrumentor; import com.profiler.interceptor.bci.JavaAssistByteCodeInstrumentor; @@ -43,6 +46,9 @@ public class TestClassLoader extends Loader { this.delegateLoadingOf(StaticAfterInterceptor.class.getName()); this.delegateLoadingOf(InterceptorRegistry.class.getName()); this.delegateLoadingOf(ConnectionTrace.class.getName()); + this.delegateLoadingOf(Trace.class.getName()); + this.delegateLoadingOf(Annotation.class.getName()); + this.delegateLoadingOf(StopWatch.class.getName()); } @Override