skywalking插件源码分析skywalking 插件源码分析
⼀、总览
了解插架如何使⽤,和开发者的意图。可以在阅读源码时更明⽩源码处理的含义。
1.1 启动
启动命令为什么使用bootstrap?
skywakling的使⽤插件的⽅式
java -javaagent:/path/to/skywalking-package/agent/skywalking-agent.jar -jar yourApp.jar
⽬录结构
下载的⽬录⽬录接⼝如下。
skywalking-agent.jar就是核⼼的agent.jar
activations ⽇志打印,这个⽬录下的插件会在⽇志⾥打印traceId
config 配置
plugins 会被使⽤的插件,放在这个⽬录下就能会⾃动加载
optional plugins 有代价插件。⽬录下的插件开启时会影响性能,或者开启有条件限制。就放在这个/optional-plugins下仅仅是released 。想要开启需要移动到plugins⽬录下。
bootstrap-plugins 风险插件。想要使⽤移动到plugins⽬录下。这个⽬录下的插件会有未知的风险。⽬前已知的有
Plugin of JDK HttpURLConnection. Agent is compatible with JDK 1.6+
Plugin of JDK Callable and Runnable. Agent is compatible with JDK 1.6+
1.2 写⼀个插件
sky-walking是如何做到捕获⽬标的⽅法,并⽣成trace数据的呢?
总得来讲,到⽬标⽅法,修改⽬标⽅法字节码在⽬标⽅法的前后加⼊额外的⽅法。
⼀个span的⽣成,就像恰秒表,点⼀下开始,再点⼀下结束,这段时间⾥⾯发⽣的信息被算作⼀个sp
an。
所以在before()中开始,在after()结束,就是⼀个最简单的span⽣成逻辑。
1.2.1 定义拦截规则
提供了两种拦截切点的⽅式
ClassInstanceMethodsEnhancePluginDefine 会拦截构造器和实例的⽅法
ClassStaticMethodsEnhancePluginDefine 会拦截静态⽅法
下⾯演⽰拦截的某个⽅法
定义拦截类
定义拦截点
这⾥⽤到bytebuddy的只是 ElemntMatcher就是bytebyte中⽤来匹配⽬标的⽅法,只有⼀个⽅法boolena matches(Object object)
1.2.2 配置插件定义
在⽂件 skywalking-plugin.def 中添加插件定义
1.2.3 实现⼀个
作为⼀个实例⽅法的, 需要实现。org.apache.skywalking.hance.InstanceMethodsAroundInterceptor
agent启动时,会根据前⾯的定义的拦截规则,命中要被修改的⽬标。
然后⾥⾯的⽅法会被bytebuddy,织⼊到⽬标。
织⼊之后的⾏为(⽐如before中的逻辑,则是⽤户⾃⼰定义的)。
⼀般是根据skywalking提供的⽣成span的逻辑,这个就需要开发者⾃⼰编写。
org.apache.skywalking.hance.InstanceMethodsAroundInterceptor
1.2.4 ⼀个现成的插件
如果你使⽤了httpclient这个库,你的每⼀次请求,都会到捕获⽣成⼀个span。
定义
了解过httpclient的,就很清楚,发送request是底层会调⽤doExecute()⽅法。
这⾥就是通过捕获这个⽅法,来捕获请求信息的。
org.apache.http.impl.client.AbstractHttpClient.doExecute
配置
定义了多个
定义⾏为(⽣成span)
⼆. 源码分析
2.1 源码位置

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。