Skywalking自定义增强插件开发(顺便贡献了对源码的BUG修复)

本文介绍了如何开发Skywalking自定义增强插件,通过配置资源文件、定义拦截器和增强器,实现链路信息的识别。文章比较了作者的实现与官方插件的优缺点,并分享了修复源码中潜在内存泄漏问题的过程,提倡开源精神。
摘要由CSDN通过智能技术生成

前言

其实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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值