文章40 | 阅读 30575 | 点赞0
本文主要分享 SkyWalking Agent 启动初始化的过程。
SkyWalking Agent 基于 JavaAgent 机制,实现应用透明接入 SkyWalking 。关于 JavaAgent 机制,笔者推荐如下两篇文章 :
笔者练手的 JavaAgent 项目地址 :https://github.com/YunaiV/learning/tree/master/javaagent01
org.skywalking.apm.agent.SkyWalkingAgent
,在 apm-sniffer/apm-agent
Maven 模块项目里,SkyWalking Agent 启动入口。为什么说它是启动入口呢?在 apm-sniffer/apm-agent
的 pom.xml
文件的【第 73 行】,我们可以看到 SkyWalkingAgent 被配置成 JavaAgent 的 PremainClass 。
#premain(...)
方法,代码如下 :
SnifferConfigInitializer#initialize()
方法,初始化 Agent 配置。PluginBootstrap#loadPlugins()
方法,加载 Agent 插件们。而后,创建 PluginFinder 。ServiceManager#boot()
方法,初始化 Agent 服务管理。在这过程中,Agent 服务们会被初始化。java.lang.instrument.ClassFileTransformer
。org.skywalking.apm.agent.core.conf.SnifferConfigInitializer
,Agent 配置初始化器。
在看具体代码实现之前,我们先看下 org.skywalking.apm.agent.core.conf
包的大体结构 :
配置类有 Config 和 RemoteDownstreamConfig 两种。从命名上可以看出 :
#initialize()
方法,初始化 Agent 本地配置,代码如下 :
agent.config
) 加载配置。配置文件所在固定路径为 ${AGENT_PACKAGE_PATH}/config/agent.config
,其中 ${AGENT_PACKAGE_PATH}
通过 org.skywalking.apm.agent.core.boot.AgentPackagePath
初始化。Agent 整理目录如下图 :"skywalking."
开头。例如,Config.Agent.APPLICATION_CODE
在 agent.config
为 agent.application_code
,环境变量为 skywalking.agent.application_code
。另外,环境变量包括 JVM 进程的和系统的。org.skywalking.apm.agent.core.conf.Config
,Agent 本地配置类。
打开 Config ,我们会看到拆分了 Agent / Collector / Jvm / Buffer / Dictionary / Logging / Plugin 七个小类。如下图 :
本文暂不对配置项详细解析,胖友可以看下每个属性的英文注释。
org.skywalking.apm.agent.core.conf.RemoteDownstreamConfig
,Agent 远程配置类。
打开 RemoteDownstreamConfig ,我们会看到拆分了 Agent / Collector 两小类。如下图 :
本文暂不对配置项详细解析,胖友可以看下每个属性的英文注释。
SkyWalking Agent 提供了多种插件,实现不同框架的透明接入 SkyWalking 。在 《官方文档 —— supported list》 里,有目前的插件列表。
另外,在 apm-sniffer/apm-sdk-plugin
目录下,有插件的实现代码 :
本小节会分享的较为简单,在 《SkyWalking 源码分析 —— Agent 插件体系》 详细解析。
org.skywalking.apm.agent.core.plugin.PluginBootstrap
,插件引导程序类,创建需要加载的插件对象数组。
#loadPlugins()
方法,代码如下 :
org.skywalking.apm.agent.core.plugin.PluginDefine
)数组。org.skywalking.apm.agent.core.plugin.AbstractClassEnhancePluginDefine
)对象数组。不同插件通过实现 AbstractClassEnhancePluginDefine 抽象类,定义不同框架的切面,记录调用链路。以 Spring 插件为例子,如下是相关类图 :org.skywalking.apm.agent.core.plugin.PluginFinder
,插件发现者。其提供 #find(...)
方法,获得类增强插件定义( org.skywalking.apm.agent.core.plugin.AbstractClassEnhancePluginDefine
)对象。
PluginFinder 构造方法,代码如下 :
第 57 至 77 行 :循环 AbstractClassEnhancePluginDefine 对象数组,添加到 nameMatchDefine
/ signatureMatchDefine
属性,方便 #find(...)
方法查找 AbstractClassEnhancePluginDefine 对象。
第 65 至 72 行 :处理 NameMatch 为匹配的 AbstractClassEnhancePluginDefine 对象,添加到 nameMatchDefine
属性。
第 74 至 76 行 :处理非 NameMatch 为匹配的 AbstractClassEnhancePluginDefine 对象,添加到 signatureMatchDefine
属性。
org.skywalking.apm.agent.core.boot.ServiceManager
,BootService 管理器。负责管理、初始化 BootService 实例们。
#boot()
方法,代码如下 :
第 47 行 :调用 #loadAllServices()
方法,加载所有 BootService 实现类的实例数组。ServiceManager 基于 SPI (Service Provider Interface) 机制,在 /resources/META-INF.services/org.skywalking.apm.agent.core.boot.BootService 文件里,定义了所有 BootService 的实现类。如果胖友对 SPI 机制不熟悉,可以看下如下文章 :
第 50 行 :调用 #beforeBoot()
方法,调用每个 BootService#beforeBoot()
方法。
第 52 行 :调用 #startup()
方法,调用每个 BootService#boot()
方法。
第 54 行 :调用 #afterBoot()
方法,调用每个 BootService#afterBoot()
方法。
org.skywalking.apm.agent.core.boot.BootService
,Agent 启动服务接口,定义了 #beforeBoot()
/ #boot()
/ #afterBoot()
/ #shutdown()
接口方法。
BootService 目前有七个实现类,在后续的文章,我们会解析相关实现。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_42073629/article/details/119702384
内容来源于网络,如有侵权,请联系作者删除!