前言
其实Skywalking已经有了这个自定义增强插件了,但是本人一开始没发现有着玩意,线上应用的特殊的非标节点和链路没识别出来,所以就亲自操刀写了一个还不错的自定义增强插件了(customize-enhance-plugin)。当然代码优雅度上应该是官方的占优,但是我因为了解业务场景的痛点,所以也有一定的可取之处吧。
好了,废话不多说,上代码!
配置先行
新建general-1.0-plugin模块
在resources文件夹下新建skywalking-plugin.def文件,内容如下:
furion-general-1.0=com.ant.furion.apm.plugin.general.GeneralInstrumentation
furion-general-1.0=com.ant.furion.apm.plugin.general.GeneralStaticInstrumentation
定义拦截器
import net.bytebuddy.description.NamedElement;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.matcher.ElementMatcher;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
import org.apache.skywalking.apm.agent.core.plugin.match.MultiClassNameMatch;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.ant.furion.apm.plugin.general.GeneralPluginConfig.Plugin.General.ENHANCE_CLASS;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.none;
import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType;
/**
* 通用的拦截器增强类
*/
public class GeneralInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
private static final String INTERCEPT_CLASS = "com.ant.furion.apm.plugin.general.GeneralInterceptor";
static {
initConfig();
}
private static void initConfig() {
//TODO 读取远程配置中心的配置数据进行配置赋值
GeneralPluginConfig.Plugin.General.ENHANCE_CLASS = new String[]{
// "com.abilitycenter.PartnerEtcInvoiceMini.handler.invoice.QueryInvoiceDetailHandler",
"com.example.zipkin1.user.UserController"
};
GeneralPluginConfig.Plugin.EnhanceMethodConfig enhanceConfig1 = new GeneralPluginConfig.Plugin.EnhanceMethodConfig();
enhanceConfig1.REMOTE_CALL = false;
enhanceConfig1.ENHANCE_METHOD = "callMethod2";
Map<Integer, String> ARGUMENT_WITH_TYPE_MAP1 = new HashMap<>();
ARGUMENT_WITH_TYPE_MAP1.put(0, "java.lang.String");
enhanceConfig1.ARGUMENT_WITH_TYPE_MAP = ARGUMENT_WITH_TYPE_MAP1;
GeneralPluginConfig.Plugin.EnhanceMethodConfig enhanceConfig2 = new GeneralPluginConfig.Plugin.EnhanceMethodConfig();
enhanceConfig2.REMOTE_CALL = false;
enhanceConfig2.ENHANCE_METHOD = "callMethod2";
Map<Integer, String> ARGUMENT_WITH_TYPE_MAP2 = new HashMap<>();
ARGUMENT_WITH_TYPE_MAP2.put(0, "java.lang.String");
ARGUMENT_WITH_TYPE_MAP2.put(1, "java.lang.Integer");
enhanceConfig2.ARGUMENT_WITH_TYPE_MAP = ARGUMENT_WITH_TYPE_MAP2;
List<GeneralPluginConfig