diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/AbstractClassEnhancePluginDefine.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/AbstractClassEnhancePluginDefine.java new file mode 100644 index 000000000..8a5c4cab2 --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/AbstractClassEnhancePluginDefine.java @@ -0,0 +1,72 @@ +package com.ai.cloud.skywalking.plugin.interceptor; + +import static com.ai.cloud.skywalking.plugin.PluginBootstrap.CLASS_TYPE_POOL; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.dynamic.ClassFileLocator; +import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; +import net.bytebuddy.pool.TypePool.Resolution; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.ai.cloud.skywalking.plugin.IPlugin; +import com.ai.cloud.skywalking.plugin.PluginException; +import com.ai.cloud.skywalking.util.StringUtil; + +public abstract class AbstractClassEnhancePluginDefine implements IPlugin { + private static Logger logger = LogManager.getLogger(AbstractClassEnhancePluginDefine.class); + + @Override + public void define() throws PluginException { + String interceptorDefineClassName = this.getClass().getName(); + + String enhanceOriginClassName = getBeInterceptedClassName(); + if (StringUtil.isEmpty(enhanceOriginClassName)) { + logger.warn("classname of being intercepted is not defined by {}.", + interceptorDefineClassName); + return; + } + + logger.debug("prepare to enhance class {} by {}.", + enhanceOriginClassName, interceptorDefineClassName); + + Resolution resolution = CLASS_TYPE_POOL.describe(enhanceOriginClassName); + if (!resolution.isResolved()) { + logger.warn("class {} can't be resolved, enhance by {} failue.", + enhanceOriginClassName, interceptorDefineClassName); + return; + } + + /** + * find origin class source code for interceptor + */ + DynamicType.Builder newClassBuilder = new ByteBuddy() + .rebase(resolution.resolve(), + ClassFileLocator.ForClassLoader.ofClassPath()); + + newClassBuilder = this.enhance(enhanceOriginClassName, newClassBuilder); + + /** + * naming class as origin class name, make and load class to + * classloader. + */ + newClassBuilder + .name(enhanceOriginClassName) + .make() + .load(ClassLoader.getSystemClassLoader(), + ClassLoadingStrategy.Default.INJECTION).getLoaded(); + + logger.debug("enhance class {} by {} completely.", + enhanceOriginClassName, interceptorDefineClassName); + } + + protected abstract DynamicType.Builder enhance(String enhanceOriginClassName, DynamicType.Builder newClassBuilder) throws PluginException; + + /** + * 返回要被增强的类,应当返回类全名 + * + * @return + */ + protected abstract String getBeInterceptedClassName(); +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldGetter.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldGetter.java deleted file mode 100644 index 377556ce8..000000000 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldGetter.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.ai.cloud.skywalking.plugin.interceptor; - -public interface FieldGetter { - Object getValue(); -} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IAroundInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IAroundInterceptor.java deleted file mode 100644 index 0cca5ea13..000000000 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/IAroundInterceptor.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.ai.cloud.skywalking.plugin.interceptor; - -public interface IAroundInterceptor { - public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext); - - public void beforeMethod(EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext); - - public Object afterMethod(EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext, Object ret); - - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext, Object ret); -} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorPluginDefine.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorPluginDefine.java deleted file mode 100644 index fe809db83..000000000 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/InterceptorPluginDefine.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.ai.cloud.skywalking.plugin.interceptor; - -import static com.ai.cloud.skywalking.plugin.PluginBootstrap.CLASS_TYPE_POOL; -import static net.bytebuddy.matcher.ElementMatchers.any; -import static net.bytebuddy.matcher.ElementMatchers.not; -import net.bytebuddy.ByteBuddy; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.dynamic.ClassFileLocator; -import net.bytebuddy.dynamic.DynamicType; -import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; -import net.bytebuddy.implementation.MethodDelegation; -import net.bytebuddy.implementation.SuperMethodCall; -import net.bytebuddy.implementation.bind.annotation.FieldProxy; -import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.ElementMatchers; -import net.bytebuddy.pool.TypePool.Resolution; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import com.ai.cloud.skywalking.plugin.IPlugin; -import com.ai.cloud.skywalking.plugin.PluginException; -import com.ai.cloud.skywalking.util.StringUtil; - -public abstract class InterceptorPluginDefine implements IPlugin { - private static Logger logger = LogManager.getLogger(InterceptorPluginDefine.class); - - public static final String contextAttrName = "_$EnhancedClassInstanceContext"; - - - @Override - public void define() throws PluginException { - String interceptorDefineClassName = this.getClass().getName(); - - String enhanceOriginClassName = getBeInterceptedClassName(); - if (StringUtil.isEmpty(enhanceOriginClassName)) { - logger.warn("classname of being intercepted is not defined by {}.", - interceptorDefineClassName); - return; - } - - logger.debug("prepare to enhance class {} by {}.", - enhanceOriginClassName, interceptorDefineClassName); - - Resolution resolution = CLASS_TYPE_POOL.describe(enhanceOriginClassName); - if (!resolution.isResolved()) { - logger.warn("class {} can't be resolved, enhance by {} failue.", - enhanceOriginClassName, interceptorDefineClassName); - return; - } - - /** - * find origin class source code for interceptor - */ - DynamicType.Builder newClassBuilder = new ByteBuddy() - .rebase(resolution.resolve(), - ClassFileLocator.ForClassLoader.ofClassPath()); - - /** - * alter class source code.
- * - * new class need:
- * 1.add field '_$EnhancedClassInstanceContext' of type - * EnhancedClassInstanceContext
- * - * 2.intercept constructor by default, and intercept method which it's - * required by interceptorDefineClass.
- */ - IAroundInterceptor interceptor = instance(); - if (interceptor == null) { - throw new EnhanceException("no IAroundInterceptor instance. "); - } - - newClassBuilder = newClassBuilder - .defineField(contextAttrName, - EnhancedClassInstanceContext.class) - .constructor(any()) - .intercept( - SuperMethodCall.INSTANCE.andThen(MethodDelegation.to( - new ClassConstructorInterceptor(interceptor)) - .appendParameterBinder( - FieldProxy.Binder.install( - FieldGetter.class, - FieldSetter.class)))); - - MethodMatcher[] methodMatchers = getBeInterceptedMethodsMatchers(); - ClassMethodInterceptor classMethodInterceptor = new ClassMethodInterceptor( - interceptor); - - StringBuilder enhanceRules = new StringBuilder("\nprepare to enhance class [" + enhanceOriginClassName + "] as following rules:\n"); - int ruleIdx = 1; - for (MethodMatcher methodMatcher : methodMatchers) { - enhanceRules.append("\t" + ruleIdx++ + ". " + methodMatcher + "\n"); - } - logger.debug(enhanceRules); - ElementMatcher.Junction matcher = null; - for (MethodMatcher methodMatcher : methodMatchers) { - logger.debug("enhance class {} by rule: {}", - enhanceOriginClassName, methodMatcher); - if (matcher == null) { - matcher = methodMatcher.buildMatcher(); - continue; - } - - matcher = matcher.or(methodMatcher.buildMatcher()); - - } - - /** - * exclude static methods. - */ - matcher = matcher.and(not(ElementMatchers.isStatic())); - newClassBuilder = newClassBuilder.method(matcher).intercept( - MethodDelegation.to(classMethodInterceptor)); - - /** - * naming class as origin class name, make and load class to - * classloader. - */ - newClassBuilder - .name(enhanceOriginClassName) - .make() - .load(ClassLoader.getSystemClassLoader(), - ClassLoadingStrategy.Default.INJECTION).getLoaded(); - - logger.debug("enhance class {} by {} completely.", - enhanceOriginClassName, interceptorDefineClassName); - } - - /** - * 返回要被增强的类,应当返回类全名 - * - * @return - */ - public abstract String getBeInterceptedClassName(); - - /** - * 返回需要被增强的方法列表 - * - * @return - */ - public abstract MethodMatcher[] getBeInterceptedMethodsMatchers(); - - /** - * 返回增强拦截器的实现
- * 每个拦截器在同一个被增强类的内部,保持单例 - * - * @return - */ - public abstract IAroundInterceptor instance(); -} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/assist/FirstInvokeInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/assist/SimpleObjectFirstInvokeInterceptor.java similarity index 86% rename from skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/assist/FirstInvokeInterceptor.java rename to skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/assist/SimpleObjectFirstInvokeInterceptor.java index c6dff6d27..3cf284118 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/assist/FirstInvokeInterceptor.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/assist/SimpleObjectFirstInvokeInterceptor.java @@ -3,8 +3,8 @@ package com.ai.cloud.skywalking.plugin.interceptor.assist; import java.util.concurrent.atomic.AtomicInteger; import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; -import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.InterceptorException; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; /** * 用于首次拦截方法调用,避免方法内部的方法调用被多次拦截。 @@ -12,7 +12,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.InterceptorException; * @author wusheng * */ -public abstract class FirstInvokeInterceptor implements IAroundInterceptor { +public abstract class SimpleObjectFirstInvokeInterceptor implements IntanceMethodsAroundInterceptor { protected String invokeCounterKey = "__$invokeCounterKey"; protected Object invokeCounterInstLock = new Object(); diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassConstructorInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassConstructorInterceptor.java similarity index 73% rename from skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassConstructorInterceptor.java rename to skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassConstructorInterceptor.java index 025b2bc9a..8536a9433 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassConstructorInterceptor.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassConstructorInterceptor.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.plugin.interceptor; +package com.ai.cloud.skywalking.plugin.interceptor.enhance; import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.FieldProxy; @@ -8,20 +8,22 @@ import net.bytebuddy.implementation.bind.annotation.This; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; + public class ClassConstructorInterceptor { private static Logger logger = LogManager .getLogger(ClassConstructorInterceptor.class); - private IAroundInterceptor interceptor; + private IntanceMethodsAroundInterceptor interceptor; - public ClassConstructorInterceptor(IAroundInterceptor interceptor) { + public ClassConstructorInterceptor(IntanceMethodsAroundInterceptor interceptor) { this.interceptor = interceptor; } @RuntimeType public void intercept( @This Object obj, - @FieldProxy(InterceptorPluginDefine.contextAttrName) FieldSetter accessor, + @FieldProxy(ClassEnhancePluginDefine.contextAttrName) FieldSetter accessor, @AllArguments Object[] allArguments) { try { EnhancedClassInstanceContext context = new EnhancedClassInstanceContext(); diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassEnhancePluginDefine.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassEnhancePluginDefine.java new file mode 100644 index 000000000..504deaa67 --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassEnhancePluginDefine.java @@ -0,0 +1,182 @@ +package com.ai.cloud.skywalking.plugin.interceptor.enhance; + +import static net.bytebuddy.matcher.ElementMatchers.any; +import static net.bytebuddy.matcher.ElementMatchers.not; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.implementation.MethodDelegation; +import net.bytebuddy.implementation.SuperMethodCall; +import net.bytebuddy.implementation.bind.annotation.FieldProxy; +import net.bytebuddy.matcher.ElementMatcher; +import net.bytebuddy.matcher.ElementMatchers; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.ai.cloud.skywalking.plugin.PluginException; +import com.ai.cloud.skywalking.plugin.interceptor.AbstractClassEnhancePluginDefine; +import com.ai.cloud.skywalking.plugin.interceptor.EnhanceException; +import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; +import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; + +public abstract class ClassEnhancePluginDefine extends AbstractClassEnhancePluginDefine { + private static Logger logger = LogManager + .getLogger(ClassEnhancePluginDefine.class); + + public static final String contextAttrName = "_$EnhancedClassInstanceContext"; + + protected DynamicType.Builder enhance(String enhanceOriginClassName, + DynamicType.Builder newClassBuilder) throws PluginException { + newClassBuilder = this.enhanceClass(enhanceOriginClassName, newClassBuilder); + + newClassBuilder = this.enhanceInstance(enhanceOriginClassName, newClassBuilder); + + return newClassBuilder; + } + + private DynamicType.Builder enhanceInstance(String enhanceOriginClassName, + DynamicType.Builder newClassBuilder) throws PluginException { + MethodMatcher[] methodMatchers = getInstanceMethodsMatchers(); + if(methodMatchers == null){ + return newClassBuilder; + } + + + /** + * alter class source code.
+ * + * new class need:
+ * 1.add field '_$EnhancedClassInstanceContext' of type + * EnhancedClassInstanceContext
+ * + * 2.intercept constructor by default, and intercept method which it's + * required by interceptorDefineClass.
+ */ + IntanceMethodsAroundInterceptor interceptor = getInstanceMethodsInterceptor(); + if (interceptor == null) { + throw new EnhanceException("no IntanceMethodsAroundInterceptor instance. "); + } + + newClassBuilder = newClassBuilder + .defineField(contextAttrName, + EnhancedClassInstanceContext.class) + .constructor(any()) + .intercept( + SuperMethodCall.INSTANCE.andThen(MethodDelegation.to( + new ClassConstructorInterceptor(interceptor)) + .appendParameterBinder( + FieldProxy.Binder.install( + FieldGetter.class, + FieldSetter.class)))); + + ClassInstanceMethodsInterceptor classMethodInterceptor = new ClassInstanceMethodsInterceptor( + interceptor); + + StringBuilder enhanceRules = new StringBuilder( + "\nprepare to enhance class [" + enhanceOriginClassName + + "] instance methods as following rules:\n"); + int ruleIdx = 1; + for (MethodMatcher methodMatcher : methodMatchers) { + enhanceRules.append("\t" + ruleIdx++ + ". " + methodMatcher + "\n"); + } + logger.debug(enhanceRules); + ElementMatcher.Junction matcher = null; + for (MethodMatcher methodMatcher : methodMatchers) { + logger.debug("enhance class {} instance methods by rule: {}", + enhanceOriginClassName, methodMatcher); + if (matcher == null) { + matcher = methodMatcher.buildMatcher(); + continue; + } + + matcher = matcher.or(methodMatcher.buildMatcher()); + + } + + /** + * exclude static methods. + */ + matcher = matcher.and(not(ElementMatchers.isStatic())); + newClassBuilder = newClassBuilder.method(matcher).intercept( + MethodDelegation.to(classMethodInterceptor)); + + return newClassBuilder; + } + + /** + * 返回需要被增强的方法列表 + * + * @return + */ + protected abstract MethodMatcher[] getInstanceMethodsMatchers(); + + /** + * 返回增强拦截器的实现
+ * 每个拦截器在同一个被增强类的内部,保持单例 + * + * @return + */ + protected abstract IntanceMethodsAroundInterceptor getInstanceMethodsInterceptor(); + + private DynamicType.Builder enhanceClass(String enhanceOriginClassName, + DynamicType.Builder newClassBuilder) throws PluginException { + MethodMatcher[] methodMatchers = getStaticMethodsMatchers(); + if(methodMatchers == null){ + return newClassBuilder; + } + + StaticMethodsAroundInterceptor interceptor = getStaticMethodsInterceptor(); + if (interceptor == null) { + throw new EnhanceException("no StaticMethodsAroundInterceptor instance. "); + } + + + ClassStaticMethodsInterceptor classMethodInterceptor = new ClassStaticMethodsInterceptor( + interceptor); + + StringBuilder enhanceRules = new StringBuilder( + "\nprepare to enhance class [" + enhanceOriginClassName + + "] static methods as following rules:\n"); + int ruleIdx = 1; + for (MethodMatcher methodMatcher : methodMatchers) { + enhanceRules.append("\t" + ruleIdx++ + ". " + methodMatcher + "\n"); + } + logger.debug(enhanceRules); + ElementMatcher.Junction matcher = null; + for (MethodMatcher methodMatcher : methodMatchers) { + logger.debug("enhance class {} static methods by rule: {}", + enhanceOriginClassName, methodMatcher); + if (matcher == null) { + matcher = methodMatcher.buildMatcher(); + continue; + } + + matcher = matcher.or(methodMatcher.buildMatcher()); + + } + + /** + * restrict static methods. + */ + matcher = matcher.and(ElementMatchers.isStatic()); + newClassBuilder = newClassBuilder.method(matcher).intercept( + MethodDelegation.to(classMethodInterceptor)); + + return newClassBuilder; + } + + /** + * 返回需要被增强的方法列表 + * + * @return + */ + protected abstract MethodMatcher[] getStaticMethodsMatchers(); + + /** + * 返回增强拦截器的实现
+ * 每个拦截器在同一个被增强类的内部,保持单例 + * + * @return + */ + protected abstract StaticMethodsAroundInterceptor getStaticMethodsInterceptor(); +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsEnhancePluginDefine.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsEnhancePluginDefine.java new file mode 100644 index 000000000..90c712b95 --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsEnhancePluginDefine.java @@ -0,0 +1,24 @@ +package com.ai.cloud.skywalking.plugin.interceptor.enhance; + +import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; + +/** + * 仅增强拦截实例方法 + * + * @author wusheng + * + */ +public abstract class ClassInstanceMethodsEnhancePluginDefine extends + ClassEnhancePluginDefine { + + @Override + protected MethodMatcher[] getStaticMethodsMatchers() { + return null; + } + + @Override + protected StaticMethodsAroundInterceptor getStaticMethodsInterceptor() { + return null; + } + +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassMethodInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java similarity index 75% rename from skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassMethodInterceptor.java rename to skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java index 9d52b40f2..aaee6e477 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ClassMethodInterceptor.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.plugin.interceptor; +package com.ai.cloud.skywalking.plugin.interceptor.enhance; import java.lang.reflect.Method; import java.util.concurrent.Callable; @@ -13,19 +13,21 @@ import net.bytebuddy.implementation.bind.annotation.This; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; + /** * 类方法拦截、控制器 * * @author wusheng * */ -public class ClassMethodInterceptor { +public class ClassInstanceMethodsInterceptor { private static Logger logger = LogManager - .getLogger(ClassMethodInterceptor.class); + .getLogger(ClassInstanceMethodsInterceptor.class); - private IAroundInterceptor interceptor; + private IntanceMethodsAroundInterceptor interceptor; - public ClassMethodInterceptor(IAroundInterceptor interceptor) { + public ClassInstanceMethodsInterceptor(IntanceMethodsAroundInterceptor interceptor) { this.interceptor = interceptor; } @@ -35,9 +37,9 @@ public class ClassMethodInterceptor { @AllArguments Object[] allArguments, @Origin Method method, @SuperCall Callable zuper, - @FieldValue(InterceptorPluginDefine.contextAttrName) EnhancedClassInstanceContext instanceContext) + @FieldValue(ClassEnhancePluginDefine.contextAttrName) EnhancedClassInstanceContext instanceContext) throws Exception { - MethodInvokeContext interceptorContext = new MethodInvokeContext(obj, + InstanceMethodInvokeContext interceptorContext = new InstanceMethodInvokeContext(obj, method.getName(), allArguments); try { interceptor.beforeMethod(instanceContext, interceptorContext); diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsEnhancePluginDefine.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsEnhancePluginDefine.java new file mode 100644 index 000000000..c0860890d --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsEnhancePluginDefine.java @@ -0,0 +1,23 @@ +package com.ai.cloud.skywalking.plugin.interceptor.enhance; + +import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; + +/** + * 仅增强拦截类级别静态方法 + * + * @author wusheng + * + */ +public abstract class ClassStaticMethodsEnhancePluginDefine extends + ClassEnhancePluginDefine { + + @Override + protected MethodMatcher[] getInstanceMethodsMatchers() { + return null; + } + + @Override + protected IntanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { + return null; + } +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java new file mode 100644 index 000000000..e1cdff943 --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java @@ -0,0 +1,64 @@ +package com.ai.cloud.skywalking.plugin.interceptor.enhance; + +import java.lang.reflect.Method; +import java.util.concurrent.Callable; + +import net.bytebuddy.implementation.bind.annotation.AllArguments; +import net.bytebuddy.implementation.bind.annotation.Origin; +import net.bytebuddy.implementation.bind.annotation.RuntimeType; +import net.bytebuddy.implementation.bind.annotation.SuperCall; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * 类静态方法拦截、控制器 + * + * @author wusheng + * + */ +public class ClassStaticMethodsInterceptor { + private static Logger logger = LogManager + .getLogger(ClassStaticMethodsInterceptor.class); + + private StaticMethodsAroundInterceptor interceptor; + + public ClassStaticMethodsInterceptor( + StaticMethodsAroundInterceptor interceptor) { + this.interceptor = interceptor; + } + + @RuntimeType + public Object intercept(@Origin Class clazz, + @AllArguments Object[] allArguments, @Origin Method method, + @SuperCall Callable zuper) throws Exception { + MethodInvokeContext interceptorContext = new MethodInvokeContext( + method.getName(), allArguments); + try { + interceptor.beforeMethod(interceptorContext); + } catch (Throwable t) { + logger.error("class[{}] before static method[{}] intercept failue:{}", + clazz, method.getName(), t.getMessage(), t); + } + Object ret = null; + try { + ret = zuper.call(); + } catch (Throwable t) { + try { + interceptor.handleMethodException(t, interceptorContext, ret); + } catch (Throwable t2) { + logger.error("class[{}] handle static method[{}] exception failue:{}", + clazz, method.getName(), t2.getMessage(), t2); + } + throw t; + } finally { + try { + ret = interceptor.afterMethod(interceptorContext, ret); + } catch (Throwable t) { + logger.error("class[{}] after static method[{}] intercept failue:{}", + clazz, method.getName(), t.getMessage(), t); + } + } + return ret; + } +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ConstructorInvokeContext.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ConstructorInvokeContext.java similarity index 87% rename from skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ConstructorInvokeContext.java rename to skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ConstructorInvokeContext.java index 8b82379a1..93a4eea78 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/ConstructorInvokeContext.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ConstructorInvokeContext.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.plugin.interceptor; +package com.ai.cloud.skywalking.plugin.interceptor.enhance; public class ConstructorInvokeContext { /** diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/FieldGetter.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/FieldGetter.java new file mode 100644 index 000000000..2e34d8ec7 --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/FieldGetter.java @@ -0,0 +1,5 @@ +package com.ai.cloud.skywalking.plugin.interceptor.enhance; + +public interface FieldGetter { + Object getValue(); +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldSetter.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/FieldSetter.java similarity index 51% rename from skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldSetter.java rename to skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/FieldSetter.java index 22038757f..627a28157 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/FieldSetter.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/FieldSetter.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.plugin.interceptor; +package com.ai.cloud.skywalking.plugin.interceptor.enhance; public interface FieldSetter { void setValue(Object value); diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/InstanceMethodInvokeContext.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/InstanceMethodInvokeContext.java new file mode 100644 index 000000000..901d7ac9e --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/InstanceMethodInvokeContext.java @@ -0,0 +1,17 @@ +package com.ai.cloud.skywalking.plugin.interceptor.enhance; + +public class InstanceMethodInvokeContext extends MethodInvokeContext { + /** + * 代理类实例 + */ + private Object objInst; + + InstanceMethodInvokeContext(Object objInst, String methodName, Object[] allArguments) { + super(methodName, allArguments); + this.objInst = objInst; + } + + public Object inst(){ + return objInst; + } +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/IntanceMethodsAroundInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/IntanceMethodsAroundInterceptor.java new file mode 100644 index 000000000..2f3dda4e1 --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/IntanceMethodsAroundInterceptor.java @@ -0,0 +1,13 @@ +package com.ai.cloud.skywalking.plugin.interceptor.enhance; + +import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; + +public interface IntanceMethodsAroundInterceptor { + public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext); + + public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext); + + public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret); + + public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret); +} diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/MethodInvokeContext.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/MethodInvokeContext.java similarity index 61% rename from skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/MethodInvokeContext.java rename to skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/MethodInvokeContext.java index 3c9eaaa5f..e7c96fc6d 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/MethodInvokeContext.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/MethodInvokeContext.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.plugin.interceptor; +package com.ai.cloud.skywalking.plugin.interceptor.enhance; /** * 方法执行拦截上下文 @@ -7,10 +7,6 @@ package com.ai.cloud.skywalking.plugin.interceptor; * */ public class MethodInvokeContext { - /** - * 代理类实例 - */ - private Object objInst; /** * 方法名称 */ @@ -20,8 +16,7 @@ public class MethodInvokeContext { */ private Object[] allArguments; - MethodInvokeContext(Object objInst, String methodName, Object[] allArguments) { - this.objInst = objInst; + MethodInvokeContext(String methodName, Object[] allArguments) { this.methodName = methodName; this.allArguments = allArguments; } @@ -33,8 +28,4 @@ public class MethodInvokeContext { public String methodName(){ return methodName; } - - public Object inst(){ - return objInst; - } } diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/StaticMethodsAroundInterceptor.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/StaticMethodsAroundInterceptor.java new file mode 100644 index 000000000..11be7ec0d --- /dev/null +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/StaticMethodsAroundInterceptor.java @@ -0,0 +1,10 @@ +package com.ai.cloud.skywalking.plugin.interceptor.enhance; + + +public interface StaticMethodsAroundInterceptor { + public void beforeMethod(MethodInvokeContext interceptorContext); + + public Object afterMethod(MethodInvokeContext interceptorContext, Object ret); + + public void handleMethodException(Throwable t, MethodInvokeContext interceptorContext, Object ret); +} diff --git a/skywalking-api/src/test/java/test/ai/cloud/matcher/TestAroundInterceptor.java b/skywalking-api/src/test/java/test/ai/cloud/matcher/TestAroundInterceptor.java index e9c1019b9..6a1e2d6bf 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/matcher/TestAroundInterceptor.java +++ b/skywalking-api/src/test/java/test/ai/cloud/matcher/TestAroundInterceptor.java @@ -1,32 +1,32 @@ package test.ai.cloud.matcher; -import com.ai.cloud.skywalking.plugin.interceptor.ConstructorInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; -import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.MethodInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ConstructorInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; /** * Created by xin on 16-6-8. */ -public class TestAroundInterceptor implements IAroundInterceptor { +public class TestAroundInterceptor implements IntanceMethodsAroundInterceptor { @Override public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) { } @Override - public void beforeMethod(EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext) { + public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { System.out.println("before method"); } @Override - public Object afterMethod(EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext, Object ret) { + public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) { System.out.println("after method"); return ret; } @Override - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext, Object ret) { + public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) { } } diff --git a/skywalking-api/src/test/java/test/ai/cloud/matcher/TestMatcherDefine.java b/skywalking-api/src/test/java/test/ai/cloud/matcher/TestMatcherDefine.java index 19b032425..cb4f1b825 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/matcher/TestMatcherDefine.java +++ b/skywalking-api/src/test/java/test/ai/cloud/matcher/TestMatcherDefine.java @@ -1,36 +1,34 @@ package test.ai.cloud.matcher; -import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.InterceptorPluginDefine; import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; -import com.ai.cloud.skywalking.plugin.interceptor.matcher.MethodsExclusiveMatcher; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.matcher.PrivateMethodMatcher; -import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; /** * Created by xin on 16-6-8. */ -public class TestMatcherDefine extends InterceptorPluginDefine { +public class TestMatcherDefine extends ClassInstanceMethodsEnhancePluginDefine { @Override public String getBeInterceptedClassName() { return "test.ai.cloud.matcher.TestMatcherClass"; } @Override - public MethodMatcher[] getBeInterceptedMethodsMatchers() { - return new MethodMatcher[]{ - new PrivateMethodMatcher(), - new MethodsExclusiveMatcher(new SimpleMethodMatcher("set")), - new SimpleMethodMatcher(MethodMatcher.Modifier.Private, "set", 1) - }; - //return new MethodMatcher[] { new SimpleMethodMatcher(Modifier.Public, "printabc", new Class[]{String.class, String.class}) }; - //return new MethodMatcher[] { new PrivateMethodMatcher()}; + protected MethodMatcher[] getInstanceMethodsMatchers() { +// return new MethodMatcher[]{ +// new PrivateMethodMatcher(), +// new MethodsExclusiveMatcher(new SimpleMethodMatcher("set")), +// new SimpleMethodMatcher(MethodMatcher.Modifier.Private, "set", 1) +// }; +// return new MethodMatcher[] { new SimpleMethodMatcher(Modifier.Public, "printabc", new Class[]{String.class, String.class}) }; + return new MethodMatcher[] { new PrivateMethodMatcher()}; //return new MethodMatcher[]{new AnyMethodsMatcher()}; //return new MethodMatcher[]{new MethodsExclusiveMatcher(new SimpleMethodMatcher("set"), new SimpleMethodMatcher(MethodMatcher.Modifier.Public,"get"))}; } @Override - public IAroundInterceptor instance() { + protected IntanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { return new TestAroundInterceptor(); } } diff --git a/skywalking-api/src/test/java/test/ai/cloud/plugin/BeInterceptedClass.java b/skywalking-api/src/test/java/test/ai/cloud/plugin/BeInterceptedClass.java index 7d67ce42c..46a49e22e 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/plugin/BeInterceptedClass.java +++ b/skywalking-api/src/test/java/test/ai/cloud/plugin/BeInterceptedClass.java @@ -8,4 +8,8 @@ public class BeInterceptedClass { public void printabc(){ System.out.println("printabc"); } + + public static void call(){ + System.out.println("static call"); + } } diff --git a/skywalking-api/src/test/java/test/ai/cloud/plugin/PluginMainTest.java b/skywalking-api/src/test/java/test/ai/cloud/plugin/PluginMainTest.java index dbc74e7e7..b41d38d25 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/plugin/PluginMainTest.java +++ b/skywalking-api/src/test/java/test/ai/cloud/plugin/PluginMainTest.java @@ -22,5 +22,7 @@ public class PluginMainTest { inst.printabc(); long end = System.currentTimeMillis(); System.out.println(end - start + "ms"); + + BeInterceptedClass.call(); } } diff --git a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestAroundInterceptor.java b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestAroundInterceptor.java index 8004c0723..438ee06e6 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestAroundInterceptor.java +++ b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestAroundInterceptor.java @@ -1,11 +1,11 @@ package test.ai.cloud.plugin; -import com.ai.cloud.skywalking.plugin.interceptor.ConstructorInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; -import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.MethodInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ConstructorInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; -public class TestAroundInterceptor implements IAroundInterceptor { +public class TestAroundInterceptor implements IntanceMethodsAroundInterceptor { @Override public void onConstruct(EnhancedClassInstanceContext context, ConstructorInvokeContext interceptorContext) { @@ -14,19 +14,19 @@ public class TestAroundInterceptor implements IAroundInterceptor { } @Override - public void beforeMethod(EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext) { + public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { System.out.println("beforeMethod : " + context.get("test.key", String.class)); } @Override - public Object afterMethod(EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext, Object ret) { + public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) { System.out.println("afterMethod: " + context.get("test.key", String.class)); return ret; } @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - MethodInvokeContext interceptorContext, Object ret) { + InstanceMethodInvokeContext interceptorContext, Object ret) { // TODO Auto-generated method stub } diff --git a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestInterceptorDefine.java b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestInterceptorDefine.java index 8a12bd87a..31bc788b5 100644 --- a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestInterceptorDefine.java +++ b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestInterceptorDefine.java @@ -1,11 +1,12 @@ package test.ai.cloud.plugin; -import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.InterceptorPluginDefine; import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassEnhancePluginDefine; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.StaticMethodsAroundInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; -public class TestInterceptorDefine extends InterceptorPluginDefine { +public class TestInterceptorDefine extends ClassEnhancePluginDefine { @Override public String getBeInterceptedClassName() { @@ -13,13 +14,23 @@ public class TestInterceptorDefine extends InterceptorPluginDefine { } @Override - public MethodMatcher[] getBeInterceptedMethodsMatchers() { + public MethodMatcher[] getInstanceMethodsMatchers() { return new MethodMatcher[] { new SimpleMethodMatcher("printabc") }; } @Override - public IAroundInterceptor instance() { + public IntanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { return new TestAroundInterceptor(); } + @Override + protected MethodMatcher[] getStaticMethodsMatchers() { + return new MethodMatcher[] { new SimpleMethodMatcher("call") }; + } + + @Override + protected StaticMethodsAroundInterceptor getStaticMethodsInterceptor() { + return new TestStaticAroundInterceptor(); + } + } diff --git a/skywalking-api/src/test/java/test/ai/cloud/plugin/TestStaticAroundInterceptor.java b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestStaticAroundInterceptor.java new file mode 100644 index 000000000..007bc49dc --- /dev/null +++ b/skywalking-api/src/test/java/test/ai/cloud/plugin/TestStaticAroundInterceptor.java @@ -0,0 +1,26 @@ +package test.ai.cloud.plugin; + +import com.ai.cloud.skywalking.plugin.interceptor.enhance.MethodInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.StaticMethodsAroundInterceptor; + +public class TestStaticAroundInterceptor implements StaticMethodsAroundInterceptor { + + @Override + public void beforeMethod(MethodInvokeContext interceptorContext) { + System.out.println("beforeMethod : static"); + } + + @Override + public Object afterMethod(MethodInvokeContext interceptorContext, Object ret) { + System.out.println("afterMethod: static"); + return ret; + } + + @Override + public void handleMethodException(Throwable t, + MethodInvokeContext interceptorContext, Object ret) { + // TODO Auto-generated method stub + + } + +} diff --git a/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/DubboPluginDefine.java b/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/DubboPluginDefine.java index 93ceb6490..d16e3863d 100644 --- a/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/DubboPluginDefine.java +++ b/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/ai/cloud/skywalking/plugin/DubboPluginDefine.java @@ -1,43 +1,24 @@ package com.ai.cloud.skywalking.plugin; -import com.ai.cloud.skywalking.conf.AuthDesc; -import com.ai.cloud.skywalking.plugin.boot.BootException; -import com.ai.cloud.skywalking.plugin.boot.BootPluginDefine; -import com.alibaba.dubbo.rpc.Invoker; -import net.bytebuddy.ByteBuddy; -import net.bytebuddy.dynamic.ClassFileLocator; -import net.bytebuddy.dynamic.DynamicType; -import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; -import net.bytebuddy.implementation.MethodDelegation; -import net.bytebuddy.pool.TypePool; +import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassStaticMethodsEnhancePluginDefine; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.StaticMethodsAroundInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; -import static com.ai.cloud.skywalking.plugin.PluginBootstrap.CLASS_TYPE_POOL; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; +public class DubboPluginDefine extends ClassStaticMethodsEnhancePluginDefine { + @Override + protected MethodMatcher[] getStaticMethodsMatchers() { + return new MethodMatcher[] { new SimpleMethodMatcher("buildInvokerChain") }; + } -public class DubboPluginDefine extends BootPluginDefine { + @Override + protected StaticMethodsAroundInterceptor getStaticMethodsInterceptor() { + // TODO Auto-generated method stub + return null; + } - private static final String interceptorClassName = "com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper"; - - @Override - protected void boot() throws BootException { - if (!AuthDesc.isAuth()) { - return; - } - - TypePool.Resolution resolution = CLASS_TYPE_POOL.describe(interceptorClassName); - DynamicType.Builder newClassBuilder = new ByteBuddy() - .rebase(resolution.resolve(), - ClassFileLocator.ForClassLoader.ofClassPath()); - - newClassBuilder = newClassBuilder.method(named("buildInvokerChain") - .and(takesArguments(Invoker.class, String.class, String.class))) - .intercept(MethodDelegation.to(new DubboFilterBuildInterceptor())); - - newClassBuilder - .name(interceptorClassName) - .make() - .load(ClassLoader.getSystemClassLoader(), - ClassLoadingStrategy.Default.INJECTION).getLoaded(); - } + @Override + protected String getBeInterceptedClassName() { + return "com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper"; + } } diff --git a/skywalking-sdk-plugin/httpClient-4.x-plugin-dubbox-rest-attachment/src/main/java/org/skywalking/httpClient/v4/plugin/dubbox/rest/attachment/DubboxRestHeadSetterAttachment.java b/skywalking-sdk-plugin/httpClient-4.x-plugin-dubbox-rest-attachment/src/main/java/org/skywalking/httpClient/v4/plugin/dubbox/rest/attachment/DubboxRestHeadSetterAttachment.java index a124309d5..e93e2c50b 100644 --- a/skywalking-sdk-plugin/httpClient-4.x-plugin-dubbox-rest-attachment/src/main/java/org/skywalking/httpClient/v4/plugin/dubbox/rest/attachment/DubboxRestHeadSetterAttachment.java +++ b/skywalking-sdk-plugin/httpClient-4.x-plugin-dubbox-rest-attachment/src/main/java/org/skywalking/httpClient/v4/plugin/dubbox/rest/attachment/DubboxRestHeadSetterAttachment.java @@ -2,11 +2,11 @@ package org.skywalking.httpClient.v4.plugin.dubbox.rest.attachment; import org.skywalking.httpClient.v4.plugin.HttpClientExecuteInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.InterceptorPluginDefine; import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; -public class DubboxRestHeadSetterAttachment extends InterceptorPluginDefine { +public class DubboxRestHeadSetterAttachment extends ClassInstanceMethodsEnhancePluginDefine { /** * this method is called as InterceptorPluginDefine
@@ -20,12 +20,12 @@ public class DubboxRestHeadSetterAttachment extends InterceptorPluginDefine { } @Override - public MethodMatcher[] getBeInterceptedMethodsMatchers() { + public MethodMatcher[] getInstanceMethodsMatchers() { return null; } @Override - public IAroundInterceptor instance() { + public IntanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { return null; } diff --git a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/HttpClientExecuteInterceptor.java b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/HttpClientExecuteInterceptor.java index 1c7d4ddd6..6842a0b51 100644 --- a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/HttpClientExecuteInterceptor.java +++ b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/HttpClientExecuteInterceptor.java @@ -5,12 +5,12 @@ import org.apache.http.HttpRequest; import com.ai.cloud.skywalking.buriedpoint.RPCBuriedPointSender; import com.ai.cloud.skywalking.model.Identification; -import com.ai.cloud.skywalking.plugin.interceptor.ConstructorInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; -import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.MethodInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ConstructorInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodInvokeContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; -public class HttpClientExecuteInterceptor implements IAroundInterceptor { +public class HttpClientExecuteInterceptor implements IntanceMethodsAroundInterceptor { /** * default headname of sky walking context
*/ @@ -25,7 +25,7 @@ public class HttpClientExecuteInterceptor implements IAroundInterceptor { @Override public void beforeMethod(EnhancedClassInstanceContext context, - MethodInvokeContext interceptorContext) { + InstanceMethodInvokeContext interceptorContext) { Object[] allArguments = interceptorContext.allArguments(); if (allArguments[0] == null || allArguments[1] == null) { // illegal args, can't trace. ignore. @@ -51,7 +51,7 @@ public class HttpClientExecuteInterceptor implements IAroundInterceptor { @Override public Object afterMethod(EnhancedClassInstanceContext context, - MethodInvokeContext interceptorContext, Object ret) { + InstanceMethodInvokeContext interceptorContext, Object ret) { Object[] allArguments = interceptorContext.allArguments(); if (allArguments[0] == null || allArguments[1] == null) { // illegal args, can't trace. ignore. @@ -64,7 +64,7 @@ public class HttpClientExecuteInterceptor implements IAroundInterceptor { @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, - MethodInvokeContext interceptorContext, Object ret) { + InstanceMethodInvokeContext interceptorContext, Object ret) { Object[] allArguments = interceptorContext.allArguments(); if (allArguments[0] == null || allArguments[1] == null) { // illegal args, can't trace. ignore. diff --git a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/AbstractHttpClientPluginDefine.java b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/AbstractHttpClientPluginDefine.java index 6b43ad2d1..055a20a38 100644 --- a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/AbstractHttpClientPluginDefine.java +++ b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/AbstractHttpClientPluginDefine.java @@ -17,7 +17,7 @@ public class AbstractHttpClientPluginDefine extends HttpClientPluginDefine { * */ @Override - public MethodMatcher[] getBeInterceptedMethodsMatchers() { + public MethodMatcher[] getInstanceMethodsMatchers() { return new MethodMatcher[] { new SimpleMethodMatcher("doExecute")}; } diff --git a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/DefaultRequestDirectorPluginDefine.java b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/DefaultRequestDirectorPluginDefine.java index 3197d6fd3..03f3aeb39 100644 --- a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/DefaultRequestDirectorPluginDefine.java +++ b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/DefaultRequestDirectorPluginDefine.java @@ -15,7 +15,7 @@ public class DefaultRequestDirectorPluginDefine extends HttpClientPluginDefine { } @Override - public MethodMatcher[] getBeInterceptedMethodsMatchers() { + public MethodMatcher[] getInstanceMethodsMatchers() { return new MethodMatcher[] { new SimpleMethodMatcher("execute")}; } diff --git a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/HttpClientPluginDefine.java b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/HttpClientPluginDefine.java index 02820ef11..1365a01cd 100644 --- a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/HttpClientPluginDefine.java +++ b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/HttpClientPluginDefine.java @@ -2,13 +2,13 @@ package org.skywalking.httpClient.v4.plugin.define; import org.skywalking.httpClient.v4.plugin.HttpClientExecuteInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.InterceptorPluginDefine; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; -public abstract class HttpClientPluginDefine extends InterceptorPluginDefine { +public abstract class HttpClientPluginDefine extends ClassInstanceMethodsEnhancePluginDefine { @Override - public IAroundInterceptor instance() { + public IntanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { return new HttpClientExecuteInterceptor(); } diff --git a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/InternalHttpClientPluginDefine.java b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/InternalHttpClientPluginDefine.java index 35612d41e..84db0b610 100644 --- a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/InternalHttpClientPluginDefine.java +++ b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/InternalHttpClientPluginDefine.java @@ -5,7 +5,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; public class InternalHttpClientPluginDefine extends HttpClientPluginDefine { @Override - public MethodMatcher[] getBeInterceptedMethodsMatchers() { + public MethodMatcher[] getInstanceMethodsMatchers() { return new MethodMatcher[]{new SimpleMethodMatcher("doExecute")}; } diff --git a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/MinimalHttpClientPluginDefine.java b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/MinimalHttpClientPluginDefine.java index b7ff63272..aa5067d8e 100644 --- a/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/MinimalHttpClientPluginDefine.java +++ b/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/org/skywalking/httpClient/v4/plugin/define/MinimalHttpClientPluginDefine.java @@ -5,7 +5,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; public class MinimalHttpClientPluginDefine extends HttpClientPluginDefine { @Override - public MethodMatcher[] getBeInterceptedMethodsMatchers() { + public MethodMatcher[] getInstanceMethodsMatchers() { return new MethodMatcher[]{new SimpleMethodMatcher("doExecute")}; } diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisBaseInterceptor.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisBaseInterceptor.java index 035a05f25..2f0c7a6ee 100644 --- a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisBaseInterceptor.java +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisBaseInterceptor.java @@ -3,16 +3,16 @@ package com.ai.cloud.skywalking.jedis.v2.plugin; import com.ai.cloud.skywalking.buriedpoint.RPCBuriedPointSender; import com.ai.cloud.skywalking.model.Identification; import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; -import com.ai.cloud.skywalking.plugin.interceptor.MethodInvokeContext; -import com.ai.cloud.skywalking.plugin.interceptor.assist.FirstInvokeInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.assist.SimpleObjectFirstInvokeInterceptor; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.InstanceMethodInvokeContext; -public abstract class JedisBaseInterceptor extends FirstInvokeInterceptor { +public abstract class JedisBaseInterceptor extends SimpleObjectFirstInvokeInterceptor { protected static final String REDIS_CONN_INFO_KEY = "redisClusterConnInfo"; private static RPCBuriedPointSender sender = new RPCBuriedPointSender(); @Override - public void beforeMethod(EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext) { + public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { if (this.isFirstBeforeMethod(context)) { /** * redis server wouldn't process rpc context. ignore the @@ -34,7 +34,7 @@ public abstract class JedisBaseInterceptor extends FirstInvokeInterceptor { } @Override - public Object afterMethod(EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext, Object ret) { + public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) { if (this.isLastAfterMethod(context)) { sender.afterSend(); } @@ -42,7 +42,7 @@ public abstract class JedisBaseInterceptor extends FirstInvokeInterceptor { } @Override - public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, MethodInvokeContext interceptorContext, Object ret) { + public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) { sender.handleException(t); } } diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterInterceptor.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterInterceptor.java index 90cda05ff..5d29e05a9 100644 --- a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterInterceptor.java +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisClusterInterceptor.java @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.jedis.v2.plugin; -import com.ai.cloud.skywalking.plugin.interceptor.ConstructorInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ConstructorInvokeContext; import redis.clients.jedis.HostAndPort; diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisInterceptor.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisInterceptor.java index 0926bfa49..b52144185 100644 --- a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisInterceptor.java +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/JedisInterceptor.java @@ -4,8 +4,8 @@ import java.net.URI; import redis.clients.jedis.JedisShardInfo; -import com.ai.cloud.skywalking.plugin.interceptor.ConstructorInvokeContext; import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ConstructorInvokeContext; public class JedisInterceptor extends JedisBaseInterceptor { diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java index da86b0df4..d5e98567b 100644 --- a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisClusterPluginDefine.java @@ -1,12 +1,12 @@ package com.ai.cloud.skywalking.jedis.v2.plugin.define; import com.ai.cloud.skywalking.jedis.v2.plugin.JedisClusterInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.InterceptorPluginDefine; import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.matcher.AnyMethodsMatcher; -public class JedisClusterPluginDefine extends InterceptorPluginDefine { +public class JedisClusterPluginDefine extends ClassInstanceMethodsEnhancePluginDefine { @Override public String getBeInterceptedClassName() { @@ -14,14 +14,14 @@ public class JedisClusterPluginDefine extends InterceptorPluginDefine { } @Override - public MethodMatcher[] getBeInterceptedMethodsMatchers() { + public MethodMatcher[] getInstanceMethodsMatchers() { return new MethodMatcher[]{ new AnyMethodsMatcher() }; } @Override - public IAroundInterceptor instance() { + public IntanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { return new JedisClusterInterceptor(); } } diff --git a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisPluginDefine.java b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisPluginDefine.java index 975087aa9..bb86d12a2 100644 --- a/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisPluginDefine.java +++ b/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/ai/cloud/skywalking/jedis/v2/plugin/define/JedisPluginDefine.java @@ -1,14 +1,14 @@ package com.ai.cloud.skywalking.jedis.v2.plugin.define; import com.ai.cloud.skywalking.jedis.v2.plugin.JedisInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.IAroundInterceptor; -import com.ai.cloud.skywalking.plugin.interceptor.InterceptorPluginDefine; import com.ai.cloud.skywalking.plugin.interceptor.MethodMatcher; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import com.ai.cloud.skywalking.plugin.interceptor.enhance.IntanceMethodsAroundInterceptor; import com.ai.cloud.skywalking.plugin.interceptor.matcher.MethodsExclusiveMatcher; import com.ai.cloud.skywalking.plugin.interceptor.matcher.PrivateMethodMatcher; import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; -public class JedisPluginDefine extends InterceptorPluginDefine { +public class JedisPluginDefine extends ClassInstanceMethodsEnhancePluginDefine { @Override public String getBeInterceptedClassName() { @@ -16,7 +16,7 @@ public class JedisPluginDefine extends InterceptorPluginDefine { } @Override - public MethodMatcher[] getBeInterceptedMethodsMatchers() { + public MethodMatcher[] getInstanceMethodsMatchers() { return new MethodMatcher[]{ new MethodsExclusiveMatcher( new PrivateMethodMatcher(), @@ -32,7 +32,7 @@ public class JedisPluginDefine extends InterceptorPluginDefine { } @Override - public IAroundInterceptor instance() { + public IntanceMethodsAroundInterceptor getInstanceMethodsInterceptor() { return new JedisInterceptor(); }