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,具体实现和实例方法的拦截器很类似