pinpoint的插件包中有依赖第三方jar的类,这样类加载器加载不会有问题?
pinpoint agent目录结构
boot是bootStrapClassLoader加载
lib是pinpoint自定义的类加载器加载,
tools下的jar包pinpoint类加载器加载。
plugin下的jar包,这些只有某个插件被用到了,
才会被应用类加载器加载。如果没用用到这个插件的话,这个插件jar包不会被加载。
pinpoint agent大体流程:
1.启动加载agent目录下的jar,解析相关参数
2.直接进入到PinpointBootStrap类下的premain函数:监听类加载事件
java.lang.instrument.ClassFileTransformer.transform(ClassLoader, String, Class>, ProtectionDomain, byte[])
3.根据启动配置找到匹配的Class对应的插件jar,使用当前的应用ClassLoader加载这个插件。
4.匹配class对应的方法有哪些拦截器。通过asm,javassist对该方法进去织入字节码。(具体的字节码代码字符串又相关拦截器封装组成)(方法前后,异常处)
5.生成新得class字节码对象返回。
6.实现字节码得aop拦截,注入相关业务代码。
注意点:
agent核心会依赖一些第三方公用jar包,比如日志什么得
agent核心不会依赖插件中得第三方jar
agent插件jar中java代码会有第三方jar包得引用代码。但是这个插件jar不会打入第三方jar包代码。只有判断应用层需要这个插件jar才会去加载这个jar。所以这个插件jar包不需要直接包含第三方jar包,只需要代码里面包含就好了。应用程序里面已经包含了这个第三方jar。
agent启动加载
ClassFileTransformerDispatcher
com.navercorp.pinpoint.profiler.plugin.MatchableClassFileTransformerGuardDelegate.transform(ClassLoader, String, Class>, ProtectionDomain, byte[])
com.navercorp.pinpoint.profiler.instrument.JavassistMethod
com.navercorp.pinpoint.profiler.instrument.interceptor.InvokeBeforeCodeGenerator.generate()
参考:
文章来源: www.oschina.net,作者:xiaomin0322,版权归原作者所有,如需转载,请联系作者。
原文链接:https://my.oschina.net/xiaominmin/blog/3142272