1. 概述
本文主要分享 SkyWalking Agent 啟動初始化的過程。
SkyWalking Agent 基于 JavaAgent 機制,實作應用透明接入 SkyWalking 。關于 JavaAgent 機制,筆者推薦如下兩篇文章 :
- 《Instrumentation 新功能》
- 《JVM源碼分析之javaagent原理完全解讀》
友情提示 :建議自己手撸一個簡單的 JavaAgent ,更容易了解 SkyWalking Agent 。
筆者練手的 JavaAgent 項目位址 :https://github.com/YunaiV/learning/tree/master/javaagent01
2. SkyWalkingAgent
org.skywalking.apm.agent.SkyWalkingAgent
,在
apm-sniffer/apm-agent
Maven 子產品項目裡,SkyWalking Agent 啟動入口。為什麼說它是啟動入口呢?在
apm-sniffer/apm-agent
的
pom.xml
檔案的【第 73 行】,我們可以看到 SkyWalkingAgent 被配置成 JavaAgent 的 PremainClass 。
#premain(...)
方法,代碼如下 :
- 第 58 行 :調用
方法,初始化 Agent 配置。SnifferConfigInitializer#initialize()
- 第 61 行 :調用
方法,加載 Agent 插件們。而後,建立 PluginFinder 。PluginBootstrap#loadPlugins()
- 第 64 行 :調用
方法,初始化 Agent 服務管理。在這過程中,Agent 服務們會被初始化。ServiceManager#boot()
- 第 79 至 133 行 :基于 byte-buddy ,初始化 Instrumentation 的
。java.lang.instrument.ClassFileTransformer
3. SnifferConfigInitializer
org.skywalking.apm.agent.core.conf.SnifferConfigInitializer
,Agent 配置初始化器。
在看具體代碼實作之前,我們先看下
org.skywalking.apm.agent.core.conf
包的大體結構 :
配置類有 Config 和 RemoteDownstreamConfig 兩種。從命名上可以看出 :
- Config 為 Agent 本地配置類,使用 SnifferConfigInitializer 進行初始化。
- RemoteDownstreamConfig 為 Agent 遠端配置類,從 Collector Server 讀取。
#initialize()
方法,初始化 Agent 本地配置,代碼如下 :
- 第 59 至 67 行 :從配置檔案(
) 加載配置。配置檔案所在固定路徑為agent.config
,其中${AGENT_PACKAGE_PATH}/config/agent.config
通過${AGENT_PACKAGE_PATH}
初始化。Agent 整理目錄如下圖 :org.skywalking.apm.agent.core.boot.AgentPackagePath
- 第 70 至 74 行 :從環境變量覆寫配置。環境變量 Key 需以
開頭。例如,"skywalking."
在Config.Agent.APPLICATION_CODE
為agent.config
,環境變量為agent.application_code
。另外,環境變量包括 JVM 程序的和系統的。skywalking.agent.application_code
- 第 77 至 82 行 :校驗配置是否正确加載。
3.1 Config
org.skywalking.apm.agent.core.conf.Config
,Agent 本地配置類。
打開 Config ,我們會看到拆分了 Agent / Collector / Jvm / Buffer / Dictionary / Logging / Plugin 七個小類。如下圖 :
本文暫不對配置項詳細解析,胖友可以看下每個屬性的英文注釋。
3.2 RemoteDownstreamConfig
org.skywalking.apm.agent.core.conf.RemoteDownstreamConfig
,Agent 遠端配置類。
打開 RemoteDownstreamConfig ,我們會看到拆分了 Agent / Collector 兩小類。如下圖 :
本文暫不對配置項詳細解析,胖友可以看下每個屬性的英文注釋。
4. Plugin
SkyWalking Agent 提供了多種插件,實作不同架構的透明接入 SkyWalking 。在 《官方文檔 —— supported list》 裡,有目前的插件清單。
另外,在
apm-sniffer/apm-sdk-plugin
目錄下,有插件的實作代碼 :
本小節會分享的較為簡單,在 《SkyWalking 源碼分析 —— Agent 插件體系》 詳細解析。
4.1 PluginBootstrap
org.skywalking.apm.agent.core.plugin.PluginBootstrap
,插件引導程式類,建立需要加載的插件對象數組。
#loadPlugins()
方法,代碼如下 :
- 第 47 行 :初始化 AgentClassLoader 。
- 第 50 至 56 行 :獲得插件定義路徑數組。
- 第 59 至 66 行 :獲得插件定義(
)數組。org.skywalking.apm.agent.core.plugin.PluginDefine
- 第 69 至 82 行 :建立類增強插件定義(
)對象數組。不同插件通過實作 AbstractClassEnhancePluginDefine 抽象類,定義不同架構的切面,記錄調用鍊路。以 Spring 插件為例子,如下是相關類圖 :org.skywalking.apm.agent.core.plugin.AbstractClassEnhancePluginDefine
4.2 PluginFinder
org.skywalking.apm.agent.core.plugin.PluginFinder
,插件發現者。其提供
#find(...)
方法,獲得類增強插件定義(
org.skywalking.apm.agent.core.plugin.AbstractClassEnhancePluginDefine
)對象。
PluginFinder 構造方法,代碼如下 :
- 第 57 至 77 行 :循環 AbstractClassEnhancePluginDefine 對象數組,添加到
/nameMatchDefine
屬性,友善signatureMatchDefine
方法查找 AbstractClassEnhancePluginDefine 對象。#find(...)
- 第 65 至 72 行 :處理 NameMatch 為比對的 AbstractClassEnhancePluginDefine 對象,添加到
屬性。nameMatchDefine
- 第 74 至 76 行 :處理非 NameMatch 為比對的 AbstractClassEnhancePluginDefine 對象,添加到
屬性。signatureMatchDefine
- 第 65 至 72 行 :處理 NameMatch 為比對的 AbstractClassEnhancePluginDefine 對象,添加到
5. ServiceManager
org.skywalking.apm.agent.core.boot.ServiceManager
,BootService 管理器。負責管理、初始化 BootService 執行個體們。
#boot()
方法,代碼如下 :
- 第 47 行 :調用
方法,加載所有 BootService 實作類的執行個體數組。ServiceManager 基于 SPI (Service Provider Interface) 機制,在 /resources/META-INF.services/org.skywalking.apm.agent.core.boot.BootService 檔案裡,定義了所有 BootService 的實作類。如果胖友對 SPI 機制不熟悉,可以看下如下文章 :#loadAllServices()
- 《SPI 和 ServiceLoader》
- 《跟我學Dubbo系列之Java SPI機制簡介》
- 第 50 行 :調用
方法,調用每個#beforeBoot()
方法。BootService#beforeBoot()
- 第 52 行 :調用
方法,調用每個#startup()
方法。BootService#boot()
- 第 54 行 :調用
方法,調用每個#afterBoot()
方法。BootService#afterBoot()
5.1 BootService
org.skywalking.apm.agent.core.boot.BootService
,Agent 啟動服務接口,定義了
#beforeBoot()
/
#boot()
/
#afterBoot()
/
#shutdown()
接口方法。
BootService 目前有七個實作類,在後續的文章,我們會解析相關實作。