分布式追踪 SkyWalking 源码分析二 Agent 插件相关

AgentClassLoader  类加载器

下面看findClass方法

1.首先根据入参name,解析出path

  1.1 获取allJars

2.循环每个jar,然后根据path解析出jarEntry和classFileUrl地址

3.使用输入流写入到data

4.利用反射生成类Class

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

插件资源解析

skywalking的资源定义,必须以skywalking-plugin.def命名

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

AbstractClassEnhancePluginDefine 抽象增强基类
不同插件通过实现 AbstractClassEnhancePluginDefine 抽象类,定义不同框架的切面,记录调用链路

类名匹配,类注解匹配,基于父类匹配

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

插件拦截

SkyWalking 通过 JavaAgent 机制,对需要拦截的类的方法,使用 byte-buddy 动态修改 Java 类的二进制,从而进行方法切面拦截,记录调用链路。

看具体的代码实现之前,想一下拦截会涉及到哪些元素 :

  • 拦截切面 InterceptPoint
  • 拦截器 Interceptor
  • 拦截类的定义 Define :一个类有哪些拦截切面及对应的拦截器

直接看增强实现enhance

1.enhanceClass 对静态方法增强

2.enhanceInstance 对构造方法和实例方法进行增强

  2.1 对构造方法增强

2.2 对实例方法增强

++++++++++++++++++++++++++++++++++++++++++++++++++++++

InterceptPoint 拦截点,每个插件都需要实现这个拦截器接口

以下为构造函数实现后的拦截

还有环绕拦截的接口InstanceMethodsAroundInterceptor

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

拦截器,提供了一个在byte-buddy和sky-walking插件之间的桥

先看ConstructorInter,对构造方法的拦截

1.在目标类的构造函数完成后,进行拦截,执行增强方法onConstruct

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

再看InstMethodsInter,对实例方法进行拦截

1.构造函数还是先加载对应的interceptor

2.对目标实例方法进行拦截,提供beforeMethod,hanlleMethodException和afterMethod

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

静态方法的interceptor实现  StaticMethodsInter,具体实现和实例方法的拦截器很类似

    

发布了331 篇原创文章 · 获赞 1 · 访问量 3516

猜你喜欢

转载自blog.csdn.net/kuaipao19950507/article/details/103649170