提交 3ee26762 编写于 作者: wu-sheng's avatar wu-sheng

增加一个见证者类的代码。用于后期标定不同版本的插件使用。

上级 2f86b1b3
package com.ai.cloud.skywalking.plugin.interceptor; package com.ai.cloud.skywalking.plugin.interceptor;
import static com.ai.cloud.skywalking.plugin.PluginBootstrap.CLASS_TYPE_POOL;
import com.ai.cloud.skywalking.logging.LogManager; import com.ai.cloud.skywalking.logging.LogManager;
import com.ai.cloud.skywalking.logging.Logger; import com.ai.cloud.skywalking.logging.Logger;
import com.ai.cloud.skywalking.plugin.IPlugin;
import com.ai.cloud.skywalking.plugin.PluginException;
import com.ai.cloud.skywalking.util.StringUtil;
import net.bytebuddy.ByteBuddy; import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.ClassFileLocator; import net.bytebuddy.dynamic.ClassFileLocator;
import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import net.bytebuddy.pool.TypePool.Resolution; import net.bytebuddy.pool.TypePool.Resolution;
import com.ai.cloud.skywalking.plugin.IPlugin; import static com.ai.cloud.skywalking.plugin.PluginBootstrap.CLASS_TYPE_POOL;
import com.ai.cloud.skywalking.plugin.PluginException;
import com.ai.cloud.skywalking.util.StringUtil;
public abstract class AbstractClassEnhancePluginDefine implements IPlugin { public abstract class AbstractClassEnhancePluginDefine implements IPlugin {
private static Logger logger = LogManager.getLogger(AbstractClassEnhancePluginDefine.class); private static Logger logger = LogManager.getLogger(AbstractClassEnhancePluginDefine.class);
@Override @Override
public void define() throws PluginException { public void define() throws PluginException {
String interceptorDefineClassName = this.getClass().getName(); String interceptorDefineClassName = this.getClass().getName();
String enhanceOriginClassName = getBeInterceptedClassName(); String enhanceOriginClassName = enhanceClassName();
if (StringUtil.isEmpty(enhanceOriginClassName)) { if (StringUtil.isEmpty(enhanceOriginClassName)) {
logger.warn("classname of being intercepted is not defined by {}.", logger.warn("classname of being intercepted is not defined by {}.",
interceptorDefineClassName); interceptorDefineClassName);
...@@ -38,13 +37,27 @@ public abstract class AbstractClassEnhancePluginDefine implements IPlugin { ...@@ -38,13 +37,27 @@ public abstract class AbstractClassEnhancePluginDefine implements IPlugin {
return; return;
} }
/**
* find witness classes for enhance class
*/
String[] witnessClasses = witnessClasses();
if(witnessClasses != null) {
for (String witnessClass : witnessClasses) {
Resolution witnessClassResolution = CLASS_TYPE_POOL.describe(witnessClass);
if (!witnessClassResolution.isResolved()) {
logger.warn("enhance class {} by plugin {} is not working. Because witness class {} is not existed.", enhanceOriginClassName, interceptorDefineClassName, witnessClass);
return;
}
}
}
/** /**
* find origin class source code for interceptor * find origin class source code for interceptor
*/ */
DynamicType.Builder<?> newClassBuilder = new ByteBuddy() DynamicType.Builder<?> newClassBuilder = new ByteBuddy()
.rebase(resolution.resolve(), .rebase(resolution.resolve(),
ClassFileLocator.ForClassLoader.ofClassPath()); ClassFileLocator.ForClassLoader.ofClassPath());
newClassBuilder = this.enhance(enhanceOriginClassName, newClassBuilder); newClassBuilder = this.enhance(enhanceOriginClassName, newClassBuilder);
/** /**
...@@ -59,14 +72,24 @@ public abstract class AbstractClassEnhancePluginDefine implements IPlugin { ...@@ -59,14 +72,24 @@ public abstract class AbstractClassEnhancePluginDefine implements IPlugin {
logger.debug("enhance class {} by {} completely.", logger.debug("enhance class {} by {} completely.",
enhanceOriginClassName, interceptorDefineClassName); enhanceOriginClassName, interceptorDefineClassName);
} }
protected abstract DynamicType.Builder<?> enhance(String enhanceOriginClassName, DynamicType.Builder<?> newClassBuilder) throws PluginException; protected abstract DynamicType.Builder<?> enhance(String enhanceOriginClassName, DynamicType.Builder<?> newClassBuilder) throws PluginException;
/**
* 返回要被增强的类,应当返回类全名
*
* @return
*/
protected abstract String enhanceClassName();
/** /**
* 返回要被增强的类,应当返回类全名 * 返回一个类名的列表
* * 如果列表中的类在JVM中存在,则enhance可以会尝试生效
* @return *
*/ * @return
protected abstract String getBeInterceptedClassName(); */
protected String[] witnessClasses(){
return new String[]{};
}
} }
...@@ -10,7 +10,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.PrivateMethodMatcher; ...@@ -10,7 +10,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.PrivateMethodMatcher;
*/ */
public class TestMatcherDefine extends ClassInstanceMethodsEnhancePluginDefine { public class TestMatcherDefine extends ClassInstanceMethodsEnhancePluginDefine {
@Override @Override
public String getBeInterceptedClassName() { public String enhanceClassName() {
return "test.ai.cloud.matcher.TestMatcherClass"; return "test.ai.cloud.matcher.TestMatcherClass";
} }
......
...@@ -9,7 +9,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; ...@@ -9,7 +9,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher;
public class TestInterceptorDefine extends ClassEnhancePluginDefine { public class TestInterceptorDefine extends ClassEnhancePluginDefine {
@Override @Override
public String getBeInterceptedClassName() { public String enhanceClassName() {
return "test.ai.cloud.plugin.BeInterceptedClass"; return "test.ai.cloud.plugin.BeInterceptedClass";
} }
......
...@@ -17,7 +17,7 @@ public class DubboPluginDefine extends ClassStaticMethodsEnhancePluginDefine { ...@@ -17,7 +17,7 @@ public class DubboPluginDefine extends ClassStaticMethodsEnhancePluginDefine {
} }
@Override @Override
protected String getBeInterceptedClassName() { protected String enhanceClassName() {
return "com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper"; return "com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper";
} }
} }
...@@ -6,7 +6,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; ...@@ -6,7 +6,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher;
public class AbstractHttpClientPluginDefine extends HttpClientPluginDefine { public class AbstractHttpClientPluginDefine extends HttpClientPluginDefine {
@Override @Override
public String getBeInterceptedClassName() { public String enhanceClassName() {
return "org.apache.http.impl.client.AbstractHttpClient"; return "org.apache.http.impl.client.AbstractHttpClient";
} }
......
...@@ -10,7 +10,7 @@ public class DefaultRequestDirectorPluginDefine extends HttpClientPluginDefine { ...@@ -10,7 +10,7 @@ public class DefaultRequestDirectorPluginDefine extends HttpClientPluginDefine {
* since 4.3, this class is Deprecated. * since 4.3, this class is Deprecated.
*/ */
@Override @Override
public String getBeInterceptedClassName() { public String enhanceClassName() {
return "org.apache.http.impl.client.DefaultRequestDirector"; return "org.apache.http.impl.client.DefaultRequestDirector";
} }
......
...@@ -10,7 +10,7 @@ public class InternalHttpClientPluginDefine extends HttpClientPluginDefine { ...@@ -10,7 +10,7 @@ public class InternalHttpClientPluginDefine extends HttpClientPluginDefine {
} }
@Override @Override
public String getBeInterceptedClassName() { public String enhanceClassName() {
return "org.apache.http.impl.client.InternalHttpClient"; return "org.apache.http.impl.client.InternalHttpClient";
} }
......
...@@ -10,7 +10,7 @@ public class MinimalHttpClientPluginDefine extends HttpClientPluginDefine { ...@@ -10,7 +10,7 @@ public class MinimalHttpClientPluginDefine extends HttpClientPluginDefine {
} }
@Override @Override
public String getBeInterceptedClassName() { public String enhanceClassName() {
return "org.apache.http.impl.client.MinimalHttpClient"; return "org.apache.http.impl.client.MinimalHttpClient";
} }
......
...@@ -9,7 +9,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.AnyMethodsMatcher; ...@@ -9,7 +9,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.AnyMethodsMatcher;
public class JedisClusterPluginDefine extends ClassInstanceMethodsEnhancePluginDefine { public class JedisClusterPluginDefine extends ClassInstanceMethodsEnhancePluginDefine {
@Override @Override
public String getBeInterceptedClassName() { public String enhanceClassName() {
return "redis.clients.jedis.JedisCluster"; return "redis.clients.jedis.JedisCluster";
} }
......
...@@ -11,7 +11,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher; ...@@ -11,7 +11,7 @@ import com.ai.cloud.skywalking.plugin.interceptor.matcher.SimpleMethodMatcher;
public class JedisPluginDefine extends ClassInstanceMethodsEnhancePluginDefine { public class JedisPluginDefine extends ClassInstanceMethodsEnhancePluginDefine {
@Override @Override
public String getBeInterceptedClassName() { public String enhanceClassName() {
return "redis.clients.jedis.Jedis"; return "redis.clients.jedis.Jedis";
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册