diff --git a/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java b/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java index b355bee53..26f02313e 100644 --- a/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java +++ b/src/main/java/com/profiler/modifier/DefaultModifierRegistry.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Map; import com.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.profiler.modifier.arcus.ArcusClientModifier; import com.profiler.modifier.connector.HTTPClientModifier; import com.profiler.modifier.db.cubrid.CubridPreparedStatementModifier; import com.profiler.modifier.db.cubrid.CubridResultSetModifier; @@ -52,6 +53,9 @@ public class DefaultModifierRegistry implements ModifierRegistry { public void addConnectorModifier() { HTTPClientModifier httpClientModifier = new HTTPClientModifier(byteCodeInstrumentor); addModifier(httpClientModifier); + + ArcusClientModifier arcusClientModifier = new ArcusClientModifier(byteCodeInstrumentor); + addModifier(arcusClientModifier); } public void addTomcatModifier() { diff --git a/src/main/java/com/profiler/modifier/arcus/ArcusClientModifier.java b/src/main/java/com/profiler/modifier/arcus/ArcusClientModifier.java index ac0f75000..0dabf0cef 100644 --- a/src/main/java/com/profiler/modifier/arcus/ArcusClientModifier.java +++ b/src/main/java/com/profiler/modifier/arcus/ArcusClientModifier.java @@ -1,14 +1,15 @@ package com.profiler.modifier.arcus; +import java.nio.ByteBuffer; import java.security.ProtectionDomain; import java.util.logging.Level; import java.util.logging.Logger; -import javassist.ByteArrayClassPath; +import javassist.CtClass; +import javassist.CtMethod; -import com.profiler.interceptor.Interceptor; +import com.profiler.context.Trace; import com.profiler.interceptor.bci.ByteCodeInstrumentor; -import com.profiler.interceptor.bci.InstrumentClass; import com.profiler.modifier.AbstractModifier; /** @@ -25,7 +26,7 @@ public class ArcusClientModifier extends AbstractModifier { } public String getTargetClass() { - return "org/apache/http/impl/client/AbstractHttpClient"; + return "net/spy/memcached/protocol/BaseOperationImpl"; } public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { @@ -33,17 +34,48 @@ public class ArcusClientModifier extends AbstractModifier { logger.info("Modifing. " + javassistClassName); } - Interceptor interceptor = newInterceptor(classLoader, protectedDomain, "com.profiler.modifier.connector.interceptors.ExecuteMethodInterceptor"); - if (interceptor == null) { + try { + classLoader.loadClass("net.spy.memcached.ops.OperationState"); + + CtClass cc = classPool.get(javassistClassName); + CtClass[] params1 = new CtClass[1]; + params1[0] = classPool.getCtClass("net.spy.memcached.ops.OperationState"); + CtMethod transitionStateMethod = cc.getDeclaredMethod("transitionState", params1); + + StringBuilder code = new StringBuilder(); + code.append("{"); + +// code.append("System.out.println($1);"); +// code.append("System.out.println(\"Change state \" + state + \" -> \" + newState);"); +// code.append("System.out.println(handlingNode);"); +// code.append("System.out.println(\"cmd=\" + ((cmd == null) ? null : new String(cmd.array())));"); +// code.append("System.out.println(Thread.currentThread().getId());"); +// code.append("System.out.println(Thread.currentThread().getName());"); +// code.append("System.out.println(\"\");"); +// code.append("System.out.println(\"\");"); +// code.append("System.out.println(\"\");"); + + code.append("if (newState == net.spy.memcached.ops.OperationState.READING) {"); + code.append(" java.net.SocketAddress socketAddress = handlingNode.getSocketAddress();"); + code.append(" if (socketAddress instanceof java.net.InetSocketAddress) {"); + code.append(" java.net.InetSocketAddress addr = (java.net.InetSocketAddress) handlingNode.getSocketAddress();"); + code.append(" com.profiler.context.Trace.recordServerAddr(addr.getHostName(), addr.getPort());"); + code.append(" }"); + code.append(" com.profiler.context.Trace.recordRpcName(\"arcus\", ((cmd == null) ? \"UNKNOWN\" : new String(cmd.array())));"); + code.append(" System.out.println(\"CS\");"); + code.append(" com.profiler.context.Trace.record(new com.profiler.context.Annotation.ClientSend());"); + code.append("} else if (newState == net.spy.memcached.ops.OperationState.COMPLETE) {"); + code.append(" System.out.println(\"CR\");"); + code.append(" com.profiler.context.Trace.record(new com.profiler.context.Annotation.ClientRecv());"); + code.append("}"); + + code.append("}"); + transitionStateMethod.insertBefore(code.toString()); + + return cc.toBytecode(); + } catch (Exception e) { + e.printStackTrace(); return null; } - - byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); - classPool.insertClassPath(new ByteArrayClassPath(javassistClassName, classFileBuffer)); - - InstrumentClass aClass = byteCodeInstrumentor.getClass(javassistClassName); - aClass.addInterceptor("execute", new String[] { "org.apache.http.HttpHost", "org.apache.http.HttpRequest", "org.apache.http.client.ResponseHandler", "org.apache.http.protocol.HttpContext" }, interceptor); - - return aClass.toBytecode(); } } \ No newline at end of file diff --git a/src/main/java/com/profiler/modifier/arcus/interceptors/ExecuteMethodInterceptor.java b/src/main/java/com/profiler/modifier/arcus/interceptors/ExecuteMethodInterceptor.java deleted file mode 100644 index 36af18758..000000000 --- a/src/main/java/com/profiler/modifier/arcus/interceptors/ExecuteMethodInterceptor.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.profiler.modifier.arcus.interceptors; - -import com.profiler.StopWatch; -import com.profiler.context.Annotation; -import com.profiler.context.Trace; -import com.profiler.interceptor.StaticAroundInterceptor; - -public class ExecuteMethodInterceptor implements StaticAroundInterceptor { - - @Override - public void before(Object target, String className, String methodName, Object[] args) { - System.out.println("\n\n\n\nARCUS BEFORE"); - - StopWatch.start("ExecuteMethodInterceptor"); - } - - @Override - public void after(Object target, String className, String methodName, Object[] args, Object result) { - System.out.println("\n\n\n\nARCUS AFTER"); - Trace.record(new Annotation.ClientRecv(), StopWatch.stopAndGetElapsed("ExecuteMethodInterceptor")); - } -} \ No newline at end of file