From 0176dbdd1eb05ffc89d534ae8b31e10d0fb792b2 Mon Sep 17 00:00:00 2001 From: Jaehong Kim Date: Thu, 30 Oct 2014 13:41:23 +0900 Subject: [PATCH 1/4] #65 add chkLibrary --- .../profiler/modifier/arcus/AbstractFutureModifier.java | 1 + .../pinpoint/profiler/modifier/arcus/ArcusClientModifier.java | 1 + .../pinpoint/profiler/modifier/arcus/BaseOperationModifier.java | 1 + .../pinpoint/profiler/modifier/arcus/CacheManagerModifier.java | 1 + .../profiler/modifier/arcus/FrontCacheGetFutureModifier.java | 1 + .../modifier/arcus/FrontCacheMemcachedClientModifier.java | 1 + .../profiler/modifier/arcus/MemcachedClientModifier.java | 1 + .../pinpoint/profiler/modifier/redis/GatewayModifier.java | 1 + .../pinpoint/profiler/modifier/redis/GatewayServerModifier.java | 1 + .../pinpoint/profiler/modifier/redis/JedisClientModifier.java | 1 + .../pinpoint/profiler/modifier/redis/JedisModifier.java | 1 + .../pinpoint/profiler/modifier/redis/JedisPipelineModifier.java | 1 + .../pinpoint/profiler/modifier/redis/RedisClusterModifier.java | 1 + .../profiler/modifier/redis/RedisClusterPipelineModifier.java | 1 + .../profiler/modifier/tomcat/StandardServiceModifier.java | 2 ++ .../profiler/modifier/tomcat/TomcatConnectorModifier.java | 2 ++ .../pinpoint/profiler/modifier/tomcat/WebappLoaderModifier.java | 2 ++ 17 files changed, 20 insertions(+) diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/AbstractFutureModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/AbstractFutureModifier.java index e436ba3b7..31cee2397 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/AbstractFutureModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/AbstractFutureModifier.java @@ -28,6 +28,7 @@ public abstract class AbstractFutureModifier extends AbstractModifier { logger.info("Modifying. {}", javassistClassName); } + byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); try { InstrumentClass aClass = byteCodeInstrumentor.getClass(javassistClassName); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ArcusClientModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ArcusClientModifier.java index dfe0aee9b..5f0081c1c 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ArcusClientModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ArcusClientModifier.java @@ -37,6 +37,7 @@ public class ArcusClientModifier extends AbstractModifier { logger.info("Modifing. {}", javassistClassName); } + byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); try { InstrumentClass arcusClient = byteCodeInstrumentor.getClass(javassistClassName); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/BaseOperationModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/BaseOperationModifier.java index 769113618..5d6c3e6de 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/BaseOperationModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/BaseOperationModifier.java @@ -30,6 +30,7 @@ public class BaseOperationModifier extends AbstractModifier { logger.info("Modifing. {}", javassistClassName); } + byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); try { InstrumentClass aClass = byteCodeInstrumentor.getClass(javassistClassName); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/CacheManagerModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/CacheManagerModifier.java index 6c114c3bb..b1577a5bf 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/CacheManagerModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/CacheManagerModifier.java @@ -30,6 +30,7 @@ public class CacheManagerModifier extends AbstractModifier { logger.info("Modifing. {}", javassistClassName); } + byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); try { InstrumentClass aClass = byteCodeInstrumentor.getClass(javassistClassName); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheGetFutureModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheGetFutureModifier.java index 9ded0e257..157165181 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheGetFutureModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheGetFutureModifier.java @@ -30,6 +30,7 @@ public class FrontCacheGetFutureModifier extends AbstractModifier { logger.info("Modifying. {}", javassistClassName); } + byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); try { InstrumentClass aClass = byteCodeInstrumentor.getClass(javassistClassName); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedClientModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedClientModifier.java index e242e69f4..25bd82b7d 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedClientModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedClientModifier.java @@ -32,6 +32,7 @@ public class FrontCacheMemcachedClientModifier extends AbstractModifier { logger.info("Modifing. {}", javassistClassName); } + byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); try { InstrumentClass aClass = byteCodeInstrumentor.getClass(javassistClassName); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedClientModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedClientModifier.java index dbf940ace..ec193a883 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedClientModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedClientModifier.java @@ -36,6 +36,7 @@ public class MemcachedClientModifier extends AbstractModifier { logger.info("Modifing. {}", javassistClassName); } + byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); try { InstrumentClass aClass = byteCodeInstrumentor.getClass(javassistClassName); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java index 0465fbbbc..703f9a65d 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java @@ -40,6 +40,7 @@ public class GatewayModifier extends AbstractModifier { logger.info("Modifing. {}", className); } + byteCodeInstrumentor.checkLibrary(classLoader, className); try { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java index 00135cdef..0865590a4 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java @@ -40,6 +40,7 @@ public class GatewayServerModifier extends AbstractModifier { logger.info("Modifing. {}", className); } + byteCodeInstrumentor.checkLibrary(classLoader, className); try { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java index 715c6ef9f..e8362bf4b 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java @@ -38,6 +38,7 @@ public class JedisClientModifier extends AbstractModifier { logger.info("Modifing. {}", className); } + byteCodeInstrumentor.checkLibrary(classLoader, className); try { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java index 2490ca0fe..71ec538fd 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java @@ -41,6 +41,7 @@ public class JedisModifier extends AbstractModifier { logger.info("Modifing. {}", className); } + byteCodeInstrumentor.checkLibrary(classLoader, className); try { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java index 44891b827..cc750350b 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java @@ -41,6 +41,7 @@ public class JedisPipelineModifier extends AbstractModifier { logger.info("Modifing. {}", className); } + byteCodeInstrumentor.checkLibrary(classLoader, className); try { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java index 36b61d927..5792553b1 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java @@ -41,6 +41,7 @@ public class RedisClusterModifier extends AbstractModifier { logger.info("Modifing. {}", className); } + byteCodeInstrumentor.checkLibrary(classLoader, className); try { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java index 00450cf5a..65ebaa65e 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java @@ -41,6 +41,7 @@ public class RedisClusterPipelineModifier extends AbstractModifier { logger.info("Modifing. {}", className); } + byteCodeInstrumentor.checkLibrary(classLoader, className); try { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/StandardServiceModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/StandardServiceModifier.java index 1e5eb16da..169309d88 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/StandardServiceModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/StandardServiceModifier.java @@ -31,6 +31,8 @@ public class StandardServiceModifier extends AbstractModifier { @Override public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { logger.info("Modifying. {}", javassistClassName); + + byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); try { InstrumentClass standardService = byteCodeInstrumentor.getClass(javassistClassName); LifeCycleEventListener lifeCycleEventListener = new LifeCycleEventListener(agent); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/TomcatConnectorModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/TomcatConnectorModifier.java index 08a61a7ec..c62bfa4a5 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/TomcatConnectorModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/TomcatConnectorModifier.java @@ -31,6 +31,8 @@ public class TomcatConnectorModifier extends AbstractModifier { if (logger.isInfoEnabled()) { logger.info("Modifing. {}", javassistClassName); } + + byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); try { // initialize()할 때 protocol과 port번호를 저장해둔다. Interceptor interceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/WebappLoaderModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/WebappLoaderModifier.java index 9cc551795..f1ea24164 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/WebappLoaderModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/tomcat/WebappLoaderModifier.java @@ -30,6 +30,8 @@ public class WebappLoaderModifier extends AbstractModifier { @Override public byte[] modify(ClassLoader classLoader, String javassistClassName, ProtectionDomain protectedDomain, byte[] classFileBuffer) { logger.info("Modifying. {}", javassistClassName); + + byteCodeInstrumentor.checkLibrary(classLoader, javassistClassName); try { InstrumentClass webappLoader = byteCodeInstrumentor.getClass(javassistClassName); From cc04864ebd6c156ff3644cabd0a606093d932f7d Mon Sep 17 00:00:00 2001 From: Minwoo Jung Date: Fri, 31 Oct 2014 16:01:49 +0900 Subject: [PATCH 2/4] [#58] change collector server domain address (nhncorp.com -> navercorp.com) --- .../src/main/resources-release/pinpoint.config | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/profiler/src/main/resources-release/pinpoint.config b/profiler/src/main/resources-release/pinpoint.config index 78300da5e..bb41f8517 100644 --- a/profiler/src/main/resources-release/pinpoint.config +++ b/profiler/src/main/resources-release/pinpoint.config @@ -6,7 +6,7 @@ ########################################################### # Collector server # ########################################################### -profiler.collector.ip=collector.pinpoint.nhncorp.com +profiler.collector.ip=collector.pinpoint.navercorp.com profiler.collector.udpspan.port=9996 profiler.collector.udp.port=9995 profiler.collector.tcp.port=9994 @@ -194,11 +194,11 @@ profiler.redis.pipeline=true ########################################################### profiler.nbase_arc=true profiler.nbase_arc.pipeline=true - -########################################################### -# spring-beans -########################################################### -profiler.spring.beans=false -profiler.spring.beans.name.pattern= -profiler.spring.beans.class.pattern= + +########################################################### +# spring-beans +########################################################### +profiler.spring.beans=false +profiler.spring.beans.name.pattern= +profiler.spring.beans.class.pattern= profiler.spring.beans.annotation=org.springframework.stereotype.Controller,org.springframework.stereotype.Service,org.springframework.stereotype.Repository From dfa756ecc9059fead0fa480c528bac89525cffd1 Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Fri, 31 Oct 2014 16:49:10 +0900 Subject: [PATCH 3/4] [#67] add api getDeclaredMethodsForce --- .../interceptor/bci/DeclaredMethodsForce.java | 41 ++++++ .../interceptor/bci/InstrumentClass.java | 8 +- .../interceptor/bci/JavaAssistClass.java | 62 +++++++-- .../profiler/util/JavaAssistUtils.java | 131 +++++++++++++++++- .../profiler/util/JavaAssistUtilsTest.java | 31 +++++ 5 files changed, 255 insertions(+), 18 deletions(-) create mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/interceptor/bci/DeclaredMethodsForce.java diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/interceptor/bci/DeclaredMethodsForce.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/interceptor/bci/DeclaredMethodsForce.java new file mode 100644 index 000000000..57ecafa02 --- /dev/null +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/interceptor/bci/DeclaredMethodsForce.java @@ -0,0 +1,41 @@ +package com.nhn.pinpoint.profiler.interceptor.bci; + +import java.util.List; + +/** + * @author emeroad + */ +public class DeclaredMethodsForce { + + private final List declaredMethods; + + private final List failDeclaredMethods; + + public DeclaredMethodsForce(List successMethod, List failDeclaredMethods) { + this.declaredMethods = successMethod; + this.failDeclaredMethods = failDeclaredMethods; + } + + public List getDeclaredMethods() { + return declaredMethods; + } + + public List getFailDeclaredMethods() { + return failDeclaredMethods; + } + + public static class FailMethod extends Method { + + private final Throwable caused; + + public FailMethod(String methodName, String[] methodParams, Throwable caused) { + super(methodName, methodParams); + this.caused = caused; + } + + public Throwable getCaused() { + return caused; + } + + } +} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/interceptor/bci/InstrumentClass.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/interceptor/bci/InstrumentClass.java index f12ba16e6..667cebcca 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/interceptor/bci/InstrumentClass.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/interceptor/bci/InstrumentClass.java @@ -89,9 +89,13 @@ public interface InstrumentClass { boolean insertCodeBeforeConstructor(String[] args, String code); List getDeclaredMethods() throws NotFoundInstrumentException; - + List getDeclaredMethods(MethodFilter methodFilter) throws NotFoundInstrumentException; - + + DeclaredMethodsForce getDeclaredMethodsForce(); + + DeclaredMethodsForce getDeclaredMethodsForce(MethodFilter methodFilter); + public boolean isInterceptable(); boolean hasDeclaredMethod(String methodName, String[] args); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/interceptor/bci/JavaAssistClass.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/interceptor/bci/JavaAssistClass.java index ee71b08d4..261c529a1 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/interceptor/bci/JavaAssistClass.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/interceptor/bci/JavaAssistClass.java @@ -899,7 +899,7 @@ public class JavaAssistClass implements InstrumentClass { } try { final CtMethod[] declaredMethod = ctClass.getDeclaredMethods(); - final List candidateList = new ArrayList(declaredMethod.length); + final List candidateList = new ArrayList(declaredMethod.length); for (CtMethod ctMethod : declaredMethod) { if (methodFilter.filter(ctMethod)) { continue; @@ -915,21 +915,53 @@ public class JavaAssistClass implements InstrumentClass { throw new NotFoundInstrumentException("getDeclaredMethods(), Caused:" + e.getMessage(), e); } } - - public boolean isInterceptable() { - return !ctClass.isInterface() && !ctClass.isAnnotation() && !ctClass.isModified(); - } - @Override - public boolean hasDeclaredMethod(String methodName, String[] args) { - try { - CtClass[] params = JavaAssistUtils.getCtParameter(args, instrumentor.getClassPool()); - CtMethod m = ctClass.getDeclaredMethod(methodName, params); - return m != null; - } catch (NotFoundException e) { - return false; - } - } + + public DeclaredMethodsForce getDeclaredMethodsForce() { + return getDeclaredMethodsForce(SkipMethodFilter.FILTER); + } + + public DeclaredMethodsForce getDeclaredMethodsForce(MethodFilter methodFilter) { + if (methodFilter == null) { + throw new NullPointerException("methodFilter must not be null"); + } + final CtMethod[] declaredMethod = ctClass.getDeclaredMethods(); + final List candidateList = new ArrayList(declaredMethod.length); + final List failList = new ArrayList(); + for (CtMethod ctMethod : declaredMethod) { + if (methodFilter.filter(ctMethod)) { + continue; + } + String methodName = ctMethod.getName(); + try { + CtClass[] paramTypes = ctMethod.getParameterTypes(); + String[] parameterType = JavaAssistUtils.getParameterType(paramTypes); + Method method = new Method(methodName, parameterType); + candidateList.add(method); + } catch (NotFoundException ex) { + String[] parameterTypes = JavaAssistUtils.parseParameterDescriptor(ctMethod.getSignature()); + DeclaredMethodsForce.FailMethod fail = new DeclaredMethodsForce.FailMethod(methodName, parameterTypes, ex); + failList.add(fail); + } + } + return new DeclaredMethodsForce(candidateList, failList); + + } + + public boolean isInterceptable() { + return !ctClass.isInterface() && !ctClass.isAnnotation() && !ctClass.isModified(); + } + + @Override + public boolean hasDeclaredMethod(String methodName, String[] args) { + try { + CtClass[] params = JavaAssistUtils.getCtParameter(args, instrumentor.getClassPool()); + CtMethod m = ctClass.getDeclaredMethod(methodName, params); + return m != null; + } catch (NotFoundException e) { + return false; + } + } /** * 가능한 String methodName, String desc을 사용하자. 편한대신에 속도가 상대적으로 좀 느리다. diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/util/JavaAssistUtils.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/util/JavaAssistUtils.java index dc8bb4312..c2ef05ae2 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/util/JavaAssistUtils.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/util/JavaAssistUtils.java @@ -41,8 +41,137 @@ public final class JavaAssistUtils { return sb.toString(); } + public static String[] parseParameterDescriptor(String descriptor) { + if (descriptor == null) { + throw new NullPointerException("descriptor must not be null"); + } + final String[] parameterDesc = splitParameterDesc(descriptor); + final String[] objectType = new String[parameterDesc.length]; + for (int i = 0; i < parameterDesc.length; i++) { + String description = parameterDesc[i]; + objectType[i] = byteCodeDescToObjectType(description); + } + return objectType; + } - public static String[] getParameterType(Class[] paramsClass) { + private static String byteCodeDescToObjectType(String description) { + final char scheme = description.charAt(0); + switch (scheme) { + case 'B': + return "byte"; + case 'C': + return "char"; + case 'D': + return "double"; + case 'F': + return "float"; + case 'I': + return "int"; + case 'J': + return "long"; + case 'S': + return "short"; + case 'V': + return "void"; + case 'Z': + return "boolean"; + case 'L': + return toObjectType(description, 1); + case '[': { + return toArrayType(description); + } + } + throw new IllegalArgumentException("invalid description :" + description); + } + + private static String toArrayType(String description) { + final int arraySize = getArraySize(description); + + final char scheme = description.charAt(arraySize); + switch (scheme) { + case 'B': + return arrayType("byte", arraySize); + case 'C': + return arrayType("char", arraySize); + case 'D': + return arrayType("double", arraySize); + case 'F': + return arrayType("float", arraySize); + case 'I': + return arrayType("int", arraySize); + case 'J': + return arrayType("long", arraySize); + case 'S': + return arrayType("short", arraySize); + case 'V': + return arrayType("void", arraySize); + case 'Z': + return arrayType("boolean", arraySize); + case 'L': + final String objectType = toObjectType(description, arraySize + 1); + return arrayType(objectType, arraySize); + case '[': { + throw new IllegalArgumentException("invalid description" + description); + } + } + throw new IllegalArgumentException("invalid description :" + description); + } + + private static String arrayType(String objectType, int arraySize) { + final String array = "[]"; + final int arrayStringLength = array.length() * arraySize; + StringBuilder sb = new StringBuilder(objectType.length() + arrayStringLength); + sb.append(objectType); + for (int i = 0; i < arraySize; i++) { + sb.append(array); + } + return sb.toString(); + } + + private static int getArraySize(String description) { + int arraySize = 0; + for (int i = 0; i < description.length(); i++) { + final char c = description.charAt(i); + if (c == '[') { + arraySize++; + } else { + break; + } + } + return arraySize; + } + + private static String toObjectType(String description, int startIndex) { + final String assistClass = description.substring(startIndex, description.length()); + final String objectName = assistClass.replace('/', '.'); + if (objectName.isEmpty()) { + throw new IllegalArgumentException("invalid description. objectName not found :" + description); + } + return objectName; + } + + private static String[] splitParameterDesc(String descriptor) { + final String parameterDesc = getParameterDesc(descriptor); + if (parameterDesc.isEmpty()) { + return EMPTY_STRING_ARRAY; + } + return parameterDesc.split(";"); + } + + + private static String getParameterDesc(String descriptor) { + final int start = descriptor.indexOf('('); + if (start == -1) { + throw new IllegalArgumentException("'(' not found. descriptor:" + descriptor); + } + final int end = descriptor.indexOf(')', start + 1); + if (end == -1) { + throw new IllegalArgumentException("')' not found. descriptor:" + descriptor); + } + return descriptor.substring(start + 1, end); + } + + public static String[] getParameterType(Class[] paramsClass) { if (paramsClass == null) { return null; } diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/util/JavaAssistUtilsTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/util/JavaAssistUtilsTest.java index b7b39109b..d04d32b3e 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/util/JavaAssistUtilsTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/util/JavaAssistUtilsTest.java @@ -33,8 +33,39 @@ public class JavaAssistUtilsTest { String clsDescription = JavaAssistUtils.getParameterDescription(new Class[]{int.class}); logger.info(clsDescription); Assert.assertEquals(ctDescription, clsDescription); + } + @Test + public void testParseParameterDescriptor() throws Exception { + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("()V"), new String[]{}); + + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("(I)I"), new String[]{"int"}); + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("(I;D)I"), new String[]{"int", "double"}); + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("(B;F;S)I"), new String[]{"byte", "float", "short"}); + + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("(Ljava/lang/String)I"), new String[]{"java.lang.String"}); + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("(Ljava/lang/String;J)I"), new String[]{"java.lang.String", "long"}); + + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("(J;Ljava/lang/Object;Z)I"), new String[]{"long", "java.lang.Object", "boolean"}); + + } + + @Test + public void testParseParameterDescriptor_array() throws Exception { + + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("([I)I"), new String[]{"int[]"}); + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("([I;J)I"), new String[]{"int[]", "long"}); + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("([J;[I)I"), new String[]{"long[]", "int[]"}); + + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("([Ljava/lang/String)"), new String[]{"java.lang.String[]"}); + + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("(Ljava/lang/String;[[J)"), new String[]{"java.lang.String", "long[][]"}); + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("(Ljava/lang/Object;[[Ljava/lang/String)"), new String[]{"java.lang.Object", "java.lang.String[][]"}); + + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("([[[Ljava/lang/String)"), new String[]{"java.lang.String[][][]"}); + + Assert.assertArrayEquals(JavaAssistUtils.parseParameterDescriptor("([[[I)"), new String[]{"int[][][]"}); } @Test From 9f8c518ccd3ae754939527e28dce8524ec71ef05 Mon Sep 17 00:00:00 2001 From: Jaehong Kim Date: Mon, 3 Nov 2014 10:32:07 +0900 Subject: [PATCH 4/4] #70 redis&nBase-ARC interceptor --- .../modifier/DefaultModifierRegistry.java | 12 +++ .../modifier/redis/GatewayModifier.java | 2 +- .../modifier/redis/GatewayServerModifier.java | 2 +- .../modifier/redis/JedisClientModifier.java | 2 +- .../modifier/redis/JedisModifier.java | 64 ++++++++------ .../modifier/redis/JedisPipelineModifier.java | 85 +++++++------------ .../modifier/redis/RedisClusterModifier.java | 57 +++++++++---- .../redis/RedisClusterPipelineModifier.java | 54 +++++++++--- .../redis/filter/NameBasedMethodFilter.java | 14 ++- .../GatewayConstructorInterceptor.java | 8 +- .../JedisConstructorInterceptor.java | 5 +- ...ClusterPipelineConstructorInterceptor.java | 8 +- .../modifier/redis/JedisModifierTest.java | 18 +++- .../redis/JedisPipelineModifierTest.java | 23 ++++- .../redis/RedisClusterModifierTest.java | 15 +++- .../RedisClusterPipelineModifierTest.java | 19 +++++ 16 files changed, 262 insertions(+), 126 deletions(-) diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java index 3af47f38a..67134f8d6 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/DefaultModifierRegistry.java @@ -60,13 +60,19 @@ import com.nhn.pinpoint.profiler.modifier.orm.ibatis.SqlMapClientImplModifier; import com.nhn.pinpoint.profiler.modifier.orm.ibatis.SqlMapSessionImplModifier; import com.nhn.pinpoint.profiler.modifier.orm.mybatis.DefaultSqlSessionModifier; import com.nhn.pinpoint.profiler.modifier.orm.mybatis.SqlSessionTemplateModifier; +import com.nhn.pinpoint.profiler.modifier.redis.BinaryJedisModifier; +import com.nhn.pinpoint.profiler.modifier.redis.BinaryRedisClusterModifier; +import com.nhn.pinpoint.profiler.modifier.redis.BinaryTriplesRedisClusterModifier; import com.nhn.pinpoint.profiler.modifier.redis.GatewayModifier; import com.nhn.pinpoint.profiler.modifier.redis.GatewayServerModifier; import com.nhn.pinpoint.profiler.modifier.redis.JedisClientModifier; import com.nhn.pinpoint.profiler.modifier.redis.JedisModifier; +import com.nhn.pinpoint.profiler.modifier.redis.JedisMultiKeyPipelineBaseModifier; +import com.nhn.pinpoint.profiler.modifier.redis.JedisPipelineBaseModifier; import com.nhn.pinpoint.profiler.modifier.redis.JedisPipelineModifier; import com.nhn.pinpoint.profiler.modifier.redis.RedisClusterModifier; import com.nhn.pinpoint.profiler.modifier.redis.RedisClusterPipelineModifier; +import com.nhn.pinpoint.profiler.modifier.redis.TriplesRedisClusterModifier; import com.nhn.pinpoint.profiler.modifier.servlet.HttpServletModifier; import com.nhn.pinpoint.profiler.modifier.servlet.SpringFrameworkServletModifier; import com.nhn.pinpoint.profiler.modifier.spring.beans.AbstractAutowireCapableBeanFactoryModifier; @@ -384,11 +390,14 @@ public class DefaultModifierRegistry implements ModifierRegistry { public void addRedisSupport() { if(profilerConfig.isRedisEnabled()) { + addModifier(new BinaryJedisModifier(byteCodeInstrumentor, agent)); addModifier(new JedisModifier(byteCodeInstrumentor, agent)); } if(profilerConfig.isRedisPipelineEnabled()) { addModifier(new JedisClientModifier(byteCodeInstrumentor, agent)); + addModifier(new JedisPipelineBaseModifier(byteCodeInstrumentor, agent)); + addModifier(new JedisMultiKeyPipelineBaseModifier(byteCodeInstrumentor, agent)); addModifier(new JedisPipelineModifier(byteCodeInstrumentor, agent)); } } @@ -400,6 +409,9 @@ public class DefaultModifierRegistry implements ModifierRegistry { if(profilerConfig.isNbaseArcEnabled()) { addModifier(new RedisClusterModifier(byteCodeInstrumentor, agent)); + addModifier(new BinaryRedisClusterModifier(byteCodeInstrumentor, agent)); + addModifier(new TriplesRedisClusterModifier(byteCodeInstrumentor, agent)); + addModifier(new BinaryTriplesRedisClusterModifier(byteCodeInstrumentor, agent)); } if(profilerConfig.isNbaseArcPipelineEnabled()) { diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java index 703f9a65d..9f8485582 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayModifier.java @@ -61,7 +61,7 @@ public class GatewayModifier extends AbstractModifier { return instrumentClass.toBytecode(); } catch (Exception e) { if (logger.isWarnEnabled()) { - logger.warn("redis.GatewayModifier(nBase-ARC) fail. Target class is " + getTargetClass() + ", Caused " + e.getMessage(), e); + logger.warn("Failed to modifier. caused={}", e.getMessage(), e); } } diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java index 0865590a4..90894830c 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/GatewayServerModifier.java @@ -59,7 +59,7 @@ public class GatewayServerModifier extends AbstractModifier { return instrumentClass.toBytecode(); } catch (Exception e) { if (logger.isWarnEnabled()) { - logger.warn("redis.GatewayServerModifier(nBase-ARC) fail. Target class is " + getTargetClass() + ", Caused " + e.getMessage(), e); + logger.warn("Failed to modifier. caused={}", e.getMessage(), e); } } diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java index e8362bf4b..40e89ef85 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisClientModifier.java @@ -52,7 +52,7 @@ public class JedisClientModifier extends AbstractModifier { return instrumentClass.toBytecode(); } catch (Exception e) { if (logger.isWarnEnabled()) { - logger.warn("redis.JedisClientModifier(Jedis) fail. Target class is " + getTargetClass() + ". Caused " + e.getMessage(), e); + logger.warn("Failed to modifier. caused={}", e.getMessage(), e); } } diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java index 71ec538fd..7bcd9b739 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifier.java @@ -8,13 +8,14 @@ import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; +import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentException; import com.nhn.pinpoint.profiler.interceptor.bci.Method; +import com.nhn.pinpoint.profiler.interceptor.bci.NotFoundInstrumentException; import com.nhn.pinpoint.profiler.modifier.AbstractModifier; -import com.nhn.pinpoint.profiler.modifier.redis.filter.NameBasedMethodFilter; import com.nhn.pinpoint.profiler.modifier.redis.filter.JedisMethodNames; +import com.nhn.pinpoint.profiler.modifier.redis.filter.NameBasedMethodFilter; /** * jedis(redis client) modifier @@ -24,7 +25,7 @@ import com.nhn.pinpoint.profiler.modifier.redis.filter.JedisMethodNames; */ public class JedisModifier extends AbstractModifier { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); public JedisModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { super(byteCodeInstrumentor, agent); @@ -45,34 +46,49 @@ public class JedisModifier extends AbstractModifier { try { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); - // trace endPoint - instrumentClass.addTraceValue(MapTraceValue.class); - - final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisConstructorInterceptor"); - instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String" }, constructorInterceptor); - try { - instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String", "int" }, constructorInterceptor); - instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String", "int", "int" }, constructorInterceptor); - instrumentClass.addConstructorInterceptor(new String[] { "java.net.URI" }, constructorInterceptor); - instrumentClass.addConstructorInterceptor(new String[] { "redis.clients.jedis.JedisShardInfo" }, constructorInterceptor); - } catch (Exception ignored) { - // backward compatibility error - } + beforeAddInterceptor(classLoader, protectedDomain, instrumentClass); - // method - final List declaredMethods = instrumentClass.getDeclaredMethods(new NameBasedMethodFilter(JedisMethodNames.get())); - for (Method method : declaredMethods) { - final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisMethodInterceptor"); - instrumentClass.addInterceptor(method.getMethodName(), method.getMethodParams(), methodInterceptor); - } + // add constructor + addConstructorInterceptor(classLoader, protectedDomain, instrumentClass); + + // add method + addMethodInterceptor(classLoader, protectedDomain, instrumentClass); return instrumentClass.toBytecode(); } catch (Exception e) { if (logger.isWarnEnabled()) { - logger.warn("redis.JedisModifier(Jedis) fail. Target class is " + getTargetClass() + ". Caused " + e.getMessage(), e); + logger.warn("Failed to modifier. caused={}", e.getMessage(), e); } } return null; } -} + + protected void beforeAddInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws NotFoundInstrumentException, InstrumentException { + // nothing + } + + protected void addConstructorInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws InstrumentException, NotFoundInstrumentException { + final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisConstructorInterceptor"); + instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String" }, constructorInterceptor); + try { + instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String", "int" }, constructorInterceptor); + instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String", "int", "int" }, constructorInterceptor); + instrumentClass.addConstructorInterceptor(new String[] { "java.net.URI" }, constructorInterceptor); + instrumentClass.addConstructorInterceptor(new String[] { "redis.clients.jedis.JedisShardInfo" }, constructorInterceptor); + } catch (Exception e) { + // backward compatibility error + if (logger.isWarnEnabled()) { + logger.warn("Failed to add constructor interceptor('not found redis.clients.jedis.JedisShardInfo' is compatibility error). caused={}", e.getMessage(), e); + } + } + } + + protected void addMethodInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws NotFoundInstrumentException, InstrumentException { + final List declaredMethods = instrumentClass.getDeclaredMethods(new NameBasedMethodFilter(JedisMethodNames.get())); + for (Method method : declaredMethods) { + final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisMethodInterceptor"); + instrumentClass.addInterceptor(method.getMethodName(), method.getMethodParams(), methodInterceptor); + } + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java index cc750350b..9de9d722b 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifier.java @@ -1,20 +1,15 @@ package com.nhn.pinpoint.profiler.modifier.redis; import java.security.ProtectionDomain; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; +import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentException; import com.nhn.pinpoint.profiler.interceptor.bci.Method; -import com.nhn.pinpoint.profiler.modifier.AbstractModifier; -import com.nhn.pinpoint.profiler.modifier.redis.filter.JedisPipelineMethodNames; -import com.nhn.pinpoint.profiler.modifier.redis.filter.NameBasedMethodFilter; +import com.nhn.pinpoint.profiler.interceptor.bci.NotFoundInstrumentException; /** * jedis(redis client) pipeline modifier @@ -22,9 +17,7 @@ import com.nhn.pinpoint.profiler.modifier.redis.filter.NameBasedMethodFilter; * @author jaehong.kim * */ -public class JedisPipelineModifier extends AbstractModifier { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); +public class JedisPipelineModifier extends JedisPipelineBaseModifier { public JedisPipelineModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { super(byteCodeInstrumentor, agent); @@ -35,50 +28,34 @@ public class JedisPipelineModifier extends AbstractModifier { return "redis/clients/jedis/Pipeline"; } - @Override - public byte[] modify(ClassLoader classLoader, String className, ProtectionDomain protectedDomain, byte[] classFileBuffer) { - if (logger.isInfoEnabled()) { - logger.info("Modifing. {}", className); - } + protected void beforeAddInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws NotFoundInstrumentException, InstrumentException { + // trace endPoint + instrumentClass.addTraceValue(MapTraceValue.class); - byteCodeInstrumentor.checkLibrary(classLoader, className); - try { - final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); - - // trace endPoint - instrumentClass.addTraceValue(MapTraceValue.class); - - final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisPipelineConstructorInterceptor"); - try { - // jedis 1.x - instrumentClass.addConstructorInterceptor(new String[] { "redis.clients.jedis.Client" }, constructorInterceptor); - } catch (Exception ignored) { - // backward compatibility error - } - - for (Method method : instrumentClass.getDeclaredMethods()) { - if (method.getMethodName().equals("setClient")) { - // jedis 2.x - final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisPipelineSetClientMethodInterceptor"); - instrumentClass.addInterceptor("setClient", new String[] { "redis.clients.jedis.Client" }, methodInterceptor); - } - } - - // method - final List declaredMethods = instrumentClass.getDeclaredMethods(new NameBasedMethodFilter(JedisPipelineMethodNames.get())); - for (Method method : declaredMethods) { - final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisPipelineMethodInterceptor"); - instrumentClass.addInterceptor(method.getMethodName(), method.getMethodParams(), methodInterceptor); - } - - return instrumentClass.toBytecode(); - } catch (Exception e) { - if (logger.isWarnEnabled()) { - logger.warn("redis.JedisPipelineModifier(Jedis) fail. Target class is " + getTargetClass() + ". Caused " + e.getMessage(), e); - } - } - - return null; + addConstructorInterceptor(classLoader, protectedDomain, instrumentClass); + addSetClientMethodInterceptor(classLoader, protectedDomain, instrumentClass); } -} + private void addSetClientMethodInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws NotFoundInstrumentException, InstrumentException { + for (Method method : instrumentClass.getDeclaredMethods()) { + if (method.getMethodName().equals("setClient")) { + // jedis 2.x + final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisPipelineSetClientMethodInterceptor"); + instrumentClass.addInterceptor("setClient", new String[] { "redis.clients.jedis.Client" }, methodInterceptor); + } + } + } + + private void addConstructorInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws InstrumentException { + final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.JedisPipelineConstructorInterceptor"); + try { + // jedis 1.x + instrumentClass.addConstructorInterceptor(new String[] { "redis.clients.jedis.Client" }, constructorInterceptor); + } catch (Exception e) { + // backward compatibility error + if (logger.isWarnEnabled()) { + logger.warn("Failed to add constructor interceptor(only jedis 1.x). caused={}", e.getMessage(), e); + } + } + } +} \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java index 5792553b1..4f9a7a4db 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifier.java @@ -1,17 +1,19 @@ package com.nhn.pinpoint.profiler.modifier.redis; import java.security.ProtectionDomain; -import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.nhn.pinpoint.profiler.interceptor.bci.DeclaredMethodsForce; +import com.nhn.pinpoint.profiler.interceptor.bci.DeclaredMethodsForce.FailMethod; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; +import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentException; import com.nhn.pinpoint.profiler.interceptor.bci.Method; +import com.nhn.pinpoint.profiler.interceptor.bci.NotFoundInstrumentException; import com.nhn.pinpoint.profiler.modifier.AbstractModifier; import com.nhn.pinpoint.profiler.modifier.redis.filter.NameBasedMethodFilter; import com.nhn.pinpoint.profiler.modifier.redis.filter.RedisClusterMethodNames; @@ -23,8 +25,7 @@ import com.nhn.pinpoint.profiler.modifier.redis.filter.RedisClusterMethodNames; * */ public class RedisClusterModifier extends AbstractModifier { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); public RedisClusterModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { super(byteCodeInstrumentor, agent); @@ -45,28 +46,52 @@ public class RedisClusterModifier extends AbstractModifier { try { final InstrumentClass instrumentClass = byteCodeInstrumentor.getClass(className); - // trace destinationId, endPoint - instrumentClass.addTraceValue(MapTraceValue.class); + beforeAddInterceptor(classLoader, protectedDomain, instrumentClass); - final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.RedisClusterConstructorInterceptor"); - instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String" }, constructorInterceptor); - instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String", "int" }, constructorInterceptor); - instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String", "int", "int" }, constructorInterceptor); + // add constructor + addConstructorInterceptor(classLoader, protectedDomain, instrumentClass); // method - final List declaredMethods = instrumentClass.getDeclaredMethods(new NameBasedMethodFilter(RedisClusterMethodNames.get())); - for (Method method : declaredMethods) { - final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.RedisClusterMethodInterceptor"); - instrumentClass.addInterceptor(method.getMethodName(), method.getMethodParams(), methodInterceptor); - } + addMethodInterceptor(classLoader, protectedDomain, instrumentClass); return instrumentClass.toBytecode(); } catch (Exception e) { if (logger.isWarnEnabled()) { - logger.warn("redis.RedisClusterModifier(nBase-ARC) fail. Target class is " + getTargetClass() + ", Caused " + e.getMessage(), e); + logger.warn("Failed to modifier. caused={}", e.getMessage(), e); } } return null; } + + protected void beforeAddInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws NotFoundInstrumentException, InstrumentException { + // nothing + } + + protected void addMethodInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws NotFoundInstrumentException, InstrumentException { + final DeclaredMethodsForce declaredMethods = instrumentClass.getDeclaredMethodsForce(new NameBasedMethodFilter(RedisClusterMethodNames.get())); + for (Method method : declaredMethods.getDeclaredMethods()) { + try { + final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.RedisClusterMethodInterceptor"); + instrumentClass.addInterceptor(method.getMethodName(), method.getMethodParams(), methodInterceptor); + } catch (Exception e) { + if (logger.isWarnEnabled()) { + logger.warn("Failed to add method interceptor('not found ...' is jedis compatibility error). caused={}", e.getMessage(), e); + } + } + } + + for (FailMethod method : declaredMethods.getFailDeclaredMethods()) { + if (logger.isWarnEnabled()) { + logger.warn("Failed to add method interceptor('not found ...' is jedis compatibility error). caused={}", method.getCaused().getMessage(), method.getCaused()); + } + } + } + + protected void addConstructorInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws InstrumentException, NotFoundInstrumentException { + final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.RedisClusterConstructorInterceptor"); + instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String" }, constructorInterceptor); + instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String", "int" }, constructorInterceptor); + instrumentClass.addConstructorInterceptor(new String[] { "java.lang.String", "int", "int" }, constructorInterceptor); + } } \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java index 65ebaa65e..d8525ad63 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifier.java @@ -1,7 +1,6 @@ package com.nhn.pinpoint.profiler.modifier.redis; import java.security.ProtectionDomain; -import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,8 +9,12 @@ import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.MapTraceValue; import com.nhn.pinpoint.profiler.interceptor.bci.ByteCodeInstrumentor; +import com.nhn.pinpoint.profiler.interceptor.bci.DeclaredMethodsForce; import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentClass; +import com.nhn.pinpoint.profiler.interceptor.bci.InstrumentException; import com.nhn.pinpoint.profiler.interceptor.bci.Method; +import com.nhn.pinpoint.profiler.interceptor.bci.NotFoundInstrumentException; +import com.nhn.pinpoint.profiler.interceptor.bci.DeclaredMethodsForce.FailMethod; import com.nhn.pinpoint.profiler.modifier.AbstractModifier; import com.nhn.pinpoint.profiler.modifier.redis.filter.NameBasedMethodFilter; import com.nhn.pinpoint.profiler.modifier.redis.filter.RedisClusterPipelineMethodNames; @@ -47,28 +50,51 @@ public class RedisClusterPipelineModifier extends AbstractModifier { // trace destinationId, endPoint instrumentClass.addTraceValue(MapTraceValue.class); - - final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.RedisClusterPipelineConstructorInterceptor"); - try { - instrumentClass.addConstructorInterceptor(new String[] { "com.nhncorp.redis.cluster.gateway.GatewayServer" }, constructorInterceptor); - } catch (Exception ignored) { - // backward compatibility error - } + + addConstructorInterceptor(classLoader, protectedDomain, instrumentClass); // method - final List declaredMethods = instrumentClass.getDeclaredMethods(new NameBasedMethodFilter(RedisClusterPipelineMethodNames.get())); - for (Method method : declaredMethods) { - final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.RedisClusterPipelineMethodInterceptor"); - instrumentClass.addInterceptor(method.getMethodName(), method.getMethodParams(), methodInterceptor); - } + addMethodInterceptor(classLoader, protectedDomain, instrumentClass); return instrumentClass.toBytecode(); } catch (Exception e) { if (logger.isWarnEnabled()) { - logger.warn("redis.RedisClusterPipelineModifier(nBase-ARC) fail. Target class is " + getTargetClass() + ", Caused " + e.getMessage(), e); + logger.warn("Failed to modifier. caused={}", e.getMessage(), e); } } return null; } + + protected void addConstructorInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws InstrumentException { + final Interceptor constructorInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.RedisClusterPipelineConstructorInterceptor"); + try { + instrumentClass.addConstructorInterceptor(new String[] { "com.nhncorp.redis.cluster.gateway.GatewayServer" }, constructorInterceptor); + } catch (Exception e) { + // backward compatibility error + if (logger.isWarnEnabled()) { + logger.warn("Failed to add constructor interceptor. caused={}", e.getMessage(), e); + } + } + } + + protected void addMethodInterceptor(ClassLoader classLoader, ProtectionDomain protectedDomain, final InstrumentClass instrumentClass) throws NotFoundInstrumentException, InstrumentException { + final DeclaredMethodsForce declaredMethods = instrumentClass.getDeclaredMethodsForce(new NameBasedMethodFilter(RedisClusterPipelineMethodNames.get())); + for (Method method : declaredMethods.getDeclaredMethods()) { + try { + final Interceptor methodInterceptor = byteCodeInstrumentor.newInterceptor(classLoader, protectedDomain, "com.nhn.pinpoint.profiler.modifier.redis.interceptor.RedisClusterPipelineMethodInterceptor"); + instrumentClass.addInterceptor(method.getMethodName(), method.getMethodParams(), methodInterceptor); + } catch (Exception e) { + if (logger.isWarnEnabled()) { + logger.warn("Failed to add method interceptor('not found ...' is jedis compatibility error). caused={}", e.getMessage(), e); + } + } + } + + for (FailMethod method : declaredMethods.getFailDeclaredMethods()) { + if (logger.isWarnEnabled()) { + logger.warn("Failed to add method interceptor('not found ...' is jedis compatibility error). caused={}", method.getCaused().getMessage(), method.getCaused()); + } + } + } } \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/NameBasedMethodFilter.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/NameBasedMethodFilter.java index b9b91aae1..139367847 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/NameBasedMethodFilter.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/filter/NameBasedMethodFilter.java @@ -14,16 +14,18 @@ import com.nhn.pinpoint.profiler.interceptor.bci.MethodFilter; * */ public class NameBasedMethodFilter implements MethodFilter { + private static final int SYNTHETIC = 0x00001000; private final Set methodNames; - - public NameBasedMethodFilter(Set methodNames) { + + public NameBasedMethodFilter(final Set methodNames) { this.methodNames = methodNames; } - + @Override public boolean filter(CtMethod ctMethod) { final int modifiers = ctMethod.getModifiers(); - if (!Modifier.isPublic(modifiers) || Modifier.isStatic(modifiers) || Modifier.isAbstract(modifiers) || Modifier.isNative(modifiers)) { + + if (isSynthetic(modifiers) || !Modifier.isPublic(modifiers) || Modifier.isStatic(modifiers) || Modifier.isAbstract(modifiers) || Modifier.isNative(modifiers)) { return true; } @@ -33,4 +35,8 @@ public class NameBasedMethodFilter implements MethodFilter { return true; } + + private boolean isSynthetic(int mod) { + return (mod & SYNTHETIC) != 0; + } } \ No newline at end of file diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayConstructorInterceptor.java index 86d7b0aec..4eb46a069 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/GatewayConstructorInterceptor.java @@ -11,8 +11,7 @@ import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; import com.nhncorp.redis.cluster.gateway.GatewayConfig; /** - * Gateway(nBase-ARC client) constructor interceptor - * - trace destinationId + * Gateway(nBase-ARC client) constructor interceptor - trace destinationId * * @author jaehong.kim * @@ -43,8 +42,11 @@ public class GatewayConstructorInterceptor implements SimpleAroundInterceptor, T // over 1.1.x traceValue.put("destinationId", config.getClusterName()); } - } catch (Exception ignored) { + } catch (Exception e) { // backward compatibility error or expect 'class not found exception - GatewayConfig' + if (logger.isWarnEnabled()) { + logger.warn("Failed to trace destinationId('not found getClusterName' is compatibility error). caused={}", e.getMessage(), e); + } } ((MapTraceValue) target).__setTraceBindValue(traceValue); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java index c81e8d51c..c190e468f 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/JedisConstructorInterceptor.java @@ -58,8 +58,11 @@ public class JedisConstructorInterceptor implements SimpleAroundInterceptor, Tar endPoint.append(":"); endPoint.append(info.getPort()); } - } catch (Exception ignored) { + } catch (Exception e) { // expect 'class not found exception - JedisShardInfo' + if (logger.isWarnEnabled()) { + logger.warn("Failed to trace endPoint('not found JedisShardInfo' is compatibility error). caused={}", e.getMessage(), e); + } } final Map traceValue = new HashMap(); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java index ef2b1f90e..3458779ee 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/redis/interceptor/RedisClusterPipelineConstructorInterceptor.java @@ -11,8 +11,7 @@ import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; import com.nhncorp.redis.cluster.gateway.GatewayServer; /** - * RedisCluster pipeline(nBase-ARC client) constructor interceptor - * - trace destinationId & endPoint + * RedisCluster pipeline(nBase-ARC client) constructor interceptor - trace destinationId & endPoint * * @author jaehong.kim * @@ -39,8 +38,11 @@ public class RedisClusterPipelineConstructorInterceptor implements SimpleAroundI try { final GatewayServer server = (GatewayServer) args[0]; traceValue.put("endPoint", server.getAddress().getHost() + ":" + server.getAddress().getPort()); - } catch(Exception ignored) { + } catch (Exception e) { // expect 'class not found exception - GatewayServer' + if (logger.isWarnEnabled()) { + logger.warn("Failed to trace endPoint('not found GatewayServer' is compatibility error). caused={}", e.getMessage(), e); + } } if (args[0] instanceof MapTraceValue) { diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java index 70c71ceac..f764dd22c 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisModifierTest.java @@ -50,6 +50,22 @@ public class JedisModifierTest extends BasePinpointTest { assertNull(event.getExceptionMessage()); } + @Test + public void traceBinaryMethod() { + // get 명령을 실행하고 event 결과를 확인한다. + jedis.get("foo".getBytes()); + + final List spanEvents = getCurrentSpanEvents(); + assertEquals(1, spanEvents.size()); + SpanEventBo event = spanEvents.get(0); + + assertEquals(HOST + ":" + PORT, event.getEndPoint()); + assertEquals("REDIS", event.getDestinationId()); + assertEquals(ServiceType.REDIS, event.getServiceType()); + assertNull(event.getExceptionMessage()); + } + + @Test public void traceMethodThrowException() { // 에러가 발생한 경우에 대한 event 결과를 확인한다. @@ -66,4 +82,4 @@ public class JedisModifierTest extends BasePinpointTest { assertNotNull(event.getExceptionMessage()); } -} +} \ No newline at end of file diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java index ab1824e52..e8c09037e 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/JedisPipelineModifierTest.java @@ -37,7 +37,25 @@ public class JedisPipelineModifierTest extends BasePinpointTest { } @Test - public void traceMethod() { + public void traceMultikeyMethod() { + // get 명령을 실행하고 event 결과를 확인한다. + Pipeline pipeline = jedis.pipelined(); + pipeline.mget("foo"); + pipeline.syncAndReturnAll(); + + final List spanEvents = getCurrentSpanEvents(); + assertEquals(2, spanEvents.size()); + SpanEventBo event = spanEvents.get(0); + + System.out.println(event); + assertEquals(HOST + ":" + PORT, event.getEndPoint()); + assertEquals("REDIS", event.getDestinationId()); + assertEquals(ServiceType.REDIS, event.getServiceType()); + assertNull(event.getExceptionMessage()); + } + + @Test + public void traceBaseMethod() { // get 명령을 실행하고 event 결과를 확인한다. Pipeline pipeline = jedis.pipelined(); pipeline.get("foo"); @@ -46,13 +64,14 @@ public class JedisPipelineModifierTest extends BasePinpointTest { final List spanEvents = getCurrentSpanEvents(); assertEquals(2, spanEvents.size()); SpanEventBo event = spanEvents.get(0); - + System.out.println(event); assertEquals(HOST + ":" + PORT, event.getEndPoint()); assertEquals("REDIS", event.getDestinationId()); assertEquals(ServiceType.REDIS, event.getServiceType()); assertNull(event.getExceptionMessage()); } + @Test public void traceMethodThrowException() { // 에러가 발생한 경우에 대한 event 결과를 확인한다. diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java index d52d968bf..019319dc5 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterModifierTest.java @@ -29,7 +29,6 @@ public class RedisClusterModifierTest extends BasePinpointTest { @Before public void before() { redis = new RedisCluster(HOST, PORT); - } @Test @@ -45,6 +44,20 @@ public class RedisClusterModifierTest extends BasePinpointTest { assertEquals(ServiceType.NBASE_ARC, event.getServiceType()); assertNull(event.getExceptionMessage()); } + + @Test + public void traceBinaryMethod() { + redis.get("foo".getBytes()); + + final List spanEvents = getCurrentSpanEvents(); + assertEquals(1, spanEvents.size()); + SpanEventBo event = spanEvents.get(0); + + assertEquals("NBASE_ARC", event.getDestinationId()); + assertEquals(HOST + ":" + PORT, event.getEndPoint()); + assertEquals(ServiceType.NBASE_ARC, event.getServiceType()); + assertNull(event.getExceptionMessage()); + } @Test public void traceDestinationId() { diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java index e067e2e05..f546bc9e4 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/redis/RedisClusterPipelineModifierTest.java @@ -51,6 +51,25 @@ public class RedisClusterPipelineModifierTest extends BasePinpointTest { assertNull(event.getExceptionMessage()); } + @Test + public void traceBinaryMethod() { + pipeline.get("foo".getBytes()); + pipeline.syncAndReturnAll(); + + final List spanEvents = getCurrentSpanEvents(); + for (SpanEventBo bo : spanEvents) { + System.out.println("### " + bo); + } + + assertEquals(2, spanEvents.size()); + SpanEventBo event = spanEvents.get(0); + + assertEquals("NBASE_ARC", event.getDestinationId()); + assertEquals(HOST + ":" + PORT, event.getEndPoint()); + assertEquals(ServiceType.NBASE_ARC, event.getServiceType()); + assertNull(event.getExceptionMessage()); + } + @Test public void traceDestinationId() { GatewayConfig config = new GatewayConfig();