From 4068b6366dc82d7fa690dfd5edcbccde5ec1d90e Mon Sep 17 00:00:00 2001 From: Jongho Moon Date: Mon, 17 Nov 2014 18:35:13 +0900 Subject: [PATCH] [#49] Created arcus plugin project --- .../interceptor/SimpleAfterInterceptor.java | 8 + .../interceptor/SimpleAroundInterceptor.java | 5 +- .../interceptor/SimpleBeforeInterceptor.java | 5 + .../bootstrap/plugin/BasicClassEditor.java | 23 +-- .../bootstrap/plugin/ClassEditor.java | 4 +- .../bootstrap/plugin/ClassEditorBuilder.java | 69 +++++--- .../bootstrap/plugin/ClassEditorFactory.java | 5 + .../plugin/ClassEditorFactoryMapping.java | 19 +++ .../pinpoint/bootstrap/plugin/Condition.java | 7 + .../plugin/ConditionalClassEditor.java | 22 +++ .../ConditionalInterceptorInjector.java | 21 +++ .../plugin/DefaultInterceptorFactory.java | 19 +-- .../plugin/DefaultMetadataInjector.java | 10 +- .../plugin/PluginClassLoaderFactory.java | 28 +++ .../bootstrap/plugin/ProfilerPlugin.java | 2 +- .../plugin/ProfilerPluginContext.java | 9 +- .../pinpoint/bootstrap/plugin/TypeUtils.java | 11 ++ .../plugin/ClassEditorBuilderTest.java | 20 +-- .../plugin/DefaultInterceptorFactoryTest.java | 71 +++----- plugins/.gitignore | 2 + plugins/arcus/.gitignore | 4 + plugins/arcus/pom.xml | 101 +++++++++++ .../pinpoint/plugin/arcus/ArcusPlugin.java | 46 +++++ .../nhn/pinpoint/plugin/arcus/Commons.java | 26 +++ .../arcus}/IndexParameterExtractor.java | 2 +- .../plugin}/arcus/ParameterUtils.java | 2 +- .../arcus/accessor/CacheKeyAccessor.java | 8 + .../arcus/accessor/CacheNameAccessor.java | 8 + .../arcus/accessor/OperationAccessor.java | 10 ++ .../arcus/accessor/ServiceCodeAccessor.java | 8 + .../editor/ArcusClientEditorFactory.java | 41 +++++ .../editor/BaseCacheManagerEditorFactory.java | 28 +++ .../BaseOperationImplEditorFactory.java | 19 +++ .../FrontCacheGetFutureEditorFactory.java | 33 ++++ ...rontCacheMemcachedClientEditorFactory.java | 40 +++++ .../arcus/editor/FutureEditorFactory.java | 29 ++++ .../editor/MemcachedClientEditorFactory.java | 47 +++++ .../arcus/filter}/ArcusMethodFilter.java | 2 +- .../FrontCacheMemcachedMethodFilter.java | 2 +- .../arcus/filter}/MemcachedMethodFilter.java | 2 +- .../arcus/interceptor/AddOpInterceptor.java | 20 +-- .../arcus/interceptor/ApiInterceptor.java | 33 ++-- .../CacheManagerConstructInterceptor.java | 20 +-- ...ontCacheGetFutureConstructInterceptor.java | 26 ++- .../FrontCacheGetFutureGetInterceptor.java | 35 ++-- .../interceptor/FutureGetInterceptor.java | 44 +++-- .../FutureSetOperationInterceptor.java | 28 +++ .../SetCacheManagerInterceptor.java | 27 +++ ...CacheGetFutureModifierIntegrationTest.java | 0 .../arcus/interceptor/ApiInterceptorTest.java | 14 +- ...erationTransitionStateInterceptorTest.java | 0 .../interceptor/FutureGetInterceptorTest.java | 35 ++-- plugins/pom.xml | 22 +++ pom.xml | 5 + .../ClassFileTransformerDispatcher.java | 19 +-- .../pinpoint/profiler/DefaultAgent.java | 2 - .../modifier/DefaultModifierRegistry.java | 61 ------- .../arcus/CollectionFutureModifier.java | 23 --- .../modifier/arcus/GetFutureModifier.java | 22 --- .../arcus/ImmediateFutureModifier.java | 22 --- .../arcus/OperationFutureModifier.java | 23 --- .../profiler/modifier/arcus/SpyVersion.java | 40 ----- .../arcus/interceptor/ArcusScope.java | 10 -- .../BaseOperationCancelInterceptor.java | 53 ------ .../BaseOperationConstructInterceptor.java | 55 ------ ...seOperationTransitionStateInterceptor.java | 161 ------------------ .../FutureSetOperationInterceptor.java | 36 ---- .../SetCacheManagerInterceptor.java | 43 ----- .../profiler/plugin/ClassEditorAdaptor.java | 46 ++++- .../profiler/plugin/PluginLoader.java | 58 ++++--- .../tomcat/MockTraceContextFactory.java | 17 ++ test/.gitignore | 4 + test/pom.xml | 91 ++++++++++ .../interceptor}/BaseInterceptorTest.java | 5 +- .../test/mock/MockTraceContextFactory.java | 17 ++ 75 files changed, 1076 insertions(+), 859 deletions(-) create mode 100644 bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SimpleAfterInterceptor.java create mode 100644 bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SimpleBeforeInterceptor.java create mode 100644 bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorFactory.java create mode 100644 bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorFactoryMapping.java create mode 100644 bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/Condition.java create mode 100644 bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ConditionalClassEditor.java create mode 100644 bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ConditionalInterceptorInjector.java create mode 100644 bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/PluginClassLoaderFactory.java create mode 100644 plugins/.gitignore create mode 100644 plugins/arcus/.gitignore create mode 100644 plugins/arcus/pom.xml create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/ArcusPlugin.java create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/Commons.java rename {profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor => plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus}/IndexParameterExtractor.java (89%) rename {profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier => plugins/arcus/src/main/java/com/nhn/pinpoint/plugin}/arcus/ParameterUtils.java (91%) create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/CacheKeyAccessor.java create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/CacheNameAccessor.java create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/OperationAccessor.java create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/ServiceCodeAccessor.java create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/ArcusClientEditorFactory.java create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/BaseCacheManagerEditorFactory.java create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/BaseOperationImplEditorFactory.java create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/FrontCacheGetFutureEditorFactory.java create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/FrontCacheMemcachedClientEditorFactory.java create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/FutureEditorFactory.java create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/MemcachedClientEditorFactory.java rename {profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus => plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/filter}/ArcusMethodFilter.java (97%) rename {profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus => plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/filter}/FrontCacheMemcachedMethodFilter.java (97%) rename {profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus => plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/filter}/MemcachedMethodFilter.java (97%) rename {profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier => plugins/arcus/src/main/java/com/nhn/pinpoint/plugin}/arcus/interceptor/AddOpInterceptor.java (58%) rename {profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier => plugins/arcus/src/main/java/com/nhn/pinpoint/plugin}/arcus/interceptor/ApiInterceptor.java (73%) rename {profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier => plugins/arcus/src/main/java/com/nhn/pinpoint/plugin}/arcus/interceptor/CacheManagerConstructInterceptor.java (56%) rename {profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier => plugins/arcus/src/main/java/com/nhn/pinpoint/plugin}/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java (59%) rename {profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier => plugins/arcus/src/main/java/com/nhn/pinpoint/plugin}/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java (67%) rename {profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier => plugins/arcus/src/main/java/com/nhn/pinpoint/plugin}/arcus/interceptor/FutureGetInterceptor.java (77%) create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FutureSetOperationInterceptor.java create mode 100644 plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/SetCacheManagerInterceptor.java rename {profiler/src/test/java/com/navercorp => plugins/arcus/src/test/java/com/nhn}/pinpoint/profiler/modifier/arcus/FrontCacheGetFutureModifierIntegrationTest.java (100%) rename {profiler/src/test/java/com/navercorp => plugins/arcus/src/test/java/com/nhn}/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptorTest.java (83%) rename {profiler/src/test/java/com/navercorp => plugins/arcus/src/test/java/com/nhn}/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptorTest.java (100%) rename {profiler/src/test/java/com/navercorp => plugins/arcus/src/test/java/com/nhn}/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptorTest.java (82%) create mode 100644 plugins/pom.xml delete mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/CollectionFutureModifier.java delete mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/GetFutureModifier.java delete mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ImmediateFutureModifier.java delete mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/OperationFutureModifier.java delete mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/SpyVersion.java delete mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ArcusScope.java delete mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationCancelInterceptor.java delete mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationConstructInterceptor.java delete mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptor.java delete mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureSetOperationInterceptor.java delete mode 100644 profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/SetCacheManagerInterceptor.java create mode 100644 profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/tomcat/MockTraceContextFactory.java create mode 100644 test/.gitignore create mode 100644 test/pom.xml rename {profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier => test/src/main/java/com/nhn/pinpoint/test/interceptor}/BaseInterceptorTest.java (93%) create mode 100644 test/src/main/java/com/nhn/pinpoint/test/mock/MockTraceContextFactory.java diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SimpleAfterInterceptor.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SimpleAfterInterceptor.java new file mode 100644 index 000000000..f764192df --- /dev/null +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SimpleAfterInterceptor.java @@ -0,0 +1,8 @@ +package com.nhn.pinpoint.bootstrap.interceptor; + +/** + * @author emeroad + */ +public interface SimpleAfterInterceptor extends Interceptor { + void after(Object target, Object[] args, Object result, Throwable throwable); +} diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SimpleAroundInterceptor.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SimpleAroundInterceptor.java index d05d43497..d7e10bbbd 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SimpleAroundInterceptor.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SimpleAroundInterceptor.java @@ -3,9 +3,6 @@ package com.nhn.pinpoint.bootstrap.interceptor; /** * @author emeroad */ -public interface SimpleAroundInterceptor extends Interceptor { +public interface SimpleAroundInterceptor extends SimpleBeforeInterceptor, SimpleAfterInterceptor { - void before(Object target, Object[] args); - - void after(Object target, Object[] args, Object result, Throwable throwable); } diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SimpleBeforeInterceptor.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SimpleBeforeInterceptor.java new file mode 100644 index 000000000..534f40062 --- /dev/null +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/interceptor/SimpleBeforeInterceptor.java @@ -0,0 +1,5 @@ +package com.nhn.pinpoint.bootstrap.interceptor; + +public interface SimpleBeforeInterceptor extends Interceptor { + void before(Object target, Object[] args); +} diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/BasicClassEditor.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/BasicClassEditor.java index 3d5bd57af..9ad1953ae 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/BasicClassEditor.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/BasicClassEditor.java @@ -1,33 +1,23 @@ package com.nhn.pinpoint.bootstrap.plugin; -import java.security.ProtectionDomain; import java.util.List; -import com.nhn.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; import com.nhn.pinpoint.bootstrap.instrument.InstrumentClass; import com.nhn.pinpoint.exception.PinpointException; -public class BasicClassEditor implements DedicatedClassEditor { - private final ByteCodeInstrumentor instrumentor; - - private final String targetClassName; - +public class BasicClassEditor implements ClassEditor { private final List metadataInjectors; private final List interceptorInjectors; - public BasicClassEditor(ByteCodeInstrumentor instrumentor, String targetClassName, List metadataInjectors, List interceptorInjectors) { - this.instrumentor = instrumentor; - this.targetClassName = targetClassName; + public BasicClassEditor(List metadataInjectors, List interceptorInjectors) { this.metadataInjectors = metadataInjectors; this.interceptorInjectors = interceptorInjectors; } @Override - public byte[] edit(ClassLoader classLoader, String className, ProtectionDomain protectedDomain, byte[] classFileBuffer) { + public byte[] edit(ClassLoader classLoader, InstrumentClass target) { try { - InstrumentClass target = instrumentor.getClass(classLoader, className, classFileBuffer); - for (MetadataInjector injector : metadataInjectors) { injector.inject(classLoader, target); } @@ -38,12 +28,7 @@ public class BasicClassEditor implements DedicatedClassEditor { return target.toBytecode(); } catch (Throwable t) { - throw new PinpointException("Fail to edit class: " + targetClassName, t); + throw new PinpointException("Fail to edit class", t); } } - - @Override - public String getTargetClassName() { - return targetClassName; - } } diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditor.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditor.java index 9f30eee41..6a424d8db 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditor.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditor.java @@ -1,7 +1,7 @@ package com.nhn.pinpoint.bootstrap.plugin; -import java.security.ProtectionDomain; +import com.nhn.pinpoint.bootstrap.instrument.InstrumentClass; public interface ClassEditor { - public byte[] edit(ClassLoader classLoader, String className, ProtectionDomain protectionDomain, byte[] classFileBuffer); + public byte[] edit(ClassLoader classLoader, InstrumentClass target); } diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorBuilder.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorBuilder.java index f77446b1a..92569e952 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorBuilder.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorBuilder.java @@ -6,6 +6,7 @@ import java.util.List; import com.nhn.pinpoint.bootstrap.context.TraceContext; import com.nhn.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; import com.nhn.pinpoint.bootstrap.instrument.MethodFilter; +import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.TraceValue; import com.nhn.pinpoint.bootstrap.plugin.MetadataInitializationStrategy.ByConstructor; @@ -13,18 +14,22 @@ public class ClassEditorBuilder { private final ByteCodeInstrumentor instrumentor; private final TraceContext traceContext; - private final String targetClassName; - private final List interceptorBuilders = new ArrayList(); private final List metadataBuilders = new ArrayList(); - public ClassEditorBuilder(ByteCodeInstrumentor instrumentor, TraceContext traceContext, String targetClassName) { + private Condition condition; + + public ClassEditorBuilder(ByteCodeInstrumentor instrumentor, TraceContext traceContext) { this.instrumentor = instrumentor; this.traceContext = traceContext; - this.targetClassName = targetClassName; + } + + public ClassEditorBuilder editWhen(Condition condition) { + this.condition = condition; + return this; } - public InterceptorBuilder intercept(String methodName, String... parameterTypes) { + public InterceptorBuilder intercept(String methodName, Class... parameterTypes) { InterceptorBuilder interceptorBuilder = new InterceptorBuilder(methodName, parameterTypes, null); interceptorBuilders.add(interceptorBuilder); return interceptorBuilder; @@ -36,14 +41,14 @@ public class ClassEditorBuilder { return interceptorBuilder; } - public InterceptorBuilder interceptConstructor(String... parameterTypes) { + public InterceptorBuilder interceptConstructor(Class... parameterTypes) { InterceptorBuilder interceptorBuilder = new InterceptorBuilder(null, parameterTypes, null); interceptorBuilders.add(interceptorBuilder); return interceptorBuilder; } - public MetadataBuilder inject(Class metadataAccessor) { - MetadataBuilder metadataBuilder = new MetadataBuilder(metadataAccessor); + public MetadataBuilder inject(Class metadataType) { + MetadataBuilder metadataBuilder = new MetadataBuilder(metadataType); metadataBuilders.add(metadataBuilder); return metadataBuilder; } @@ -61,7 +66,13 @@ public class ClassEditorBuilder { interceptorInjectors.add(builder.build()); } - return new BasicClassEditor(instrumentor, targetClassName, metadataInjectors, interceptorInjectors); + ClassEditor editor = new BasicClassEditor(metadataInjectors, interceptorInjectors); + + if (condition != null) { + editor = new ConditionalClassEditor(condition, editor); + } + + return editor; } public class InterceptorBuilder { @@ -69,15 +80,16 @@ public class ClassEditorBuilder { private final String[] parameterTypes; private final MethodFilter filter; - private String interceptorClassName; + private Class interceptorClass; + private Condition condition; private String scopeName; private Object[] constructorArguments; private ParameterExtractorFactory parameterExtractorFactory; private boolean singleton; - public InterceptorBuilder(String methodName, String[] parameterTypes, MethodFilter filter) { + public InterceptorBuilder(String methodName, Class[] parameterTypes, MethodFilter filter) { this.methodName = methodName; - this.parameterTypes = parameterTypes; + this.parameterTypes = TypeUtils.toClassNames(parameterTypes); this.filter = filter; } @@ -86,8 +98,8 @@ public class ClassEditorBuilder { return this; } - public InterceptorBuilder with(String interceptorClassName) { - this.interceptorClassName = interceptorClassName; + public InterceptorBuilder with(Class interceptorClass) { + this.interceptorClass = interceptorClass; return this; } @@ -106,25 +118,38 @@ public class ClassEditorBuilder { return this; } + public InterceptorBuilder when(Condition condition) { + this.condition = condition; + return this; + } + private InterceptorInjector build() { - InterceptorFactory interceptorFactory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, constructorArguments, parameterExtractorFactory, scopeName); + InterceptorFactory interceptorFactory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClass, constructorArguments, parameterExtractorFactory, scopeName); + + InterceptorInjector injector; if (filter != null) { - return new FilteringInterceptorInjector(filter, interceptorFactory, singleton); + injector = new FilteringInterceptorInjector(filter, interceptorFactory, singleton); } else if (methodName != null) { - return new DedicatedInterceptorInjector(methodName, parameterTypes, interceptorFactory); + injector = new DedicatedInterceptorInjector(methodName, parameterTypes, interceptorFactory); } else { - return new ConstructorInterceptorInjector(parameterTypes, interceptorFactory); + injector = new ConstructorInterceptorInjector(parameterTypes, interceptorFactory); } + + if (condition != null) { + injector = new ConditionalInterceptorInjector(condition, injector); + } + + return injector; } } public class MetadataBuilder { - private final Class metadataAccessor; + private final Class metadataType; private MetadataInitializationStrategy initializationStrategy; - public MetadataBuilder(Class metadataAccessor) { - this.metadataAccessor = metadataAccessor; + public MetadataBuilder(Class metadataType) { + this.metadataType = metadataType; } public MetadataBuilder initializeWithDefaultConstructorOf(String className) { @@ -133,7 +158,7 @@ public class ClassEditorBuilder { } private MetadataInjector build() { - return new DefaultMetadataInjector(metadataAccessor, initializationStrategy); + return new DefaultMetadataInjector(metadataType, initializationStrategy); } } } diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorFactory.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorFactory.java new file mode 100644 index 000000000..0abaf70d5 --- /dev/null +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorFactory.java @@ -0,0 +1,5 @@ +package com.nhn.pinpoint.bootstrap.plugin; + +public interface ClassEditorFactory { + public ClassEditor get(ProfilerPluginContext context); +} diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorFactoryMapping.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorFactoryMapping.java new file mode 100644 index 000000000..1fe1a985c --- /dev/null +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorFactoryMapping.java @@ -0,0 +1,19 @@ +package com.nhn.pinpoint.bootstrap.plugin; + +public class ClassEditorFactoryMapping { + private final String targetClassName; + private final String editorFactoryClassName; + + public ClassEditorFactoryMapping(String targetClassName, String editorFactoryClassName) { + this.targetClassName = targetClassName; + this.editorFactoryClassName = editorFactoryClassName; + } + + public String getTargetClassName() { + return targetClassName; + } + + public String getEditorFactoryClassName() { + return editorFactoryClassName; + } +} diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/Condition.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/Condition.java new file mode 100644 index 000000000..8c3aa37ba --- /dev/null +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/Condition.java @@ -0,0 +1,7 @@ +package com.nhn.pinpoint.bootstrap.plugin; + +import com.nhn.pinpoint.bootstrap.instrument.InstrumentClass; + +public interface Condition { + public boolean check(InstrumentClass target); +} diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ConditionalClassEditor.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ConditionalClassEditor.java new file mode 100644 index 000000000..23e6132ef --- /dev/null +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ConditionalClassEditor.java @@ -0,0 +1,22 @@ +package com.nhn.pinpoint.bootstrap.plugin; + +import com.nhn.pinpoint.bootstrap.instrument.InstrumentClass; + +public class ConditionalClassEditor implements ClassEditor { + private final Condition condition; + private final ClassEditor delegate; + + public ConditionalClassEditor(Condition condition, ClassEditor delegate) { + this.condition = condition; + this.delegate = delegate; + } + + @Override + public byte[] edit(ClassLoader classLoader, InstrumentClass target) { + if (condition.check(target)) { + return delegate.edit(classLoader, target); + } + + return null; + } +} diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ConditionalInterceptorInjector.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ConditionalInterceptorInjector.java new file mode 100644 index 000000000..5296c71b7 --- /dev/null +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ConditionalInterceptorInjector.java @@ -0,0 +1,21 @@ +package com.nhn.pinpoint.bootstrap.plugin; + +import com.nhn.pinpoint.bootstrap.instrument.InstrumentClass; +import com.nhn.pinpoint.bootstrap.instrument.InstrumentException; + +public class ConditionalInterceptorInjector implements InterceptorInjector { + private final Condition condition; + private final InterceptorInjector delegate; + + public ConditionalInterceptorInjector(Condition condition, InterceptorInjector delegate) { + this.condition = condition; + this.delegate = delegate; + } + + @Override + public void inject(ClassLoader classLoader, InstrumentClass target) throws InstrumentException { + if (condition.check(target)) { + delegate.inject(classLoader, target); + } + } +} diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/DefaultInterceptorFactory.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/DefaultInterceptorFactory.java index f8914a413..a2cfe3bf5 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/DefaultInterceptorFactory.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/DefaultInterceptorFactory.java @@ -22,17 +22,17 @@ public class DefaultInterceptorFactory implements InterceptorFactory { private final ByteCodeInstrumentor instrumentor; private final TraceContext traceContext; - private final String interceptorClassName; + private final Class interceptorClass; private final Object[] providedArguments; private final ParameterExtractorFactory parameterExtractorFactory; private final String scopeName; - public DefaultInterceptorFactory(ByteCodeInstrumentor instrumentor, TraceContext traceContext, String interceptorClassName, Object[] providedArguments, ParameterExtractorFactory parameterExtractorFactory, String scopeName) { + public DefaultInterceptorFactory(ByteCodeInstrumentor instrumentor, TraceContext traceContext, Class interceptorClass, Object[] providedArguments, ParameterExtractorFactory parameterExtractorFactory, String scopeName) { this.instrumentor = instrumentor; this.traceContext = traceContext; - this.interceptorClassName = interceptorClassName; + this.interceptorClass = interceptorClass; this.providedArguments = providedArguments == null ? NO_ARGS : providedArguments; this.parameterExtractorFactory = parameterExtractorFactory; this.scopeName = scopeName; @@ -50,17 +50,6 @@ public class DefaultInterceptorFactory implements InterceptorFactory { } private Interceptor createInstance(TraceContext traceContext, ClassLoader classLoader, InstrumentClass target, MethodInfo targetMethod) { - Class interceptorClass; - try { - interceptorClass = classLoader.loadClass(interceptorClassName); - } catch (ClassNotFoundException e) { - throw new PinpointException("Cannot find interceptor class: " + interceptorClassName, e); - } - - if (!Interceptor.class.isAssignableFrom(interceptorClass)) { - throw new PinpointException("Given class " + interceptorClassName + " is not implementing Interceptor"); - } - Constructor[] constructors = interceptorClass.getConstructors(); Arrays.sort(constructors, CONSTRUCTOR_COMPARATOR); @@ -73,7 +62,7 @@ public class DefaultInterceptorFactory implements InterceptorFactory { } } - throw new PinpointException("Cannot find suitable constructor for " + interceptorClassName); + throw new PinpointException("Cannot find suitable constructor for " + interceptorClass.getName()); } private Object invokeConstructor(Constructor constructor, Object[] arguments) { diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/DefaultMetadataInjector.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/DefaultMetadataInjector.java index 9c324b542..919632ec0 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/DefaultMetadataInjector.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/DefaultMetadataInjector.java @@ -7,22 +7,22 @@ import com.nhn.pinpoint.bootstrap.plugin.MetadataInitializationStrategy.ByConstr public class DefaultMetadataInjector implements MetadataInjector { - private final Class metadataAccessorType; + private final Class metadataType; private final MetadataInitializationStrategy strategy; - public DefaultMetadataInjector(Class metadataAccessorType, MetadataInitializationStrategy strategy) { - this.metadataAccessorType = metadataAccessorType; + public DefaultMetadataInjector(Class metadataType, MetadataInitializationStrategy strategy) { + this.metadataType = metadataType; this.strategy = strategy; } @Override public void inject(ClassLoader classLoader, InstrumentClass target) throws InstrumentException { if (strategy == null) { - target.addTraceValue(metadataAccessorType); + target.addTraceValue(metadataType); } else { if (strategy instanceof ByConstructor) { String javaExpression = "new " + ((ByConstructor)strategy).getClassName() + "();"; - target.addTraceValue(metadataAccessorType, javaExpression); + target.addTraceValue(metadataType, javaExpression); } else { throw new IllegalArgumentException("Unsupported strategy: " + strategy); } diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/PluginClassLoaderFactory.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/PluginClassLoaderFactory.java new file mode 100644 index 000000000..04d39936e --- /dev/null +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/PluginClassLoaderFactory.java @@ -0,0 +1,28 @@ +package com.nhn.pinpoint.bootstrap.plugin; + +import java.net.URL; +import java.net.URLClassLoader; +import java.util.concurrent.ConcurrentHashMap; + +public class PluginClassLoaderFactory { + private final URL[] pluginJars; + private final ConcurrentHashMap cache = new ConcurrentHashMap(); + + public PluginClassLoaderFactory(URL[] pluginJars) { + this.pluginJars = pluginJars; + } + + public ClassLoader get(ClassLoader loader) { + ClassLoader forPlugin = cache.get(loader); + + if (forPlugin != null) { + return forPlugin; + } + + ClassLoader newInstance = new URLClassLoader(pluginJars, loader); + ClassLoader inCache = cache.putIfAbsent(loader, newInstance); + + return inCache == null ? newInstance : inCache; + } + +} diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ProfilerPlugin.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ProfilerPlugin.java index feca85f5f..67af74da6 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ProfilerPlugin.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ProfilerPlugin.java @@ -3,5 +3,5 @@ package com.nhn.pinpoint.bootstrap.plugin; import java.util.List; public interface ProfilerPlugin { - public List getClassEditors(ProfilerPluginContext context); + public List getClassEditorMappings(ProfilerPluginContext context); } diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ProfilerPluginContext.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ProfilerPluginContext.java index 0f6b5a601..32bd5696e 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ProfilerPluginContext.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/ProfilerPluginContext.java @@ -1,5 +1,6 @@ package com.nhn.pinpoint.bootstrap.plugin; +import com.nhn.pinpoint.bootstrap.config.ProfilerConfig; import com.nhn.pinpoint.bootstrap.context.TraceContext; import com.nhn.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; @@ -12,8 +13,12 @@ public class ProfilerPluginContext { this.traceContext = traceContext; } - public ClassEditorBuilder getClassEditorBuilderFor(String targetClassName) { - return new ClassEditorBuilder(instrumentor, traceContext, targetClassName); + public ClassEditorBuilder newClassEditorBuilder() { + return new ClassEditorBuilder(instrumentor, traceContext); + } + + public ProfilerConfig getConfig() { + return traceContext.getProfilerConfig(); } } diff --git a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/TypeUtils.java b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/TypeUtils.java index ada22f539..79241f544 100644 --- a/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/TypeUtils.java +++ b/bootstrap/src/main/java/com/navercorp/pinpoint/bootstrap/plugin/TypeUtils.java @@ -24,4 +24,15 @@ public abstract class TypeUtils { throw new IllegalArgumentException("Unexpected argument: " + primitive); } + + public static String[] toClassNames(Class... classes) { + int length = classes.length; + String[] result = new String[length]; + + for (int i = 0; i < length; i++) { + result[i] = classes[i].getName(); + } + + return result; + } } diff --git a/bootstrap/src/test/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorBuilderTest.java b/bootstrap/src/test/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorBuilderTest.java index 3f33db191..c4480d12f 100644 --- a/bootstrap/src/test/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorBuilderTest.java +++ b/bootstrap/src/test/java/com/navercorp/pinpoint/bootstrap/plugin/ClassEditorBuilderTest.java @@ -26,27 +26,25 @@ public class ClassEditorBuilderTest { Scope aScope = mock(Scope.class); ClassLoader classLoader = getClass().getClassLoader(); - String targetClassName = "com.nhn.pinpoint.bootstrap.plugin.Foo"; String methodName = "someMethod"; - String[] parameterTypes = new String[] { "java.lang.String" }; + Class[] parameterTypes = new Class[] { String.class }; + String[] parameterTypeNames = TypeUtils.toClassNames(parameterTypes); String scopeName = "test"; - byte[] classFileBuffer = BytecodeUtils.getClassFile(classLoader, targetClassName); - - when(instrumentor.getClass(classLoader, targetClassName, classFileBuffer)).thenReturn(aClass); + when(instrumentor.getScope(scopeName)).thenReturn(aScope); - when(aClass.getDeclaredMethod(methodName, parameterTypes)).thenReturn(aMethod); + when(aClass.getDeclaredMethod(methodName, parameterTypeNames)).thenReturn(aMethod); when(aMethod.getName()).thenReturn(methodName); - when(aMethod.getParameterTypes()).thenReturn(parameterTypes); - when(aClass.addInterceptor(eq(methodName), eq(parameterTypes), isA(Interceptor.class))).thenReturn(0); + when(aMethod.getParameterTypes()).thenReturn(parameterTypeNames); + when(aClass.addInterceptor(eq(methodName), eq(parameterTypeNames), isA(Interceptor.class))).thenReturn(0); ProfilerPluginContext helper = new ProfilerPluginContext(instrumentor, traceContext); - ClassEditorBuilder builder = helper.getClassEditorBuilderFor(targetClassName); - builder.intercept(methodName, parameterTypes).with("com.nhn.pinpoint.bootstrap.plugin.TestInterceptor").constructedWith("provided").in(scopeName); + ClassEditorBuilder builder = helper.newClassEditorBuilder(); + builder.intercept(methodName, parameterTypes).with(TestInterceptor.class).constructedWith("provided").in(scopeName); builder.inject(TestMetadata.class).initializeWithDefaultConstructorOf("java.util.HashMap"); ClassEditor editor = builder.build(); - editor.edit(classLoader, targetClassName, null, classFileBuffer); + editor.edit(classLoader, aClass); verify(aClass).addInterceptor(eq(methodName), isA(String[].class), isA(Interceptor.class)); verify(aClass).addTraceValue(TestMetadata.class, "new java.util.HashMap();"); diff --git a/bootstrap/src/test/java/com/navercorp/pinpoint/bootstrap/plugin/DefaultInterceptorFactoryTest.java b/bootstrap/src/test/java/com/navercorp/pinpoint/bootstrap/plugin/DefaultInterceptorFactoryTest.java index 668f266ba..a98795b82 100644 --- a/bootstrap/src/test/java/com/navercorp/pinpoint/bootstrap/plugin/DefaultInterceptorFactoryTest.java +++ b/bootstrap/src/test/java/com/navercorp/pinpoint/bootstrap/plugin/DefaultInterceptorFactoryTest.java @@ -16,6 +16,9 @@ import com.nhn.pinpoint.bootstrap.instrument.MethodInfo; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; import com.nhn.pinpoint.bootstrap.interceptor.MethodDescriptor; import com.nhn.pinpoint.bootstrap.interceptor.ParameterExtractor; +import com.nhn.pinpoint.bootstrap.plugin.TestInterceptors.TestInterceptor0; +import com.nhn.pinpoint.bootstrap.plugin.TestInterceptors.TestInterceptor1; +import com.nhn.pinpoint.bootstrap.plugin.TestInterceptors.TestInterceptor2; import com.nhn.pinpoint.exception.PinpointException; public class DefaultInterceptorFactoryTest { @@ -36,44 +39,39 @@ public class DefaultInterceptorFactoryTest { @Test public void test0() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor0"; - - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, null, null, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor0.class, null, null, null); Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); - assertEquals(interceptorClassName, interceptor.getClass().getName()); + assertEquals(TestInterceptor0.class, interceptor.getClass()); } @Test public void test1() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor0"; Object[] args = new Object[] { "arg0" }; - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, args, null, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor0.class, args, null, null); Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); - assertEquals(interceptorClassName, interceptor.getClass().getName()); + assertEquals(TestInterceptor0.class, interceptor.getClass()); assertEquals(args[0], getField(interceptor, "field0")); } @Test(expected = PinpointException.class) public void test2() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor0"; Object[] args = new Object[] { 1 }; - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, args, null, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor0.class, args, null, null); factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); } @Test public void test3() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor1"; Object[] args = new Object[] { "arg0", (byte)1, (short)2, (float)3.0 }; - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, args, null, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor1.class, args, null, null); Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); - assertEquals(interceptorClassName, interceptor.getClass().getName()); + assertEquals(TestInterceptor1.class, interceptor.getClass()); assertEquals(args[0], getField(interceptor, "field0")); assertEquals(args[1], getField(interceptor, "field1")); assertEquals(args[2], getField(interceptor, "field2")); @@ -82,13 +80,12 @@ public class DefaultInterceptorFactoryTest { @Test public void test4() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor1"; Object[] args = new Object[] { (byte)1, (short)2, (float)3.0, "arg0" }; - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, args, null, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor1.class, args, null, null); Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); - assertEquals(interceptorClassName, interceptor.getClass().getName()); + assertEquals(TestInterceptor1.class, interceptor.getClass()); assertEquals(args[3], getField(interceptor, "field0")); assertEquals(args[0], getField(interceptor, "field1")); assertEquals(args[1], getField(interceptor, "field2")); @@ -97,13 +94,12 @@ public class DefaultInterceptorFactoryTest { @Test public void test5() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor1"; Object[] args = new Object[] { (short)2, (float)3.0, "arg0", (byte)1 }; - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, args, null, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor1.class, args, null, null); Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); - assertEquals(interceptorClassName, interceptor.getClass().getName()); + assertEquals(TestInterceptor1.class, interceptor.getClass()); assertEquals(args[2], getField(interceptor, "field0")); assertEquals(args[3], getField(interceptor, "field1")); assertEquals(args[0], getField(interceptor, "field2")); @@ -112,13 +108,12 @@ public class DefaultInterceptorFactoryTest { @Test public void test6() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor1"; Object[] args = new Object[] { (float)3.0, (short)2, (byte)1, "arg0" }; - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, args, null, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor1.class, args, null, null); Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); - assertEquals(interceptorClassName, interceptor.getClass().getName()); + assertEquals(TestInterceptor1.class, interceptor.getClass()); assertEquals(args[3], getField(interceptor, "field0")); assertEquals(args[2], getField(interceptor, "field1")); assertEquals(args[1], getField(interceptor, "field2")); @@ -127,30 +122,26 @@ public class DefaultInterceptorFactoryTest { @Test(expected=PinpointException.class) public void test7() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor1"; Object[] args = new Object[] { (double)3.0, (short)2, (byte)1, "arg0" }; - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, args, null, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor1.class, args, null, null); factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); } @Test(expected=PinpointException.class) public void test8() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor1"; - - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, null, null, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor1.class, null, null, null); factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); } @Test public void test9() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor2"; Object[] args = new Object[] { "arg0", 1, 2.0, true, 3L }; - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, args, extractorFactory, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor2.class, args, extractorFactory, null); Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); - assertEquals(interceptorClassName, interceptor.getClass().getName()); + assertEquals(TestInterceptor2.class, interceptor.getClass()); assertEquals(args[0], getField(interceptor, "field0")); assertEquals(args[1], getField(interceptor, "field1")); assertEquals(args[2], getField(interceptor, "field2")); @@ -163,13 +154,12 @@ public class DefaultInterceptorFactoryTest { @Test public void test10() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor2"; Object[] args = new Object[] { "arg0", 1, 2.0 }; - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, args, extractorFactory, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor2.class, args, extractorFactory, null); Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); - assertEquals(interceptorClassName, interceptor.getClass().getName()); + assertEquals(TestInterceptor2.class, interceptor.getClass()); assertEquals(args[0], getField(interceptor, "field0")); assertEquals(args[1], getField(interceptor, "field1")); assertEquals(args[2], getField(interceptor, "field2")); @@ -182,13 +172,12 @@ public class DefaultInterceptorFactoryTest { @Test public void test11() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor2"; Object[] args = new Object[] { "arg0", 1 }; - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, args, extractorFactory, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor2.class, args, extractorFactory, null); Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); - assertEquals(interceptorClassName, interceptor.getClass().getName()); + assertEquals(TestInterceptor2.class, interceptor.getClass()); assertEquals(args[0], getField(interceptor, "field0")); assertEquals(args[1], getField(interceptor, "field1")); assertEquals(0.0, getField(interceptor, "field2")); @@ -201,12 +190,10 @@ public class DefaultInterceptorFactoryTest { @Test public void test12() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor2"; - - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, null, extractorFactory, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor2.class, null, extractorFactory, null); Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); - assertEquals(interceptorClassName, interceptor.getClass().getName()); + assertEquals(TestInterceptor2.class, interceptor.getClass()); assertEquals(null, getField(interceptor, "field0")); assertEquals(0, getField(interceptor, "field1")); assertEquals(0.0, getField(interceptor, "field2")); @@ -219,12 +206,10 @@ public class DefaultInterceptorFactoryTest { @Test public void test13() throws Exception { - String interceptorClassName = "com.nhn.pinpoint.bootstrap.plugin.TestInterceptors$TestInterceptor2"; - - DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, interceptorClassName, null, null, null); + DefaultInterceptorFactory factory = new DefaultInterceptorFactory(instrumentor, traceContext, TestInterceptor2.class, null, null, null); Interceptor interceptor = factory.getInterceptor(getClass().getClassLoader(), aClass, aMethod); - assertEquals(interceptorClassName, interceptor.getClass().getName()); + assertEquals(TestInterceptor2.class, interceptor.getClass()); assertEquals(null, getField(interceptor, "field0")); assertEquals(0, getField(interceptor, "field1")); assertEquals(0.0, getField(interceptor, "field2")); diff --git a/plugins/.gitignore b/plugins/.gitignore new file mode 100644 index 000000000..0c2b833ee --- /dev/null +++ b/plugins/.gitignore @@ -0,0 +1,2 @@ +/.settings/ +/.project diff --git a/plugins/arcus/.gitignore b/plugins/arcus/.gitignore new file mode 100644 index 000000000..8bd3a0588 --- /dev/null +++ b/plugins/arcus/.gitignore @@ -0,0 +1,4 @@ +/target/ +/.settings/ +/.classpath +/.project diff --git a/plugins/arcus/pom.xml b/plugins/arcus/pom.xml new file mode 100644 index 000000000..3c2cda10b --- /dev/null +++ b/plugins/arcus/pom.xml @@ -0,0 +1,101 @@ + + 4.0.0 + + com.nhn.pinpoint + pinpoint-plugins + 1.0.4-SNAPSHOT + + + pinpoint-arcus-plugin + pinpoint arcus plugin + jar + + + + com.nhn.pinpoint + pinpoint-bootstrap + + + com.nhn.pinpoint + pinpoint-test + test + + + arcus + arcus-client + provided + + + + + org.slf4j + slf4j-api + + + + org.slf4j + jcl-over-slf4j + test + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + compile + + + + + + + + ${basedir}/src/main/java + + **/*.java + + + + true + ${basedir}/src/main/resources + + + ${basedir}/src/main/resources-${env} + + + + + + ${basedir}/src/test/java + + **/*.java + + + + true + ${basedir}/src/test/resources + + + + + + org.apache.maven.plugins + maven-compiler-plugin + true + + true + + + + org.apache.maven.plugins + maven-jar-plugin + + ${pinpiont-plugin-dir} + + + + + diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/ArcusPlugin.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/ArcusPlugin.java new file mode 100644 index 000000000..daf8e8a97 --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/ArcusPlugin.java @@ -0,0 +1,46 @@ +package com.nhn.pinpoint.plugin.arcus; + +import java.util.ArrayList; +import java.util.List; + +import com.nhn.pinpoint.bootstrap.instrument.InstrumentClass; +import com.nhn.pinpoint.bootstrap.instrument.MethodInfo; +import com.nhn.pinpoint.bootstrap.interceptor.ParameterExtractor; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditor; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorBuilder; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorFactoryMapping; +import com.nhn.pinpoint.bootstrap.plugin.Condition; +import com.nhn.pinpoint.bootstrap.plugin.ParameterExtractorFactory; +import com.nhn.pinpoint.bootstrap.plugin.ProfilerPlugin; +import com.nhn.pinpoint.bootstrap.plugin.ProfilerPluginContext; + +// TODO split arcus plugin and memcached plugin +public class ArcusPlugin implements ProfilerPlugin { + @Override + public List getClassEditorMappings(ProfilerPluginContext context) { + boolean arcus = context.getConfig().isArucs(); + boolean memcached = context.getConfig().isMemcached(); + + List editors = new ArrayList(); + + if (arcus) { + editors.add(new ClassEditorFactoryMapping("net.spy.memcached.ArcusClient", "com.nhn.pinpoint.plugin.arcus.ArcusClientEditorFactory")); + editors.add(new ClassEditorFactoryMapping("net.spy.memcached.internal.CollectionFuture", "com.nhn.pinpoint.plugin.arcus.FutureEditorFactory")); + } + + if (arcus || memcached) { + editors.add(new ClassEditorFactoryMapping("net.spy.memcached.protocol.BaseOperationImpl", "com.nhn.pinpoint.plugin.arcus.BaseOperationImplEditorFactory")); + editors.add(new ClassEditorFactoryMapping("net.spy.memcached.CacheManager", "com.nhn.pinpoint.plugin.arcus.BaseCacheManagerEditorFactory")); + + editors.add(new ClassEditorFactoryMapping("net.spy.memcached.internal.GetFuture", "com.nhn.pinpoint.plugin.arcus.FutureEditorFactory")); + editors.add(new ClassEditorFactoryMapping("net.spy.memcached.internal.ImmediateFuture", "com.nhn.pinpoint.plugin.arcus.FutureEditorFactory")); + editors.add(new ClassEditorFactoryMapping("net.spy.memcached.internal.OperationFuture", "com.nhn.pinpoint.plugin.arcus.FutureEditorFactory")); + + editors.add(new ClassEditorFactoryMapping("net.spy.memcached.plugin.FrontCacheGetFuture", "com.nhn.pinpoint.plugin.arcus.FrontCacheGetFutureEditorFactory")); + editors.add(new ClassEditorFactoryMapping("net.spy.memcached.plugin.FrontCacheMemcachedClient", "com.nhn.pinpoint.plugin.arcus.FrontCacheMemcachedClientEditorFactory")); + editors.add(new ClassEditorFactoryMapping("net.spy.memcached.MemcachedClient", "com.nhn.pinpoint.plugin.arcus.MemcachedClientEditorFactory")); + } + + return editors; + } +} diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/Commons.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/Commons.java new file mode 100644 index 000000000..97da7a4c5 --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/Commons.java @@ -0,0 +1,26 @@ +package com.nhn.pinpoint.plugin.arcus; + +import com.nhn.pinpoint.bootstrap.instrument.InstrumentClass; +import com.nhn.pinpoint.bootstrap.instrument.MethodInfo; +import com.nhn.pinpoint.bootstrap.interceptor.ParameterExtractor; +import com.nhn.pinpoint.bootstrap.plugin.ParameterExtractorFactory; + +public abstract class Commons { + private Commons() {} + + public static final String ARCUS_SCOPE = "ArcusScope"; + + public static final ParameterExtractorFactory ARCUS_KEY_EXTRACTOR_FACTORY = new ParameterExtractorFactory() { + + @Override + public ParameterExtractor get(InstrumentClass targetClass, MethodInfo targetMethod) { + final int index = ParameterUtils.findFirstString(targetMethod, 3); + + if (index != -1) { + return new IndexParameterExtractor(index); + } + + return null; + } + }; +} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/IndexParameterExtractor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/IndexParameterExtractor.java similarity index 89% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/IndexParameterExtractor.java rename to plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/IndexParameterExtractor.java index dd2795153..71783211c 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/IndexParameterExtractor.java +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/IndexParameterExtractor.java @@ -1,4 +1,4 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; +package com.nhn.pinpoint.plugin.arcus; import com.nhn.pinpoint.bootstrap.interceptor.ParameterExtractor; diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ParameterUtils.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/ParameterUtils.java similarity index 91% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ParameterUtils.java rename to plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/ParameterUtils.java index 395fcc057..273503a3f 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ParameterUtils.java +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/ParameterUtils.java @@ -1,4 +1,4 @@ -package com.nhn.pinpoint.profiler.modifier.arcus; +package com.nhn.pinpoint.plugin.arcus; import com.nhn.pinpoint.bootstrap.instrument.MethodInfo; diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/CacheKeyAccessor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/CacheKeyAccessor.java new file mode 100644 index 000000000..49df52c25 --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/CacheKeyAccessor.java @@ -0,0 +1,8 @@ +package com.nhn.pinpoint.plugin.arcus.accessor; + +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.TraceValue; + +public interface CacheKeyAccessor extends TraceValue { + public String __getCacheKey(); + public void __setCacheKey(String cacheKey); +} diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/CacheNameAccessor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/CacheNameAccessor.java new file mode 100644 index 000000000..4fdb40b3b --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/CacheNameAccessor.java @@ -0,0 +1,8 @@ +package com.nhn.pinpoint.plugin.arcus.accessor; + +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.TraceValue; + +public interface CacheNameAccessor extends TraceValue { + public String __getCacheName(); + public void __setCacheName(String cacheName); +} diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/OperationAccessor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/OperationAccessor.java new file mode 100644 index 000000000..153271f3b --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/OperationAccessor.java @@ -0,0 +1,10 @@ +package com.nhn.pinpoint.plugin.arcus.accessor; + +import net.spy.memcached.ops.Operation; + +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.TraceValue; + +public interface OperationAccessor extends TraceValue { + public Operation __getOperation(); + public void __setOperation(Operation operation); +} diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/ServiceCodeAccessor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/ServiceCodeAccessor.java new file mode 100644 index 000000000..5dbf525c7 --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/accessor/ServiceCodeAccessor.java @@ -0,0 +1,8 @@ +package com.nhn.pinpoint.plugin.arcus.accessor; + +import com.nhn.pinpoint.bootstrap.interceptor.tracevalue.TraceValue; + +public interface ServiceCodeAccessor extends TraceValue { + public void __setServiceCode(String serviceCode); + public String __getServiceCode(); +} diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/ArcusClientEditorFactory.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/ArcusClientEditorFactory.java new file mode 100644 index 000000000..ee29e4825 --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/ArcusClientEditorFactory.java @@ -0,0 +1,41 @@ +package com.nhn.pinpoint.plugin.arcus.editor; + +import net.spy.memcached.CacheManager; + +import com.nhn.pinpoint.bootstrap.instrument.InstrumentClass; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditor; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorBuilder; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorFactory; +import com.nhn.pinpoint.bootstrap.plugin.Condition; +import com.nhn.pinpoint.bootstrap.plugin.ProfilerPluginContext; +import com.nhn.pinpoint.plugin.arcus.Commons; +import com.nhn.pinpoint.plugin.arcus.filter.ArcusMethodFilter; +import com.nhn.pinpoint.plugin.arcus.interceptor.ApiInterceptor; +import com.nhn.pinpoint.plugin.arcus.interceptor.SetCacheManagerInterceptor; + +public class ArcusClientEditorFactory implements ClassEditorFactory { + + @Override + public ClassEditor get(ProfilerPluginContext context) { + boolean traceArcusKey = context.getConfig().isArucsKeyTrace(); + ClassEditorBuilder builder = context.newClassEditorBuilder(); + + builder.editWhen(new Condition() { + + @Override + public boolean check(InstrumentClass target) { + return target.hasMethod("addOp", "(Ljava/lang/String;Lnet/spy/memcached/ops/OperationAccessor;)Lnet/spy/memcached/ops/OperationAccessor;"); + } + + }); + + builder.intercept("setCacheManager", CacheManager.class).with(SetCacheManagerInterceptor.class); + + builder.interceptMethodsFilteredBy(new ArcusMethodFilter()) + .with(ApiInterceptor.class) + .in(Commons.ARCUS_SCOPE) + .using(traceArcusKey ? Commons.ARCUS_KEY_EXTRACTOR_FACTORY : null); + + return builder.build(); + } +} diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/BaseCacheManagerEditorFactory.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/BaseCacheManagerEditorFactory.java new file mode 100644 index 000000000..21f572af3 --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/BaseCacheManagerEditorFactory.java @@ -0,0 +1,28 @@ +package com.nhn.pinpoint.plugin.arcus.editor; + +import java.util.concurrent.CountDownLatch; + +import net.spy.memcached.ConnectionFactoryBuilder; + +import com.nhn.pinpoint.bootstrap.plugin.ClassEditor; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorBuilder; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorFactory; +import com.nhn.pinpoint.bootstrap.plugin.ProfilerPluginContext; +import com.nhn.pinpoint.plugin.arcus.accessor.ServiceCodeAccessor; +import com.nhn.pinpoint.plugin.arcus.interceptor.CacheManagerConstructInterceptor; + +public class BaseCacheManagerEditorFactory implements ClassEditorFactory { + + @Override + public ClassEditor get(ProfilerPluginContext context) { + ClassEditorBuilder builder = context.newClassEditorBuilder(); + + builder.inject(ServiceCodeAccessor.class); + builder.interceptConstructor(String.class, String.class, ConnectionFactoryBuilder.class, CountDownLatch.class, int.class, int.class) + .with(CacheManagerConstructInterceptor.class); + + return builder.build(); + + } + +} diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/BaseOperationImplEditorFactory.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/BaseOperationImplEditorFactory.java new file mode 100644 index 000000000..141e5c155 --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/BaseOperationImplEditorFactory.java @@ -0,0 +1,19 @@ +package com.nhn.pinpoint.plugin.arcus.editor; + +import com.nhn.pinpoint.bootstrap.plugin.ClassEditor; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorBuilder; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorFactory; +import com.nhn.pinpoint.bootstrap.plugin.ProfilerPluginContext; +import com.nhn.pinpoint.plugin.arcus.accessor.ServiceCodeAccessor; + +public class BaseOperationImplEditorFactory implements ClassEditorFactory { + + @Override + public ClassEditor get(ProfilerPluginContext context) { + ClassEditorBuilder builder = context.newClassEditorBuilder(); + builder.inject(ServiceCodeAccessor.class); + + return builder.build(); + } + +} diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/FrontCacheGetFutureEditorFactory.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/FrontCacheGetFutureEditorFactory.java new file mode 100644 index 000000000..02145b6b8 --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/FrontCacheGetFutureEditorFactory.java @@ -0,0 +1,33 @@ +package com.nhn.pinpoint.plugin.arcus.editor; + +import java.util.concurrent.TimeUnit; + +import net.sf.ehcache.Element; + +import com.nhn.pinpoint.bootstrap.plugin.ClassEditor; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorBuilder; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorFactory; +import com.nhn.pinpoint.bootstrap.plugin.ProfilerPluginContext; +import com.nhn.pinpoint.plugin.arcus.Commons; +import com.nhn.pinpoint.plugin.arcus.accessor.CacheKeyAccessor; +import com.nhn.pinpoint.plugin.arcus.accessor.CacheNameAccessor; +import com.nhn.pinpoint.plugin.arcus.interceptor.FrontCacheGetFutureConstructInterceptor; +import com.nhn.pinpoint.plugin.arcus.interceptor.FrontCacheGetFutureGetInterceptor; + +public class FrontCacheGetFutureEditorFactory implements ClassEditorFactory { + + @Override + public ClassEditor get(ProfilerPluginContext context) { + ClassEditorBuilder builder = context.newClassEditorBuilder(); + + builder.inject(CacheNameAccessor.class); + builder.inject(CacheKeyAccessor.class); + + builder.interceptConstructor(Element.class).with(FrontCacheGetFutureConstructInterceptor.class); + builder.intercept("get", long.class, TimeUnit.class).with(FrontCacheGetFutureGetInterceptor.class).in(Commons.ARCUS_SCOPE); + builder.intercept("get").with(FrontCacheGetFutureGetInterceptor.class).in(Commons.ARCUS_SCOPE); + + return builder.build(); + } + +} diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/FrontCacheMemcachedClientEditorFactory.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/FrontCacheMemcachedClientEditorFactory.java new file mode 100644 index 000000000..4773c27e1 --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/FrontCacheMemcachedClientEditorFactory.java @@ -0,0 +1,40 @@ +package com.nhn.pinpoint.plugin.arcus.editor; + +import java.util.concurrent.Future; + +import com.nhn.pinpoint.bootstrap.instrument.InstrumentClass; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditor; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorBuilder; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorFactory; +import com.nhn.pinpoint.bootstrap.plugin.Condition; +import com.nhn.pinpoint.bootstrap.plugin.ProfilerPluginContext; +import com.nhn.pinpoint.bootstrap.plugin.TypeUtils; +import com.nhn.pinpoint.plugin.arcus.Commons; +import com.nhn.pinpoint.plugin.arcus.filter.FrontCacheMemcachedMethodFilter; +import com.nhn.pinpoint.plugin.arcus.interceptor.ApiInterceptor; + +public class FrontCacheMemcachedClientEditorFactory implements ClassEditorFactory { + + @Override + public ClassEditor get(ProfilerPluginContext context) { + boolean traceArcusKey = context.getConfig().isArucsKeyTrace(); + ClassEditorBuilder builder = context.newClassEditorBuilder(); + + builder.editWhen(new Condition() { + + @Override + public boolean check(InstrumentClass target) { + return target.hasDeclaredMethod("putFrontCache", TypeUtils.toClassNames(String.class, Future.class, long.class)); + } + + }); + + builder.interceptMethodsFilteredBy(new FrontCacheMemcachedMethodFilter()) + .with(ApiInterceptor.class) + .in(Commons.ARCUS_SCOPE) + .using(traceArcusKey ? Commons.ARCUS_KEY_EXTRACTOR_FACTORY : null); + + return builder.build(); + } + +} diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/FutureEditorFactory.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/FutureEditorFactory.java new file mode 100644 index 000000000..c5bd9f79e --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/FutureEditorFactory.java @@ -0,0 +1,29 @@ +package com.nhn.pinpoint.plugin.arcus.editor; + +import java.util.concurrent.TimeUnit; + +import com.nhn.pinpoint.bootstrap.plugin.ClassEditor; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorBuilder; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorFactory; +import com.nhn.pinpoint.bootstrap.plugin.ProfilerPluginContext; +import com.nhn.pinpoint.plugin.arcus.Commons; +import com.nhn.pinpoint.plugin.arcus.accessor.OperationAccessor; +import com.nhn.pinpoint.plugin.arcus.interceptor.FutureGetInterceptor; +import com.nhn.pinpoint.plugin.arcus.interceptor.FutureSetOperationInterceptor; + +public class FutureEditorFactory implements ClassEditorFactory { + + @Override + public ClassEditor get(ProfilerPluginContext context) { + ClassEditorBuilder builder = context.newClassEditorBuilder(); + + builder.inject(OperationAccessor.class); + + builder.intercept("setOperation", net.spy.memcached.ops.Operation.class).with(FutureSetOperationInterceptor.class); + + builder.intercept("get", long.class, TimeUnit.class).with(FutureGetInterceptor.class).in(Commons.ARCUS_SCOPE); + + return builder.build(); + } + +} diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/MemcachedClientEditorFactory.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/MemcachedClientEditorFactory.java new file mode 100644 index 000000000..16dc9978e --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/editor/MemcachedClientEditorFactory.java @@ -0,0 +1,47 @@ +package com.nhn.pinpoint.plugin.arcus.editor; + +import net.spy.memcached.ops.Operation; + +import com.nhn.pinpoint.bootstrap.instrument.InstrumentClass; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditor; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorBuilder; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorFactory; +import com.nhn.pinpoint.bootstrap.plugin.Condition; +import com.nhn.pinpoint.bootstrap.plugin.ProfilerPluginContext; +import com.nhn.pinpoint.bootstrap.plugin.TypeUtils; +import com.nhn.pinpoint.plugin.arcus.Commons; +import com.nhn.pinpoint.plugin.arcus.accessor.ServiceCodeAccessor; +import com.nhn.pinpoint.plugin.arcus.filter.MemcachedMethodFilter; +import com.nhn.pinpoint.plugin.arcus.interceptor.AddOpInterceptor; +import com.nhn.pinpoint.plugin.arcus.interceptor.ApiInterceptor; + +public class MemcachedClientEditorFactory implements ClassEditorFactory { + + @Override + public ClassEditor get(ProfilerPluginContext context) { + boolean traceArcusKey = context.getConfig().isArucsKeyTrace(); + ClassEditorBuilder builder = context.newClassEditorBuilder(); + + builder.editWhen(new Condition() { + + @Override + public boolean check(InstrumentClass target) { + return target.hasDeclaredMethod("addOp", TypeUtils.toClassNames(String.class, Operation.class)); + } + + }); + + + builder.inject(ServiceCodeAccessor.class); + + builder.intercept("addOp", String.class, Operation.class).with(AddOpInterceptor.class); + + builder.interceptMethodsFilteredBy(new MemcachedMethodFilter()) + .with(ApiInterceptor.class) + .in(Commons.ARCUS_SCOPE) + .using(traceArcusKey ? Commons.ARCUS_KEY_EXTRACTOR_FACTORY : null); + + return builder.build(); + } + +} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ArcusMethodFilter.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/filter/ArcusMethodFilter.java similarity index 97% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ArcusMethodFilter.java rename to plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/filter/ArcusMethodFilter.java index f144fadfb..b034fa67d 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ArcusMethodFilter.java +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/filter/ArcusMethodFilter.java @@ -1,4 +1,4 @@ -package com.nhn.pinpoint.profiler.modifier.arcus; +package com.nhn.pinpoint.plugin.arcus.filter; import java.lang.reflect.Modifier; import java.util.HashMap; diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedMethodFilter.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/filter/FrontCacheMemcachedMethodFilter.java similarity index 97% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedMethodFilter.java rename to plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/filter/FrontCacheMemcachedMethodFilter.java index 851f89801..96281240d 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheMemcachedMethodFilter.java +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/filter/FrontCacheMemcachedMethodFilter.java @@ -1,4 +1,4 @@ -package com.nhn.pinpoint.profiler.modifier.arcus; +package com.nhn.pinpoint.plugin.arcus.filter; import java.lang.reflect.Modifier; import java.util.HashMap; diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedMethodFilter.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/filter/MemcachedMethodFilter.java similarity index 97% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedMethodFilter.java rename to plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/filter/MemcachedMethodFilter.java index 495070ebd..3f8eea348 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/MemcachedMethodFilter.java +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/filter/MemcachedMethodFilter.java @@ -1,4 +1,4 @@ -package com.nhn.pinpoint.profiler.modifier.arcus; +package com.nhn.pinpoint.plugin.arcus.filter; import java.lang.reflect.Modifier; import java.util.HashMap; diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/AddOpInterceptor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/AddOpInterceptor.java similarity index 58% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/AddOpInterceptor.java rename to plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/AddOpInterceptor.java index c092e4d4a..dffec975e 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/AddOpInterceptor.java +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/AddOpInterceptor.java @@ -1,37 +1,29 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; +package com.nhn.pinpoint.plugin.arcus.interceptor; + import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; import com.nhn.pinpoint.bootstrap.logging.PLogger; - import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; -import net.spy.memcached.ops.Operation; - -import com.nhn.pinpoint.bootstrap.util.MetaObject; +import com.nhn.pinpoint.plugin.arcus.accessor.ServiceCodeAccessor; /** * * @author netspider * @author emeroad */ -public class AddOpInterceptor implements SimpleAroundInterceptor, TargetClassLoader { +public class AddOpInterceptor implements SimpleAroundInterceptor { private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); private final boolean isDebug = logger.isDebugEnabled(); - private MetaObject getServiceCode = new MetaObject("__getServiceCode"); - private MetaObject setServiceCode = new MetaObject("__setServiceCode", String.class); - @Override public void before(Object target, Object[] args) { if (isDebug) { logger.beforeInterceptor(target, args); } - String serviceCode = getServiceCode.invoke(target); - Operation op = (Operation) args[1]; - - setServiceCode.invoke(op, serviceCode); + String serviceCode = ((ServiceCodeAccessor)target).__getServiceCode(); + ((ServiceCodeAccessor)args[1]).__setServiceCode(serviceCode); } @Override diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/ApiInterceptor.java similarity index 73% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptor.java rename to plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/ApiInterceptor.java index 08942843b..da9be4fc8 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptor.java +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/ApiInterceptor.java @@ -1,30 +1,28 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; +package com.nhn.pinpoint.plugin.arcus.interceptor; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.concurrent.Future; -import com.nhn.pinpoint.bootstrap.context.RecordableTrace; -import com.nhn.pinpoint.bootstrap.interceptor.*; import net.spy.memcached.MemcachedNode; import net.spy.memcached.ops.Operation; +import com.nhn.pinpoint.bootstrap.context.RecordableTrace; +import com.nhn.pinpoint.bootstrap.interceptor.ParameterExtractor; +import com.nhn.pinpoint.bootstrap.interceptor.SpanEventSimpleAroundInterceptor; import com.nhn.pinpoint.common.ServiceType; -import com.nhn.pinpoint.bootstrap.util.MetaObject; +import com.nhn.pinpoint.plugin.arcus.accessor.OperationAccessor; +import com.nhn.pinpoint.plugin.arcus.accessor.ServiceCodeAccessor; /** * @author emeroad */ -public class ApiInterceptor extends SpanEventSimpleAroundInterceptor implements ParameterExtractorSupport, TargetClassLoader { +public class ApiInterceptor extends SpanEventSimpleAroundInterceptor { + private final ParameterExtractor parameterExtractor; - - private MetaObject getOperation = new MetaObject("__getOperation"); - private MetaObject getServiceCode = new MetaObject("__getServiceCode"); - - private ParameterExtractor parameterExtractor; - - public ApiInterceptor() { + public ApiInterceptor(ParameterExtractor parameterExtractor) { super(ApiInterceptor.class); + this.parameterExtractor = parameterExtractor; } @Override @@ -45,7 +43,8 @@ public class ApiInterceptor extends SpanEventSimpleAroundInterceptor implements // find the target node if (result instanceof Future) { - Operation op = (Operation) getOperation.invoke(((Future)result)); + Operation op = ((OperationAccessor)result).__getOperation(); + if (op != null) { MemcachedNode handlingNode = op.getHandlingNode(); SocketAddress socketAddress = handlingNode.getSocketAddress(); @@ -59,7 +58,8 @@ public class ApiInterceptor extends SpanEventSimpleAroundInterceptor implements } // determine the service type - String serviceCode = (String) getServiceCode.invoke(target); + String serviceCode = ((ServiceCodeAccessor)target).__getServiceCode(); + if (serviceCode != null) { trace.recordDestinationId(serviceCode); trace.recordServiceType(ServiceType.ARCUS); @@ -70,9 +70,4 @@ public class ApiInterceptor extends SpanEventSimpleAroundInterceptor implements trace.markAfterTime(); } - - @Override - public void setParameterExtractor(ParameterExtractor parameterExtractor) { - this.parameterExtractor = parameterExtractor; - } } diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/CacheManagerConstructInterceptor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/CacheManagerConstructInterceptor.java similarity index 56% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/CacheManagerConstructInterceptor.java rename to plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/CacheManagerConstructInterceptor.java index f8810b703..4c24f6c4f 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/CacheManagerConstructInterceptor.java +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/CacheManagerConstructInterceptor.java @@ -1,34 +1,26 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; +package com.nhn.pinpoint.plugin.arcus.interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; +import com.nhn.pinpoint.bootstrap.interceptor.SimpleAfterInterceptor; import com.nhn.pinpoint.bootstrap.logging.PLogger; - import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; -import com.nhn.pinpoint.bootstrap.util.MetaObject; +import com.nhn.pinpoint.plugin.arcus.accessor.ServiceCodeAccessor; /** * * @author netspider * @author emeroad */ -public class CacheManagerConstructInterceptor implements SimpleAroundInterceptor { +public class CacheManagerConstructInterceptor implements SimpleAfterInterceptor { private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); private final boolean isDebug = logger.isDebugEnabled(); - private MetaObject setServiceCode = new MetaObject("__setServiceCode", String.class); - - @Override - public void before(Object target, Object[] args) { - - } - @Override public void after(Object target, Object[] args, Object result, Throwable throwable) { if (isDebug) { logger.afterInterceptor(target, args, result, throwable); } - - setServiceCode.invoke(target, (String) args[1]); + + ((ServiceCodeAccessor)target).__setServiceCode((String) args[1]); } } diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java similarity index 59% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java rename to plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java index 35bf556da..ec5e417d6 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureConstructInterceptor.java @@ -1,15 +1,17 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; +package com.nhn.pinpoint.plugin.arcus.interceptor; -import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; +import net.sf.ehcache.Element; + +import com.nhn.pinpoint.bootstrap.interceptor.SimpleAfterInterceptor; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; -import com.nhn.pinpoint.bootstrap.util.MetaObject; -import net.sf.ehcache.Element; +import com.nhn.pinpoint.plugin.arcus.accessor.CacheKeyAccessor; +import com.nhn.pinpoint.plugin.arcus.accessor.CacheNameAccessor; /** * @author harebox */ -public class FrontCacheGetFutureConstructInterceptor implements SimpleAroundInterceptor { +public class FrontCacheGetFutureConstructInterceptor implements SimpleAfterInterceptor { private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); private final boolean isDebug = logger.isDebugEnabled(); @@ -17,14 +19,6 @@ public class FrontCacheGetFutureConstructInterceptor implements SimpleAroundInte // TODO This should be extracted from FrontCacheMemcachedClient. private static final String DEFAULT_FRONTCACHE_NAME = "front"; - private MetaObject setCacheName = new MetaObject("__setCacheName", String.class); - private MetaObject setCacheKey = new MetaObject("__setCacheKey", String.class); - - @Override - public void before(Object target, Object[] args) { - // do nothing. - } - @Override public void after(Object target, Object[] args, Object result, Throwable throwable) { if (isDebug) { @@ -32,11 +26,11 @@ public class FrontCacheGetFutureConstructInterceptor implements SimpleAroundInte } try { - setCacheName.invoke(target, DEFAULT_FRONTCACHE_NAME); - + ((CacheNameAccessor)target).__setCacheName(DEFAULT_FRONTCACHE_NAME); + if (args[0] instanceof Element) { Element element = (Element) args[0]; - setCacheKey.invoke(target, element.getObjectKey()); + ((CacheKeyAccessor)target).__setCacheKey((String)element.getObjectKey()); } } catch (Exception e) { logger.error("failed to add metadata: {}", e); diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java similarity index 67% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java rename to plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java index b82ee8c89..734f53860 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FrontCacheGetFutureGetInterceptor.java @@ -1,26 +1,29 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; +package com.nhn.pinpoint.plugin.arcus.interceptor; import com.nhn.pinpoint.bootstrap.context.Trace; import com.nhn.pinpoint.bootstrap.context.TraceContext; -import com.nhn.pinpoint.bootstrap.interceptor.*; +import com.nhn.pinpoint.bootstrap.interceptor.MethodDescriptor; +import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; import com.nhn.pinpoint.bootstrap.logging.PLogger; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; -import com.nhn.pinpoint.bootstrap.util.MetaObject; import com.nhn.pinpoint.common.ServiceType; +import com.nhn.pinpoint.plugin.arcus.accessor.CacheNameAccessor; /** * @author harebox */ -public class FrontCacheGetFutureGetInterceptor implements SimpleAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport, TargetClassLoader { +public class FrontCacheGetFutureGetInterceptor implements SimpleAroundInterceptor { private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); private final boolean isDebug = logger.isDebugEnabled(); - private MetaObject getCacheName = new MetaObject("__getCacheName"); - private MetaObject getCacheKey = new MetaObject("__getCacheKey"); - - private MethodDescriptor methodDescriptor; - private TraceContext traceContext; + private final MethodDescriptor methodDescriptor; + private final TraceContext traceContext; + + public FrontCacheGetFutureGetInterceptor(MethodDescriptor methodDescriptor, TraceContext traceContext) { + this.methodDescriptor = methodDescriptor; + this.traceContext = traceContext; + } @Override public void before(Object target, Object[] args) { @@ -56,7 +59,7 @@ public class FrontCacheGetFutureGetInterceptor implements SimpleAroundIntercepto // // annotate it. // } - String cacheName = (String) getCacheName.invoke(target); + String cacheName = ((CacheNameAccessor)target).__getCacheName(); if (cacheName != null) { trace.recordDestinationId(cacheName); } @@ -67,16 +70,4 @@ public class FrontCacheGetFutureGetInterceptor implements SimpleAroundIntercepto trace.traceBlockEnd(); } } - - @Override - public void setMethodDescriptor(MethodDescriptor descriptor) { - this.methodDescriptor = descriptor; - this.traceContext.cacheApi(descriptor); - } - - @Override - public void setTraceContext(TraceContext traceContext) { - this.traceContext = traceContext; - } - } diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FutureGetInterceptor.java similarity index 77% rename from profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptor.java rename to plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FutureGetInterceptor.java index 40eb3d889..a6fad3a93 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptor.java +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FutureGetInterceptor.java @@ -1,32 +1,40 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; +package com.nhn.pinpoint.plugin.arcus.interceptor; import java.net.InetSocketAddress; import java.net.SocketAddress; -import com.nhn.pinpoint.bootstrap.interceptor.*; -import com.nhn.pinpoint.bootstrap.logging.PLogger; -import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; import net.spy.memcached.MemcachedNode; import net.spy.memcached.ops.Operation; -import com.nhn.pinpoint.common.ServiceType; import com.nhn.pinpoint.bootstrap.context.Trace; import com.nhn.pinpoint.bootstrap.context.TraceContext; +import com.nhn.pinpoint.bootstrap.interceptor.ByteCodeMethodDescriptorSupport; +import com.nhn.pinpoint.bootstrap.interceptor.MethodDescriptor; +import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; +import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; +import com.nhn.pinpoint.bootstrap.interceptor.TraceContextSupport; +import com.nhn.pinpoint.bootstrap.logging.PLogger; +import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; import com.nhn.pinpoint.bootstrap.util.MetaObject; +import com.nhn.pinpoint.common.ServiceType; +import com.nhn.pinpoint.plugin.arcus.accessor.OperationAccessor; +import com.nhn.pinpoint.plugin.arcus.accessor.ServiceCodeAccessor; /** * @author emeroad */ -public class FutureGetInterceptor implements SimpleAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport, TargetClassLoader { +public class FutureGetInterceptor implements SimpleAroundInterceptor { private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); private final boolean isDebug = logger.isDebugEnabled(); - private MetaObject getOperation = new MetaObject("__getOperation"); - private MetaObject getServiceCode = new MetaObject("__getServiceCode"); + private final MethodDescriptor methodDescriptor; + private final TraceContext traceContext; - private MethodDescriptor methodDescriptor; - private TraceContext traceContext; + public FutureGetInterceptor(MethodDescriptor methodDescriptor, TraceContext traceContext) { + this.methodDescriptor = methodDescriptor; + this.traceContext = traceContext; + } @Override public void before(Object target, Object[] args) { @@ -61,7 +69,7 @@ public class FutureGetInterceptor implements SimpleAroundInterceptor, ByteCodeMe // trace.recordAttribute(AnnotationKey.ARCUS_COMMAND, annotation); // find the target node - final Operation op = (Operation) getOperation.invoke(target); + final Operation op = ((OperationAccessor)target).__getOperation(); if (op != null) { MemcachedNode handlingNode = op.getHandlingNode(); if (handlingNode != null) { @@ -78,7 +86,7 @@ public class FutureGetInterceptor implements SimpleAroundInterceptor, ByteCodeMe } // determine the service type - String serviceCode = (String) getServiceCode.invoke((Operation)op); + String serviceCode = ((ServiceCodeAccessor)op).__getServiceCode(); if (serviceCode != null) { trace.recordDestinationId(serviceCode); trace.recordServiceType(ServiceType.ARCUS_FUTURE_GET); @@ -100,16 +108,4 @@ public class FutureGetInterceptor implements SimpleAroundInterceptor, ByteCodeMe trace.traceBlockEnd(); } } - - @Override - public void setMethodDescriptor(MethodDescriptor descriptor) { - this.methodDescriptor = descriptor; - this.traceContext.cacheApi(descriptor); - } - - @Override - public void setTraceContext(TraceContext traceContext) { - this.traceContext = traceContext; - } - } diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FutureSetOperationInterceptor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FutureSetOperationInterceptor.java new file mode 100644 index 000000000..daf15e364 --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/FutureSetOperationInterceptor.java @@ -0,0 +1,28 @@ +package com.nhn.pinpoint.plugin.arcus.interceptor; + +import net.spy.memcached.ops.Operation; + +import com.nhn.pinpoint.bootstrap.interceptor.SimpleBeforeInterceptor; +import com.nhn.pinpoint.bootstrap.logging.PLogger; +import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; +import com.nhn.pinpoint.plugin.arcus.accessor.OperationAccessor; + + +/** + * @author harebox + * @author emeroad + */ +public class FutureSetOperationInterceptor implements SimpleBeforeInterceptor { + + private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); + private final boolean isDebug = logger.isDebugEnabled(); + + @Override + public void before(Object target, Object[] args) { + if (isDebug) { + logger.beforeInterceptor(target, args); + } + + ((OperationAccessor)target).__setOperation((Operation) args[0]); + } +} diff --git a/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/SetCacheManagerInterceptor.java b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/SetCacheManagerInterceptor.java new file mode 100644 index 000000000..a27630f98 --- /dev/null +++ b/plugins/arcus/src/main/java/com/nhn/pinpoint/plugin/arcus/interceptor/SetCacheManagerInterceptor.java @@ -0,0 +1,27 @@ +package com.nhn.pinpoint.plugin.arcus.interceptor; + +import com.nhn.pinpoint.bootstrap.interceptor.SimpleBeforeInterceptor; +import com.nhn.pinpoint.bootstrap.logging.PLogger; +import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; +import com.nhn.pinpoint.plugin.arcus.accessor.ServiceCodeAccessor; + +/** + * + * @author netspider + * @author emeroad + */ +public class SetCacheManagerInterceptor implements SimpleBeforeInterceptor { + + private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); + private final boolean isDebug = logger.isDebugEnabled(); + + @Override + public void before(Object target, Object[] args) { + if (isDebug) { + logger.beforeInterceptor(target, args); + } + + String serviceCode = ((ServiceCodeAccessor)args[0]).__getServiceCode(); + ((ServiceCodeAccessor)target).__setServiceCode(serviceCode); + } +} diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheGetFutureModifierIntegrationTest.java b/plugins/arcus/src/test/java/com/nhn/pinpoint/profiler/modifier/arcus/FrontCacheGetFutureModifierIntegrationTest.java similarity index 100% rename from profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/arcus/FrontCacheGetFutureModifierIntegrationTest.java rename to plugins/arcus/src/test/java/com/nhn/pinpoint/profiler/modifier/arcus/FrontCacheGetFutureModifierIntegrationTest.java diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptorTest.java b/plugins/arcus/src/test/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptorTest.java similarity index 83% rename from profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptorTest.java rename to plugins/arcus/src/test/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptorTest.java index 14265d720..eb02d627c 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptorTest.java +++ b/plugins/arcus/src/test/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/ApiInterceptorTest.java @@ -1,6 +1,6 @@ package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; -import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.*; import java.io.IOException; import java.net.InetSocketAddress; @@ -11,18 +11,20 @@ import net.spy.memcached.MemcachedClient; import org.junit.Before; import org.junit.Test; - -import com.nhn.pinpoint.profiler.interceptor.DefaultMethodDescriptor; -import com.nhn.pinpoint.bootstrap.interceptor.MethodDescriptor; -import com.nhn.pinpoint.profiler.modifier.BaseInterceptorTest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.nhn.pinpoint.bootstrap.interceptor.MethodDescriptor; +import com.nhn.pinpoint.plugin.arcus.IndexParameterExtractor; +import com.nhn.pinpoint.plugin.arcus.interceptor.ApiInterceptor; +import com.nhn.pinpoint.profiler.interceptor.DefaultMethodDescriptor; +import com.nhn.pinpoint.test.interceptor.BaseInterceptorTest; + public class ApiInterceptorTest extends BaseInterceptorTest { static final Logger logger = LoggerFactory.getLogger(ApiInterceptorTest.class); - ApiInterceptor interceptor = new ApiInterceptor(); + ApiInterceptor interceptor = new ApiInterceptor(new IndexParameterExtractor(0)); MemcachedClient client = mock(MockMemcachedClient.class); @Before diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptorTest.java b/plugins/arcus/src/test/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptorTest.java similarity index 100% rename from profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptorTest.java rename to plugins/arcus/src/test/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptorTest.java diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptorTest.java b/plugins/arcus/src/test/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptorTest.java similarity index 82% rename from profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptorTest.java rename to plugins/arcus/src/test/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptorTest.java index eb029034a..1cf2750d3 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptorTest.java +++ b/plugins/arcus/src/test/java/com/nhn/pinpoint/profiler/modifier/arcus/interceptor/FutureGetInterceptorTest.java @@ -1,8 +1,7 @@ package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; import java.io.IOException; import java.net.InetSocketAddress; @@ -24,16 +23,18 @@ import net.spy.memcached.protocol.ascii.AsciiMemcachedNodeImpl; import org.junit.Before; import org.junit.Test; - -import com.nhn.pinpoint.profiler.modifier.BaseInterceptorTest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.nhn.pinpoint.plugin.arcus.interceptor.FutureGetInterceptor; +import com.nhn.pinpoint.test.interceptor.BaseInterceptorTest; +import com.nhn.pinpoint.test.mock.MockTraceContextFactory; + public class FutureGetInterceptorTest extends BaseInterceptorTest { private final Logger logger = LoggerFactory.getLogger(FutureGetInterceptorTest.class); - FutureGetInterceptor interceptor = new FutureGetInterceptor(); + FutureGetInterceptor interceptor = new FutureGetInterceptor(null, new MockTraceContextFactory().create()); @Before public void beforeEach() { @@ -42,26 +43,22 @@ public class FutureGetInterceptorTest extends BaseInterceptorTest { } @Test - public void testSuccessful() { + public void testSuccessful() throws IOException { Long timeout = 1000L; TimeUnit unit = TimeUnit.MILLISECONDS; MockOperationFuture future = mock(MockOperationFuture.class); MockOperation operation = mock(MockOperation.class); - try { - when(operation.getException()).thenReturn(null); - when(operation.isCancelled()).thenReturn(false); - when(future.__getOperation()).thenReturn(operation); + when(operation.getException()).thenReturn(null); + when(operation.isCancelled()).thenReturn(false); + when(future.__getOperation()).thenReturn(operation); - MemcachedNode node = getMockMemcachedNode(); - when(operation.getHandlingNode()).thenReturn(node); - - interceptor.before(future, new Object[] { timeout, unit }); - interceptor.after(future, new Object[] { timeout, unit }, null, null); - } catch (Exception e) { - fail(e.getMessage()); - } + MemcachedNode node = getMockMemcachedNode(); + when(operation.getHandlingNode()).thenReturn(node); + + interceptor.before(future, new Object[] { timeout, unit }); + interceptor.after(future, new Object[] { timeout, unit }, null, null); } private MemcachedNode getMockMemcachedNode() throws IOException { diff --git a/plugins/pom.xml b/plugins/pom.xml new file mode 100644 index 000000000..103d548b0 --- /dev/null +++ b/plugins/pom.xml @@ -0,0 +1,22 @@ + + 4.0.0 + + com.nhn.pinpoint + pom + 1.0.4-SNAPSHOT + + + pinpoint-plugins + pinpoint-plugins + pom + + + arcus + + + + + + + diff --git a/pom.xml b/pom.xml index 91ff6ff33..5a8b2cc3c 100644 --- a/pom.xml +++ b/pom.xml @@ -138,6 +138,11 @@ classes ${project.version} + + com.nhn.pinpoint + pinpoint-test + ${project.version} + org.springframework diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/ClassFileTransformerDispatcher.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/ClassFileTransformerDispatcher.java index ae4427e4d..4648533e1 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/ClassFileTransformerDispatcher.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/ClassFileTransformerDispatcher.java @@ -9,11 +9,10 @@ import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.config.ProfilerConfig; import com.nhn.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.nhn.pinpoint.bootstrap.plugin.ClassEditor; -import com.nhn.pinpoint.bootstrap.plugin.DedicatedClassEditor; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorFactoryMapping; +import com.nhn.pinpoint.bootstrap.plugin.PluginClassLoaderFactory; import com.nhn.pinpoint.bootstrap.plugin.ProfilerPlugin; import com.nhn.pinpoint.bootstrap.plugin.ProfilerPluginContext; import com.nhn.pinpoint.profiler.modifier.AbstractModifier; @@ -131,9 +130,6 @@ public class ClassFileTransformerDispatcher implements ClassFileTransformer { // rpc modifierRepository.addConnectorModifier(); - // arcus, memcached - modifierRepository.addArcusModifier(); - // bloc 3.x modifierRepository.addBLOC3Modifier(); @@ -168,14 +164,15 @@ public class ClassFileTransformerDispatcher implements ClassFileTransformer { } private void loadPlugins(DefaultModifierRegistry modifierRepository) { + String pluginPath = agent.getAgentPath() + File.separatorChar + "plugin"; + PluginLoader loader = PluginLoader.get(pluginPath); + PluginClassLoaderFactory classLoaderFactory = new PluginClassLoaderFactory(loader.getPluginJars()); + List plugins = loader.loadPlugins(); ProfilerPluginContext pluginContext = new ProfilerPluginContext(byteCodeInstrumentor, agent.getTraceContext()); - List plugins = new PluginLoader().load(agent.getAgentPath() + File.separatorChar + "plugin"); for (ProfilerPlugin plugin : plugins) { - for (ClassEditor editor : plugin.getClassEditors(pluginContext)) { - if (editor instanceof DedicatedClassEditor) { - modifierRepository.addModifier(new ClassEditorAdaptor(byteCodeInstrumentor, agent, (DedicatedClassEditor)editor)); - } + for (ClassEditorFactoryMapping mapping : plugin.getClassEditorMappings(pluginContext)) { + modifierRepository.addModifier(new ClassEditorAdaptor(byteCodeInstrumentor, agent, mapping, pluginContext, classLoaderFactory)); } } } diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/DefaultAgent.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/DefaultAgent.java index 38c380749..bae81deda 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/DefaultAgent.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/DefaultAgent.java @@ -28,7 +28,6 @@ import com.nhn.pinpoint.profiler.context.storage.SpanStorageFactory; import com.nhn.pinpoint.profiler.context.storage.StorageFactory; import com.nhn.pinpoint.profiler.interceptor.bci.JavaAssistByteCodeInstrumentor; import com.nhn.pinpoint.profiler.logging.Slf4jLoggerBinder; -import com.nhn.pinpoint.profiler.modifier.arcus.ArcusMethodFilter; import com.nhn.pinpoint.profiler.monitor.AgentStatMonitor; import com.nhn.pinpoint.profiler.receiver.CommandDispatcher; import com.nhn.pinpoint.profiler.sampler.SamplerFactory; @@ -159,7 +158,6 @@ public class DefaultAgent implements Agent { } private void preLoadClass() { - logger.debug("preLoadClass:{}", new ArcusMethodFilter().getClass().getName()); logger.debug("preLoadClass:{}", PreparedStatementUtils.class.getName(), PreparedStatementUtils.findBindVariableSetMethod()); } 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 abb00a1ba..3d2b95514 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 @@ -1,22 +1,12 @@ package com.nhn.pinpoint.profiler.modifier; import java.util.HashMap; -import java.util.List; import java.util.Map; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.config.ProfilerConfig; import com.nhn.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.nhn.pinpoint.bootstrap.plugin.ProfilerPlugin; import com.nhn.pinpoint.profiler.ClassFileRetransformer; -import com.nhn.pinpoint.profiler.modifier.arcus.ArcusClientModifier; -import com.nhn.pinpoint.profiler.modifier.arcus.BaseOperationModifier; -import com.nhn.pinpoint.profiler.modifier.arcus.CacheManagerModifier; -import com.nhn.pinpoint.profiler.modifier.arcus.CollectionFutureModifier; -import com.nhn.pinpoint.profiler.modifier.arcus.GetFutureModifier; -import com.nhn.pinpoint.profiler.modifier.arcus.ImmediateFutureModifier; -import com.nhn.pinpoint.profiler.modifier.arcus.MemcachedClientModifier; -import com.nhn.pinpoint.profiler.modifier.arcus.OperationFutureModifier; import com.nhn.pinpoint.profiler.modifier.bloc.handler.HTTPHandlerModifier; import com.nhn.pinpoint.profiler.modifier.bloc4.NettyInboundHandlerModifier; import com.nhn.pinpoint.profiler.modifier.bloc4.NpcHandlerModifier; @@ -153,57 +143,6 @@ public class DefaultModifierRegistry implements ModifierRegistry { addModifier(new DefaultHttpRequestRetryHandlerModifier(byteCodeInstrumentor, agent)); } - public void addArcusModifier() { - final boolean arcus = profilerConfig.isArucs(); - boolean memcached; - if (arcus) { - // arcus가 true일 경우 memcached는 자동으로 true가 되야 한다. - memcached = true; - } else { - memcached = profilerConfig.isMemcached(); - } - - if (memcached) { - BaseOperationModifier baseOperationModifier = new BaseOperationModifier(byteCodeInstrumentor, agent); - addModifier(baseOperationModifier); - - MemcachedClientModifier memcachedClientModifier = new MemcachedClientModifier(byteCodeInstrumentor, agent); - addModifier(memcachedClientModifier); - -// FrontCacheMemcachedClientModifier frontCacheMemcachedClientModifier = new FrontCacheMemcachedClientModifier(byteCodeInstrumentor, agent); -// 관련 수정에 사이드 이펙트가 있이서 일단 disable함. -// addModifier(frontCacheMemcachedClientModifier); - - if (arcus) { - ArcusClientModifier arcusClientModifier = new ArcusClientModifier(byteCodeInstrumentor, agent); - addModifier(arcusClientModifier); - // arcus의 Future임 - CollectionFutureModifier collectionFutureModifier = new CollectionFutureModifier(byteCodeInstrumentor, agent); - addModifier(collectionFutureModifier); - } - - // future modifier start --------------------------------------------------- - - GetFutureModifier getFutureModifier = new GetFutureModifier(byteCodeInstrumentor, agent); - addModifier(getFutureModifier); - - ImmediateFutureModifier immediateFutureModifier = new ImmediateFutureModifier(byteCodeInstrumentor, agent); - addModifier(immediateFutureModifier); - - OperationFutureModifier operationFutureModifier = new OperationFutureModifier(byteCodeInstrumentor, agent); - addModifier(operationFutureModifier); - -// FrontCacheGetFutureModifier frontCacheGetFutureModifier = new FrontCacheGetFutureModifier(byteCodeInstrumentor, agent); - // 관련 수정에 사이드 이펙트가 있이서 일단 disable함. -// addModifier(frontCacheGetFutureModifier); - - // future modifier end --------------------------------------------------- - - CacheManagerModifier cacheManagerModifier = new CacheManagerModifier(byteCodeInstrumentor, agent); - addModifier(cacheManagerModifier); - } - } - /** * BLOC 3.x */ diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/CollectionFutureModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/CollectionFutureModifier.java deleted file mode 100644 index 66a958e16..000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/CollectionFutureModifier.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.nhn.pinpoint.profiler.modifier.arcus; - -import com.nhn.pinpoint.bootstrap.Agent; -import com.nhn.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; - -import org.slf4j.LoggerFactory; - -/** - * @author emeroad - */ -public class CollectionFutureModifier extends AbstractFutureModifier { - - public CollectionFutureModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - this.logger = LoggerFactory.getLogger(this.getClass()); - } - - @Override - public String getTargetClass() { - return "net/spy/memcached/internal/CollectionFuture"; - - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/GetFutureModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/GetFutureModifier.java deleted file mode 100644 index 1d03e4dba..000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/GetFutureModifier.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.nhn.pinpoint.profiler.modifier.arcus; - -import com.nhn.pinpoint.bootstrap.Agent; -import com.nhn.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; - -import org.slf4j.LoggerFactory; - -/** - * @author emeroad - */ -public class GetFutureModifier extends AbstractFutureModifier { - - public GetFutureModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - this.logger = LoggerFactory.getLogger(this.getClass()); - } - - @Override - public String getTargetClass() { - return "net/spy/memcached/internal/GetFuture"; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ImmediateFutureModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ImmediateFutureModifier.java deleted file mode 100644 index fe3a390a7..000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/ImmediateFutureModifier.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.nhn.pinpoint.profiler.modifier.arcus; - -import com.nhn.pinpoint.bootstrap.Agent; -import com.nhn.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; - -import org.slf4j.LoggerFactory; - -/** - * @author emeroad - */ -public class ImmediateFutureModifier extends AbstractFutureModifier { - - public ImmediateFutureModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - this.logger = LoggerFactory.getLogger(this.getClass()); - } - - @Override - public String getTargetClass() { - return "net/spy/memcached/internal/ImmediateFuture"; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/OperationFutureModifier.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/OperationFutureModifier.java deleted file mode 100644 index bb56ea931..000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/OperationFutureModifier.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.nhn.pinpoint.profiler.modifier.arcus; - -import com.nhn.pinpoint.bootstrap.Agent; -import com.nhn.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; - -import org.slf4j.LoggerFactory; - -/** - * @author emeroad - */ -public class OperationFutureModifier extends AbstractFutureModifier { - - - public OperationFutureModifier(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent) { - super(byteCodeInstrumentor, agent); - this.logger = LoggerFactory.getLogger(this.getClass()); - } - - @Override - public String getTargetClass() { - return "net/spy/memcached/internal/OperationFuture"; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/SpyVersion.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/SpyVersion.java deleted file mode 100644 index 5fd77b738..000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/SpyVersion.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.nhn.pinpoint.profiler.modifier.arcus; - -import com.nhn.pinpoint.bootstrap.instrument.InstrumentClass; - -public enum SpyVersion { - - SPYMEMCACHED_2_11, - ARCUSCLIENT_1_6, - ERROR - ; - - public SpyVersion identifyWithMemcachedConnection(InstrumentClass aClass) { - String className = aClass.getName(); - if (! "net/spy/memcached/MemcachedConnection".equals(className)) { - return ERROR; - } - - String[] createConnectionArgs = {"java.util.Collection"}; - boolean isSpy = aClass.hasDeclaredMethod("createConnection", createConnectionArgs); - - if (isSpy) { - return SPYMEMCACHED_2_11; - } else { - return ARCUSCLIENT_1_6; - } - } - - public SpyVersion identifyWithMemcachedClient(InstrumentClass aClass) { - String className = aClass.getName(); - if (! "net/spy/memcached/MemcachedClient".equals(className)) { - return ERROR; - } - - String[] addOpArgs = {"java.lang.String", "net.spy.memcached.ops.Operation"}; - boolean isArcus = aClass.hasDeclaredMethod("addOp", addOpArgs); - - return SPYMEMCACHED_2_11; - } - -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ArcusScope.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ArcusScope.java deleted file mode 100644 index bffbcf3d4..000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/ArcusScope.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; - -import com.nhn.pinpoint.profiler.util.DepthScope; - -/** - * @author emeroad - */ -public class ArcusScope { - public static final DepthScope SCOPE = new DepthScope("ArcusScope"); -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationCancelInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationCancelInterceptor.java deleted file mode 100644 index e0b0f6774..000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationCancelInterceptor.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; - -import com.nhn.pinpoint.bootstrap.context.AsyncTrace; -import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.nhn.pinpoint.bootstrap.logging.PLogger; - -import com.nhn.pinpoint.profiler.context.DefaultAsyncTrace; -import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; -import com.nhn.pinpoint.bootstrap.util.TimeObject; -import net.spy.memcached.protocol.BaseOperationImpl; - -import com.nhn.pinpoint.bootstrap.util.MetaObject; - -/** - * @author emeroad - */ -@Deprecated -public class BaseOperationCancelInterceptor implements SimpleAroundInterceptor { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private MetaObject getAsyncTrace = new MetaObject("__getAsyncTrace"); - - @Override - public void before(Object target, Object[] args) { - if (isDebug) { - logger.beforeInterceptor(target, args); - } - - AsyncTrace asyncTrace = (AsyncTrace) getAsyncTrace.invoke(target); - if (asyncTrace == null) { - logger.debug("asyncTrace not found "); - return; - } - - if (asyncTrace.getState() != DefaultAsyncTrace.STATE_INIT) { - // 이미 동작 완료된 상태임. - return; - } - - BaseOperationImpl baseOperation = (BaseOperationImpl) target; - if (!baseOperation.isCancelled()) { - TimeObject timeObject = (TimeObject) asyncTrace.getAttachObject(); - timeObject.markCancelTime(); - } - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationConstructInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationConstructInterceptor.java deleted file mode 100644 index 0a3732642..000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationConstructInterceptor.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; - -import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.nhn.pinpoint.bootstrap.logging.PLogger; - -import com.nhn.pinpoint.bootstrap.context.Trace; -import com.nhn.pinpoint.bootstrap.context.TraceContext; -import com.nhn.pinpoint.bootstrap.interceptor.TraceContextSupport; -import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; -import com.nhn.pinpoint.bootstrap.util.MetaObject; - - -/** - * @author emeroad - */ -@Deprecated -public class BaseOperationConstructInterceptor implements SimpleAroundInterceptor, TraceContextSupport { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private MetaObject setAsyncTrace = new MetaObject("__setAsyncTrace", Object.class); - private TraceContext traceContext; - - @Override - public void before(Object target, Object[] args) { - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - if (isDebug) { - logger.afterInterceptor(target, args, result, throwable); - } - - Trace trace = traceContext.currentTraceObject(); - - if (trace == null) { - return; - } - - // 일단 이벤트가 세지 않는다는 가정하에 별도 timeout처리가 없음. -// AsyncTrace asyncTrace = trace.createAsyncTrace(); -// asyncTrace.markBeforeTime(); -// -// asyncTrace.setAttachObject(new TimeObject()); -// -// setAsyncTrace.invoke(target, asyncTrace); - } - - @Override - public void setTraceContext(TraceContext traceContext) { - - this.traceContext = traceContext; - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptor.java deleted file mode 100644 index 7e774658f..000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/BaseOperationTransitionStateInterceptor.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; - -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; - -import com.nhn.pinpoint.bootstrap.interceptor.ByteCodeMethodDescriptorSupport; -import com.nhn.pinpoint.bootstrap.interceptor.MethodDescriptor; -import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.nhn.pinpoint.bootstrap.interceptor.TraceContextSupport; -import com.nhn.pinpoint.bootstrap.logging.PLogger; - -import com.nhn.pinpoint.common.AnnotationKey; -import com.nhn.pinpoint.bootstrap.context.AsyncTrace; -import com.nhn.pinpoint.bootstrap.context.TraceContext; -import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; -import com.nhn.pinpoint.bootstrap.util.TimeObject; -import net.spy.memcached.MemcachedNode; -import net.spy.memcached.ops.OperationState; -import net.spy.memcached.protocol.BaseOperationImpl; - -import com.nhn.pinpoint.common.ServiceType; -import com.nhn.pinpoint.bootstrap.util.MetaObject; - -/** - * @author emeroad - */ -@Deprecated -public class BaseOperationTransitionStateInterceptor implements SimpleAroundInterceptor, ByteCodeMethodDescriptorSupport, TraceContextSupport { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private static final Charset UTF8 = Charset.forName("UTF-8"); - - private MetaObject getAsyncTrace = new MetaObject("__getAsyncTrace"); - private MetaObject getServiceCode = new MetaObject("__getServiceCode"); - - private MethodDescriptor methodDescriptor; - private TraceContext traceContext; - - @Override - public void before(Object target, Object[] args) { - if (isDebug) { - logger.beforeInterceptor(target, args); - } - - AsyncTrace asyncTrace = (AsyncTrace) getAsyncTrace.invoke(target); - if (asyncTrace == null) { - if (isDebug) { - logger.debug("asyncTrace not found"); - } - return; - } - // TODO null 체크가 필요하지 않나하는데? 일단 사용하지 않는 interceptor이므로 TODO만 붙여 둔다. - OperationState newState = (OperationState) args[0]; - - BaseOperationImpl baseOperation = (BaseOperationImpl) target; - if (newState == OperationState.READING) { - if (isDebug) { - logger.debug("event:{} asyncTrace:{}", newState, asyncTrace); - } - if (asyncTrace.getState() != AsyncTrace.STATE_INIT) { - return; - } - MemcachedNode handlingNode = baseOperation.getHandlingNode(); - SocketAddress socketAddress = handlingNode.getSocketAddress(); - if (socketAddress instanceof InetSocketAddress) { - InetSocketAddress address = (InetSocketAddress) socketAddress; - asyncTrace.recordEndPoint(address.getHostName() + ":" + address.getPort()); - } - - String serviceCode = (String) getServiceCode.invoke(target); - - if (serviceCode == null) { - serviceCode = "UNKNOWN"; - } - - ServiceType svcType = ServiceType.ARCUS; - - if(serviceCode.equals(ServiceType.MEMCACHED.getDesc())) { - svcType = ServiceType.MEMCACHED; - } - - asyncTrace.recordServiceType(svcType); -// asyncTrace.recordRpcName(baseOperation.getClass().getSimpleName()); - asyncTrace.recordApi(methodDescriptor); - - asyncTrace.recordDestinationId(serviceCode); - - String cmd = getCommand(baseOperation); -// asyncTrace.recordAttribute(AnnotationKey.ARCUS_COMMAND, cmd); - - // TimeObject timeObject = (TimeObject) - // asyncTrace.getFrameObject(); - // timeObject.markSendTime(); - - // long createTime = asyncTrace.getBeforeTime(); - asyncTrace.markAfterTime(); -// asyncTrace.traceBlockEnd(); - } else if (newState == OperationState.COMPLETE || isArcusTimeout(newState)) { - if (isDebug) { - logger.debug("event:{} asyncTrace:{}", newState, asyncTrace); - } - boolean fire = asyncTrace.fire(); - if (!fire) { - return; - } - Exception exception = baseOperation.getException(); - asyncTrace.recordException(exception); - - if (!baseOperation.isCancelled()) { - TimeObject timeObject = (TimeObject) asyncTrace.getAttachObject(); - // asyncTrace.record(Annotation.ClientRecv, timeObject.getSendTime()); - asyncTrace.markAfterTime(); - asyncTrace.traceBlockEnd(); - } else { - asyncTrace.recordAttribute(AnnotationKey.EXCEPTION, "cancelled by user"); - TimeObject timeObject = (TimeObject) asyncTrace.getAttachObject(); - // asyncTrace.record(Annotation.ClientRecv, timeObject.getCancelTime()); - asyncTrace.markAfterTime(); - asyncTrace.traceBlockEnd(); - } - } - } - - private boolean isArcusTimeout(OperationState newState) { - if (newState == null) { - return false; - } - // arcus에만 추가된 타입이라. 따로 처리함. - return "TIMEDOUT".equals(newState.toString()); - } - - private String getCommand(BaseOperationImpl baseOperation) { - ByteBuffer buffer = baseOperation.getBuffer(); - if (buffer == null) { - return "UNKNOWN"; - } - // System.out.println(buffer.array().length + " po:" + buffer.position() - // + " limit:" + buffer.limit() + " remaining" - // + buffer.remaining() + " aoffset:" + buffer.arrayOffset()); - return new String(buffer.array(), UTF8); - } - - @Override - public void setMethodDescriptor(MethodDescriptor descriptor) { - this.methodDescriptor = descriptor; - this.traceContext.cacheApi(descriptor); - } - - @Override - public void setTraceContext(TraceContext traceContext) { - this.traceContext = traceContext; - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureSetOperationInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureSetOperationInterceptor.java deleted file mode 100644 index 85c2d9b62..000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/FutureSetOperationInterceptor.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; - -import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.logging.PLogger; -import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; -import net.spy.memcached.ops.Operation; - -import com.nhn.pinpoint.bootstrap.util.MetaObject; - - -/** - * @author harebox - * @author emeroad - */ -public class FutureSetOperationInterceptor implements SimpleAroundInterceptor, TargetClassLoader { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private MetaObject setOperation = new MetaObject("__setOperation", Operation.class); - - - @Override - public void before(Object target, Object[] args) { - if (isDebug) { - logger.beforeInterceptor(target, args); - } - - setOperation.invoke(target, (Operation) args[0]); - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/SetCacheManagerInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/SetCacheManagerInterceptor.java deleted file mode 100644 index 6711b525e..000000000 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/arcus/interceptor/SetCacheManagerInterceptor.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.nhn.pinpoint.profiler.modifier.arcus.interceptor; - -import com.nhn.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor; -import com.nhn.pinpoint.bootstrap.interceptor.TargetClassLoader; -import com.nhn.pinpoint.bootstrap.logging.PLogger; - -import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; -import net.spy.memcached.CacheManager; -import net.spy.memcached.MemcachedClient; - - -import com.nhn.pinpoint.bootstrap.util.MetaObject; - -/** - * - * @author netspider - * @author emeroad - */ -public class SetCacheManagerInterceptor implements SimpleAroundInterceptor, TargetClassLoader { - - private final PLogger logger = PLoggerFactory.getLogger(this.getClass()); - private final boolean isDebug = logger.isDebugEnabled(); - - private MetaObject getServiceCode = new MetaObject("__getServiceCode"); - private MetaObject setServiceCode = new MetaObject("__setServiceCode", String.class); - - @Override - public void before(Object target, Object[] args) { - if (isDebug) { - logger.beforeInterceptor(target, args); - } - - CacheManager cm = (CacheManager) args[0]; - String serviceCode = getServiceCode.invoke(cm); - - setServiceCode.invoke((MemcachedClient) target, serviceCode); - } - - @Override - public void after(Object target, Object[] args, Object result, Throwable throwable) { - - } -} diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/plugin/ClassEditorAdaptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/plugin/ClassEditorAdaptor.java index 5fe142385..59d12eb1d 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/plugin/ClassEditorAdaptor.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/plugin/ClassEditorAdaptor.java @@ -4,24 +4,58 @@ import java.security.ProtectionDomain; import com.nhn.pinpoint.bootstrap.Agent; import com.nhn.pinpoint.bootstrap.instrument.ByteCodeInstrumentor; -import com.nhn.pinpoint.bootstrap.plugin.DedicatedClassEditor; +import com.nhn.pinpoint.bootstrap.instrument.InstrumentClass; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditor; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorFactory; +import com.nhn.pinpoint.bootstrap.plugin.ClassEditorFactoryMapping; +import com.nhn.pinpoint.bootstrap.plugin.PluginClassLoaderFactory; +import com.nhn.pinpoint.bootstrap.plugin.ProfilerPluginContext; +import com.nhn.pinpoint.exception.PinpointException; import com.nhn.pinpoint.profiler.modifier.AbstractModifier; public class ClassEditorAdaptor extends AbstractModifier { - private final DedicatedClassEditor editor; + private final ClassEditorFactoryMapping mapping; + private final ProfilerPluginContext pluginContext; + private final PluginClassLoaderFactory classLoaderFactory; + - public ClassEditorAdaptor(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent, DedicatedClassEditor editor) { + public ClassEditorAdaptor(ByteCodeInstrumentor byteCodeInstrumentor, Agent agent, ClassEditorFactoryMapping mapping, ProfilerPluginContext pluginContext, PluginClassLoaderFactory classLoaderFactory) { super(byteCodeInstrumentor, agent); - this.editor = editor; + this.mapping = mapping; + this.pluginContext = pluginContext; + this.classLoaderFactory = classLoaderFactory; } @Override public byte[] modify(ClassLoader classLoader, String className, ProtectionDomain protectionDomain, byte[] classFileBuffer) { - return editor.edit(classLoader, className, protectionDomain, classFileBuffer); + ClassLoader forPlugin = classLoaderFactory.get(classLoader); + + ClassLoader old = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(forPlugin); + + try { + Class editorFactoryClass = forPlugin.loadClass(mapping.getEditorFactoryClassName()); + + if (!ClassEditorFactory.class.isAssignableFrom(editorFactoryClass)) { + throw new PinpointException("Illegal class editor factory mapping. factory class[" + editorFactoryClass + "] did not implent ClassEditorFactory"); + } + + ClassEditorFactory editorFactory = (ClassEditorFactory)editorFactoryClass.newInstance(); + ClassEditor editor = editorFactory.get(pluginContext); + + InstrumentClass target = byteCodeInstrumentor.getClass(classLoader, className, classFileBuffer); + + return editor.edit(classLoader, target); + } catch (Exception e) { + throw new PinpointException("Fail to invoke plugin class editor for " + mapping.getTargetClassName() + ", editor factory: " + mapping.getEditorFactoryClassName(), e); + } finally { + Thread.currentThread().setContextClassLoader(old); + } + } @Override public String getTargetClass() { - return editor.getTargetClassName(); + return mapping.getTargetClassName(); } } diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/plugin/PluginLoader.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/plugin/PluginLoader.java index 008824042..13f5656aa 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/plugin/PluginLoader.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/plugin/PluginLoader.java @@ -11,21 +11,27 @@ import java.util.List; import java.util.ServiceLoader; import com.nhn.pinpoint.bootstrap.plugin.ProfilerPlugin; +import com.nhn.pinpoint.exception.PinpointException; public class PluginLoader { - public List load(String pluginPath) { - File[] jars = findJars(pluginPath); - URLClassLoader classLoader = getClassLoader(jars); - List plugins = loadPlugins(jars, classLoader); - - return plugins; + private final URL[] jars;; + + public static PluginLoader get(String pluginPath) { + URL[] jars = findJars(pluginPath); + return new PluginLoader(jars); + } + + + public PluginLoader(URL[] jars) { + this.jars = jars; } - private List loadPlugins(File[] jars, URLClassLoader classLoader) { - List plugins = new ArrayList(jars.length); - + public List loadPlugins() { + URLClassLoader classLoader = new URLClassLoader(jars, ClassLoader.getSystemClassLoader()); ServiceLoader loader = ServiceLoader.load(ProfilerPlugin.class, classLoader); + Iterator iterator = loader.iterator(); + List plugins = new ArrayList(jars.length); while (iterator.hasNext()) { plugins.add(iterator.next()); @@ -33,24 +39,12 @@ public class PluginLoader { return plugins; } - - private URLClassLoader getClassLoader(File[] jars) { - URL[] urls = new URL[jars.length]; - - for (int i = 0; i < jars.length; i++) { - try { - urls[i] = jars[i].toURI().toURL(); - } catch (MalformedURLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - URLClassLoader classLoader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader()); - return classLoader; + + public URL[] getPluginJars() { + return jars; } - private File[] findJars(String pluginPath) { + private static URL[] findJars(String pluginPath) { File file = new File(pluginPath); File[] jars = file.listFiles(new FilenameFilter() { @@ -60,6 +54,18 @@ public class PluginLoader { return name.endsWith(".jar"); } }); - return jars; + + + URL[] urls = new URL[jars.length]; + + for (int i = 0; i < jars.length; i++) { + try { + urls[i] = jars[i].toURI().toURL(); + } catch (MalformedURLException e) { + throw new PinpointException("Fail to load plugin jars", e); + } + } + + return urls; } } diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/tomcat/MockTraceContextFactory.java b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/tomcat/MockTraceContextFactory.java new file mode 100644 index 000000000..1c7beb979 --- /dev/null +++ b/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/tomcat/MockTraceContextFactory.java @@ -0,0 +1,17 @@ +package com.nhn.pinpoint.profiler.modifier.tomcat; + +import com.nhn.pinpoint.bootstrap.config.ProfilerConfig; +import com.nhn.pinpoint.bootstrap.context.TraceContext; +import com.nhn.pinpoint.profiler.context.DefaultTraceContext; + +/** + * @author emeroad + */ +public class MockTraceContextFactory { + public TraceContext create() { + DefaultTraceContext traceContext = new DefaultTraceContext() ; + ProfilerConfig profilerConfig = new ProfilerConfig(); + traceContext.setProfilerConfig(profilerConfig); + return traceContext; + } +} diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 000000000..8bd3a0588 --- /dev/null +++ b/test/.gitignore @@ -0,0 +1,4 @@ +/target/ +/.settings/ +/.classpath +/.project diff --git a/test/pom.xml b/test/pom.xml new file mode 100644 index 000000000..ff8171bce --- /dev/null +++ b/test/pom.xml @@ -0,0 +1,91 @@ + + 4.0.0 + + com.nhn.pinpoint + pom + 1.0.4-SNAPSHOT + + + pinpoint-test + pinpoint test helper libraries + jar + + + + com.nhn.pinpoint + pinpoint-profiler + + + + + org.slf4j + slf4j-api + + + + org.slf4j + jcl-over-slf4j + test + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + compile + + + + + + + + ${basedir}/src/main/java + + **/*.java + + + + true + ${basedir}/src/main/resources + + + ${basedir}/src/main/resources-${env} + + + + + + ${basedir}/src/test/java + + **/*.java + + + + true + ${basedir}/src/test/resources + + + + + + org.apache.maven.plugins + maven-compiler-plugin + true + + true + + + + org.apache.maven.plugins + maven-jar-plugin + + ${pinpiont-plugin-dir} + + + + + diff --git a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/BaseInterceptorTest.java b/test/src/main/java/com/nhn/pinpoint/test/interceptor/BaseInterceptorTest.java similarity index 93% rename from profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/BaseInterceptorTest.java rename to test/src/main/java/com/nhn/pinpoint/test/interceptor/BaseInterceptorTest.java index e74df32e3..efe8b908d 100644 --- a/profiler/src/test/java/com/navercorp/pinpoint/profiler/modifier/BaseInterceptorTest.java +++ b/test/src/main/java/com/nhn/pinpoint/test/interceptor/BaseInterceptorTest.java @@ -1,18 +1,19 @@ -package com.nhn.pinpoint.profiler.modifier; +package com.nhn.pinpoint.test.interceptor; import com.nhn.pinpoint.bootstrap.logging.PLoggerFactory; + import junit.framework.Assert; import org.junit.Before; import org.junit.BeforeClass; -import com.nhn.pinpoint.profiler.context.MockTraceContextFactory; import com.nhn.pinpoint.bootstrap.context.TraceContext; import com.nhn.pinpoint.bootstrap.interceptor.ByteCodeMethodDescriptorSupport; import com.nhn.pinpoint.bootstrap.interceptor.Interceptor; import com.nhn.pinpoint.bootstrap.interceptor.MethodDescriptor; import com.nhn.pinpoint.bootstrap.interceptor.TraceContextSupport; import com.nhn.pinpoint.profiler.logging.Slf4jLoggerBinder; +import com.nhn.pinpoint.test.mock.MockTraceContextFactory; public class BaseInterceptorTest { diff --git a/test/src/main/java/com/nhn/pinpoint/test/mock/MockTraceContextFactory.java b/test/src/main/java/com/nhn/pinpoint/test/mock/MockTraceContextFactory.java new file mode 100644 index 000000000..dcf47abe4 --- /dev/null +++ b/test/src/main/java/com/nhn/pinpoint/test/mock/MockTraceContextFactory.java @@ -0,0 +1,17 @@ +package com.nhn.pinpoint.test.mock; + +import com.nhn.pinpoint.bootstrap.config.ProfilerConfig; +import com.nhn.pinpoint.bootstrap.context.TraceContext; +import com.nhn.pinpoint.profiler.context.DefaultTraceContext; + +/** + * @author emeroad + */ +public class MockTraceContextFactory { + public TraceContext create() { + DefaultTraceContext traceContext = new DefaultTraceContext() ; + ProfilerConfig profilerConfig = new ProfilerConfig(); + traceContext.setProfilerConfig(profilerConfig); + return traceContext; + } +}