skywalking源码学习
入口类 org.skywalking.apm.agent.SkyWalkingAgent(版本3.2.5)
1、主方法:
(1)agentArgs 是 premain 函数得到的程序参数,随同 “– javaagent”一起传入。
与 main 函数不同的是,这个参数是一个字符串而不是一个字符串数组,如果程序参数有多个,程序将自行解析这个字符串。
(2)instrumentation 是一个 java.lang.instrument.Instrumentation 的实例,由 JVM 自动传入。
java.lang.instrument.Instrumentation 是 instrument 包中定义的一个接口,也是这个包的核心部分,
集中了其中几乎所有的功能方法,例如类定义的转换和操作等等。
2、初始化配置 /config/agent.config
(1)通过几种方式初始化配置
查找agent.config
配置除了通过/config/agent.config文件外,可以通过环境变量和VM参数(-D)来进行设置
参数的key = skywalking. + agent.config文件中的key
优先级:系统环境变量 > VM参数(-D) > /config/agent.config中的配置
3、加载插件类
(1)找到插件并加载
* Plugins finder.
* Use {@link PluginResourcesResolver} to find all plugins,
* and ask {@link PluginCfg} to load all plugin definitions.
!!!注意:这里采用Class.forName已经对插件增强类进行了实例化
(2)提供一个插件查找器,可以根据匹配规则得到相应的插件增强类
* The PluginFinder
represents a finder , which assist to find the one
* from the given {@link AbstractClassEnhancePluginDefine} list.
4、启动服务管理器
启动所有继承了BootService的类
BootService类:
其中一个子类:JVMService
里面维护两个执行定时任务的线程池,来收集和发送JVM信息,发送给Collector
5、增加清理钩子
6、byte buddy代码增强