skywalking源碼的搭建


zh

 

 上面有兩種編譯方式

第一種是通過git clone源碼

 

 出現上面的提示是網絡原因導致下載失敗,可以參考下面的解決辦法解決

嗶哩嗶哩上面直擊痛點:一招搞定GitHub開源項目下載加速! - 1.開源項目下載優化(Av94251133,P1).mp4

 

 接下來我們要切換到tag 為v 8.2.0的代碼

執行下面的兩個命令

 

 接下來我們進入到skywalking的目錄執行下面的兩個命令

 千萬要注意上面的兩個操作不能出現錯誤

 

 

 完成上面的動作之后我們就可以開始skywalking的編譯了

執行編譯的命令如下

第二在編譯的時候一定要注意maven地址的下載,不能僅僅只配置阿里雲的倉庫的地址,還需要配置官方倉庫的下載地址,因為有的插件在阿里雲上面沒有必須到官網上面去下載,這里maven的配置倉庫地址如下

         <!-- 阿里雲倉庫 -->
        <mirror>
            <id>alimaven</id>
            <mirrorOf>central</mirrorOf>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
        </mirror>
    
        <!-- 中央倉庫1 -->
        <mirror>
            <id>repo1</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://repo1.maven.org/maven2/</url>
        </mirror>
    
        <!-- 中央倉庫2 -->
        <mirror>
            <id>repo2</id>
            <mirrorOf>central</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://repo2.maven.org/maven2/</url>
        </mirror>

在編譯的過程中報如下的錯誤

[ERROR] Failed to execute goal org.xolstice.maven.plugins:protobuf-maven-plugin:
0.6.1:compile (grpc-build) on project apm-network: protoc did not exit cleanly.
Review output for more information. -> [Help 1]

第一種網上的說法是升級maven的版本到3.6.3,我們升級了之后還是存在問題

最終的解決辦法是重啟電腦之后,在執行mvn命令居然成功了

 

在編譯skywalking的web模塊的時候,npm的倉庫我們需要修改下,不能使用官網的,使用官網的整個下載會非常的緩慢

我們進入到apm-webapp模塊,修改pom.xml文件,我們使用淘寶的地址

 

 

 

 這里即使弄成了淘寶的地址也會報錯,那么如何解決了

參考這篇博客:https://blog.csdn.net/smooth00/article/details/106921934

我們手動編譯前端工程

首先我們要先安裝成功npm工具

我們進入G:\skywalking-8.2.0-code-1206\skywalking-ui目錄下

我們執行下面的命令,我們將npm倉庫的地址設置設為

npm config set registry "http://registry.npmjs.org/"

我們不使用淘寶的鏡像倉庫的地址

接下來我們執行npm install命令

執行的過程中報下面的錯誤

PS D:\workspace\podcast-oms> npm install --registry=https://registry.npm.taobao.org
npm WARN tarball tarball data for postcss@5.2.18 (sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=) seems to be corrupted. Trying one more time.
npm ERR! path D:\workspace\podcast-oms\node_modules\.staging\postcss-8e12407f\lib\parser.js
npm ERR! code EPERM
npm ERR! errno -4048
npm ERR! syscall unlink
npm ERR! Error: EPERM: operation not permitted, unlink 'D:\workspace\podcast-oms\node_modules\.staging\postcss-8e12407f\lib\parser.js'npm ERR!  { [Error: EPERM: operation not permitted, unlink 'D:\workspace\podcast-oms\node_modules\.staging\postcss-8e12407f\lib\parser.js']
npm ERR!   cause:
npm ERR!    { Error: EPERM: operation not permitted, unlink 'D:\workspace\podcast-oms\node_modules\.staging\postcss-8e12407f\lib\parser.js'
npm ERR!      errno: -4048,
npm ERR!      code: 'EPERM',
npm ERR!      syscall: 'unlink',
npm ERR!      path:
npm ERR!       'D:\\workspace\\podcast-oms\\node_modules\\.staging\\postcss-8e12407f\\lib\\parser.js' },
npm ERR!   stack:
npm ERR!    'Error: EPERM: operation not permitted, unlink \'D:\\workspace\\podcast-oms\\node_modules\\.staging\\postcss-8e12407f\\lib\\parser.js\'',
npm ERR!   errno: -4048,
npm ERR!   code: 'EPERM',
npm ERR!   syscall: 'unlink',
npm ERR!   path:
npm ERR!    'D:\\workspace\\podcast-oms\\node_modules\\.staging\\postcss-8e12407f\\lib\\parser.js',
npm ERR!   parent: 'postcss-minify-gradients' }
npm ERR!
npm ERR! The operation was rejected by your operating system.
npm ERR! It's possible that the file was already in use (by a text editor or antivirus),
npm ERR! or that you lack permissions to access it.
npm ERR!
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator (though this is not recommended).
It's possible that the file was already in use (by a text editor or antivirus)我們把
It's possible that the file was already in use (by a text editor or antivirus)

 

 使用了上面的辦法還是沒有解決問題,我們使用阿里的cnpm來解決

https://developer.aliyun.com/mirror/NPM?from=tnpm

我們進入到skywalking-ui

執行下面的命令

npm install -g cnpm --registry=https://registry.npm.taobao.org
看到下面的就表示執行成功了

 接下來要在skywalking-ui模塊下執行cnpm-install命令

 

 

 

 

 接下來我們執行打包命令執行npm run build命令,執行成功之后打包就成功了

 

 

 

 會在skywalking-ui下面生成一個dist目錄

 

 獨立編譯成的UI dist文件,也是可以放到apm-webapp中打包的,可以將上圖dist中的文件拷貝到apm-webapp\target\classes\public下,然后修改apm-webapp\pom.xml,將npm install和build過程都注釋了:

 接下來進入到skywalking源碼目錄執行下面的編譯命令進行編譯

 

mvn  clean package install -Denforcer.skip=true  -Dmaven.test.skip=true -Dcheckstyle.skip=true
就可以進行打包了,但是在打包的過程中會報錯

 

 會報下面的錯誤

[WARNING] The assembly descriptor contains a *nix-specific root-relative-referen

因為當前是在windows環境,在binary,xml中寫的確認是linux環境的路徑,解決的辦法就是

手動的apache-skywalking-apm-8.2.0的源碼下面創建dist目錄,在dist目錄下面創建下面的目錄,將上面編譯完成的文件按照binary,xml定義的路徑拷貝到下面的文件夾中

 

 接下來我們要在idea中啟動skywalking集群的源碼

 接下來我們使用idea打開項目

 

 https://my.oschina.net/mingshashan/blog/3167233?from=groupmessage

然后查看設置生成的源代碼(主要是看potobuf文件編譯生成的源代碼)

  • apm-protocol/apm-network/target/generated-sources/protobuf 選中這個目錄下面的grpc-javajava,然后右鍵選擇Mark Directory As-->Generated Sources Root如下圖所示

  • oap-server/server-core/target/generated-sources/protobuf目錄的grpc-java 和 java 文件夾Mark Directory As-->Generated Sources Root

  • oap-server/server-receiver-plugin/receiver-proto/target/generated-sources/protobuf 目錄的grpc-java 和 java 文件夾Mark Directory As-->Generated Sources Root

  • oap-server/exporter/target/generated-sources/protobuf目錄的grpc-java 和 java 文件夾Mark Directory As-->Generated Sources Root

  • oap-server/server-configuration/grpc-configuration-sync/target/generated-sources/protobuf目錄的grpc-java 和 java 文件夾Mark Directory As-->Generated Sources Root

  • oap-server/oal-grammar/target/generated-sources目錄的grpc-java 和 java 文件夾Mark Directory As-->Generated Sources Root

 這里只需要導入上面的幾個目錄作為源碼目錄,如果多導入就會代碼報錯,下面我就是多導入了下面的目錄結果在編譯的時候代碼就發生了異常,antlr4這個目錄是不能被導入成源碼的

 

 第二個代碼的源碼中包下面的錯誤

 

 我用的idea版本是2018的版本,我安裝了lombook的插件,但是本地使用的maven版本是3.6.3版本,我把maven版本更換成3.3.9版本就好了

 

 

 

第二種是直接從apache skywalking下載的源碼,直接編譯

 這里我采用的是第二種直接從從apache skywalking下載的源碼,直接編譯

進入到skywalking源碼目錄執行下面的編譯命令進行編譯

mvn  clean package install -Denforcer.skip=true  -Dmaven.test.skip=true -Dcheckstyle.skip=true

在編譯的過程中報probuffer協議編譯失敗,無論如何都搞不定,結果重啟電腦之后,再次編譯就好了、

 

 

 

 

 

 首先skywalking中存在前端

一定要保證npm 和node已經安裝成功

 

 

 

 

 

 上面保存的原因是node-8.17.0-win-x64.zip文件下載失敗,我們需要手動下載node-8.17.0-win-x64.zip放在對應的maven庫中,接下來在編譯的時候報錯

 

 

 

 我們需要將npm倉庫的地址換成國內的倉庫地址

並且需要把 apm-webapp工程的pom文件中npm的下載地址改成國內的,不然訪問在編譯過程中會因為訪問不了國外的倉庫而報錯

 

 

上面的編譯成功之后,我們需要將代碼 導入到eclipse中

 

 

 我們在eclipse中需要將編譯之后的文件夾設置為源碼

eclipse設置源碼的方式如所示

 

 

 

  • 設置 gRPC 的自動生成的代碼目錄,為源碼目錄 :
  • 將 apm-protocol/apm-network/target/generated-sources/protobuf 目錄下面grpc-java 和 java 目錄右鍵設置為 Generated Rources Root 。
  • 將 oap-server/server-core/target/generated-sources/protobuf 目錄下面grpc-java 和 java目錄右鍵設置為 Generated Rources Root 。
  • 將 oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/target/generated-sources/protobuf目錄下面grpc-java 和 java 目錄右鍵設置為 Generated Rources Root 。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IDEA 運行

skywalking的源碼中存在lombok組件,我們需要安裝lombok的插件

  1. 首先我們需要安裝IntelliJ IDEA中的lombok插件,打開IntelliJ IDEA后點擊菜單欄中的File-->Settings,或者使用快捷鍵Ctrl+Alt+S進入到設置頁面。

    IntelliJ IDEA lombok插件的安裝和使用
  2. 我們點擊設置中的Plugins進行插件的安裝,在右側選擇Browse repositories...,然后在搜索頁面輸入lombok變可以查詢到下方的Lombok Plugin,鼠標點擊Lombok Plugin可在右側看到Install按鈕,點擊該按鈕便可安裝。

    IntelliJ IDEA lombok插件的安裝和使用
    IntelliJ IDEA lombok插件的安裝和使用
    IntelliJ IDEA lombok插件的安裝和使用
    IntelliJ IDEA lombok插件的安裝和使用
  3. 我們在安裝頁面可以看到lombok具體支持的所有注解,在安裝過程中有Downloading Plugins的提示,安裝過程中進度條會變化。需要提醒的是,在安裝過程中一定要保證網絡連接可用且良好,否則可能會安裝失敗。安裝成功后我們可以看到右側的Restart按鈕,此時可先不操作,因為我們還有后續的配置工作。安裝完成后我們再回到Plugins,此時在右側可以搜索到lombok,而安裝前是不行的。

    IntelliJ IDEA lombok插件的安裝和使用
    IntelliJ IDEA lombok插件的安裝和使用
    IntelliJ IDEA lombok插件的安裝和使用
    IntelliJ IDEA lombok插件的安裝和使用
    END

配置注解處理器

 
  1. 同樣我們在Settings設置頁面,我們點擊Build,Execution,Deployment-->選擇Compiler-->選中Annotation Processors,然后在右側勾選Enable annotation processing即可。

    END

lombok插件的使用

 
  1. 使用前我們需要說明的是安裝的插件只是一個調用,就像我們使用maven插件一樣,本機需要安裝maven才行。我們在使用lombok前也需要添加lombok的依賴。lombok的版本一直在更新,大家可以在百度搜索框輸入lombok maven找到最新的依賴版本。

    <dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.16.10</version></dependency>

  2.  

     

     

     

     

     

    2

    接下來我們編輯一個實體類Student,添加三個屬性,最后在類上添加@Data屬性,這個注解可以幫我們在.class文件中生成類中所有屬性的get/set方法、equals、canEqual、hashCode、toString方法等。

  3. 第二

apm-agent-core是skywalking的核心類,打包會生產skywalking-agent.jar這個包

微內核架構
SkyWalking Agent 采用了微內核架構(Microkernel Architecture),那什么是微內核架構呢?微內核架構也被稱為插件化架構(Plug-in Architecture),是一種面向功能進行拆分的可擴展性架構。在基於產品的應用中通常會使用微內核架構,例如,IDEA、Eclipse 這類 IDE 開發工具,內核都是非常精簡的,對 Maven、Gradle 等新功能的支持都是以插件的形式增加的。

如下圖所示,微內核架構分為核心系統和插件模塊兩大部分。

 

 

 

 

idea在編譯skywalking的時候,發現項目的java源碼沒有編譯的情況

第一要保證idea的jdk設置正確

 

 

項目無法編譯運行的問題要設置上圖保證maven正確要編譯項目

 

 

 

 

 

 

 

在上圖展示的微內核架構中,內核功能是比較穩定的,只負責管理插件的生命周期,不會因為系統功能的擴展而不斷進行修改。功能上的擴展全部封裝到插件之中,插件模塊是獨立存在的模塊,包含特定的功能,能拓展核心系統的功能。通常,不同的插件模塊互相之間獨立,當然,你可以設計成一個插件依賴於另外一個插件,但應盡量讓插件之間的相互依賴關系降低到最小,避免繁雜的依賴帶來擴展性問題。

最終所有插件會由內核系統統一接入和管理:

首先,內核系統必須知道要加載哪些插件,一般會通過配置文件或是掃描 ClassPath 的方式(例如前文介紹的 SPI 技術)確定待加載的插件;
之后,內核系統還需要了解如何使用這些插件,微內核架構中需要定義一套插件的規范,內核系統會按照統一的方式初始化、啟動這些插件;
最后,雖然插件之間完全解耦,但實際開發中總會有一些意想不到的需求會導致插件之間產生依賴或是某些底層插件被復用,此時內核需要提供一套規則,識別插件消息並能正確的在插件之間轉發消息,成為插件消息的中轉站。
由此可見微內核架構的好處:

測試成本下降。從軟件工程的角度看,微內核架構將變化的部分和不變的部分拆分,降低了測試的成本,符合設計模式中的開放封閉原則。
穩定性。由於每個插件模塊相對獨立,即使其中一個插件有問題,也可以保證內核系統以及其他插件的穩定性。
可擴展性。在增加新功能或接入新業務的時候,只需要新增相應插件模塊即可;在進行歷史功能下線時,也只需刪除相應插件模塊即可。
SkyWalking Agent 就是微內核架構的一種落地方式。在前面的課時中我已經介紹了 SkyWalking 中各個模塊的功能,其中 apm-agent-core 模塊對應微內核架構中的內核系統,apm-sdk-plugin 模塊中的各個子模塊都是微內核架構中的插件模塊。

SkyWalking Agent 啟動流程概述
此前,在搭建 SkyWalking 源碼環境的最后,我們嘗試 Debug 了一下 SkyWalking Agent 的源碼,其入口是 apm-agent 模塊中 SkyWalkingAgent 類的 premain() 方法,其中完成了 Agent 啟動的流程:

初始化配置信息。該步驟中會加載 agent.config 配置文件,其中會檢測 Java Agent 參數以及環境變量是否覆蓋了相應配置項。
查找並解析 skywalking-plugin.def 插件文件。
AgentClassLoader 加載插件。
PluginFinder 對插件進行分類管理。
使用 Byte Buddy 庫創建 AgentBuilder。這里會根據已加載的插件動態增強目標類,插入埋點邏輯。
使用 JDK SPI 加載並啟動 BootService 服務。BootService 接口的實現會在后面的課時中展開詳細介紹。
添加一個 JVM 鈎子,在 JVM 退出時關閉所有 BootService 服務。
SkywalkingAgent.premain() 方法的具體實現如下,其中省略了 try/catch 代碼塊以及異常處理邏輯:

復制代碼
public static void premain(String agentArgs,
      Instrumentation instrumentation) throws PluginException {
   // 步驟1、初始化配置信息
   SnifferConfigInitializer.initialize(agentArgs);
   // 步驟2~4、查找並解析skywalking-plugin.def插件文件;
   // AgentClassLoader加載插件類並進行實例化;PluginFinder提供插件匹配的功能
   final PluginFinder pluginFinder = new PluginFinder(
      new PluginBootstrap().loadPlugins());
   // 步驟5、使用 Byte Buddy 庫創建 AgentBuilder
   final ByteBuddy byteBuddy = new ByteBuddy()
      .with(TypeValidation.of(Config.Agent.IS_OPEN_DEBUGGING_CLASS));
   new AgentBuilder.Default(byteBuddy)...installOn(instrumentation);
   // 這里省略創建 AgentBuilder的具體代碼,后面展開詳細說
   // 步驟6、使用 JDK SPI加載的方式並啟動 BootService 服務。
   ServiceManager.INSTANCE.boot();
   // 步驟7、添加一個JVM鈎子
   Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
     public void run() { ServiceManager.INSTANCE.shutdown(); }
   }, "skywalking service shutdown thread"));
}
了解了 SkyWalking Agent 啟動的核心步驟之后,本課時剩余部分將對每個步驟進行深入分析。

初始化配置
在啟動 demo-webapp 和 demo-provider 兩個 demo 應用的時候,需要在 VM options 中指定 agent.confg 配置文件(skywalking_config 參數),agent.config 配置文件中的配置項如下:

復制代碼
# 當前應用的服務名稱,通過Skywalking Agent上報的Metrics、Trace數據都會
# 攜帶該信息進行標識
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
在  SnifferConfigInitializer.initialize() 方法中會將最終的配置信息填充到 Config 的靜態字段中,填充過程如下:

將 agent.config 文件中全部配置信息填充到 Config 中相應的靜態字段中。
解析系統環境變量值,覆蓋 Config 中相應的靜態字段。
解析 Java Agent 的參數,覆蓋 Config 中相應的靜態字段。
SnifferConfigInitializer.initialize() 方法的具體實現如下:

復制代碼
public static void initialize(String agentOptions) {
   // 步驟1、加載 agent.config配置文件
   InputStreamReader configFileStream = loadConfig();
   Properties properties = new Properties();
   properties.load(configFileStream);
   for (String key : properties.stringPropertyNames()) {
       String value = (String)properties.get(key);
       // 按照${配置項名稱:默認值}的格式解析各個配置項
       properties.put(key, PropertyPlaceholderHelper.INSTANCE
           .replacePlaceholders(value, properties));
   }
   // 填充 Config中的靜態字段
   ConfigInitializer.initialize(properties, Config.class);
   // 步驟2、解析環境變量,並覆蓋 Config中相應的靜態字段
   overrideConfigBySystemProp();
   // 步驟3、解析 Java Agent參數,並覆蓋 Config中相應的靜態字段
   overrideConfigByAgentOptions(agentOptions);
   // 檢測SERVICE_NAME和BACKEND_SERVICE兩個配置項,若為空則拋異常(略)
   IS_INIT_COMPLETED = true; // 更新初始化標記
}
步驟 1 中的 loadConfig() 方法會優先根據環境變量(skywalking_config)指定的 agent.config 文件路徑加載。若環境變量未指定 skywalking_ config 配置,則到 skywalking-agent.jar 同級的 config 目錄下查找 agent.confg 配置文件。

將 agent.config 文件中的配置信息加載到 Properties 對象之后,將使用 PropertyPlaceholderHelper 對配置信息進行解析,將當前的“${配置項名稱:默認值}”格式的配置值,替換成其中的默認值,demo-provider 解析結果如下圖所示:

 

完成解析之后,會通過 ConfigInitializer 工具類,將配置信息填充到 Config 中的靜態字段中,具體填充規則如下:

 

在接下來的 overrideConfigBySystemProp() 方法中會遍歷環境變量(即 System.getProperties() 集合),如果環境變 是以 "skywalking." 開頭的,則認為是 SkyWalking 的配置,同樣會填充到 Config 類中,以覆蓋 agent.config 中的默認值。

最后的 overrideConfigByAgentOptions() 方法解析的是 Java Agent 的參數,填充 Config 類的規則與前面兩步相同,不再重復。

到此為止,SkyWalking Agent 啟動所需的全部配置都已經填充到 Config 中,后續使用配置信息時直接訪問 Config 中的相應靜態字段即可。

 

dubbo 插件

 

 

 

 

 

 這里要注意這里攔截點是連接類的實例方法所以繼承的類是ClassInstanceMethodEnhancePluginDefine

如果是攔截類的靜態方法,就要集成另外的類,如下

 

 下面的具體的攔截的實現

 

 

 

 結論

 

 

 

 

skywalking中witnessClass機制

 

 

witness機制的原理,列如dubbo有1.0  2.0兩個版本

1.0中原理的攔截的MonitorFilter類對應的方法是invoke方法

2.0中原理的攔截的MonitorFilter類對應的方法變成了name方法

現在我們為dubbo1.0 編寫了skywalking一個插件dubbo1.0 -jar

我們為dubbo2.0 編寫了skywalking一個插件dubbo2.0 -jar

 我們如何實現dubbo1.0 -jar只攔截invoke方法

dubbo2.0 -jar只攔截name方法

這就通過witnessClass機制來實現,dubbo1.0 -jar的插件中項目組需要實現witnessClass方法,在改方法中返回一直方法,改方法只有dubbo1.0這個版本有,列如方法為aa

項目啟動的時候,classload會對dububbo 1.0這個項目組運行的版本進行字節碼解析看是否存在aa方法,如果aa方法與skywalking agent中witnessClass方法中定義的aa方法一致,就使用dubbo1.0 -jar只攔截invoke方法

列如sping存在多個版本

 

 agent后后端通信的設置

一種是是明文通信

一種是ssl通信

 

 

 

 

 

 agent后后端的token認證

 

 grpc和后端的oap重連的時候是隨機選擇一個后端的oap server 實例來進行連接

 

 

 應用通過grpc向opa注冊注冊的時候會攜帶當前的應用名稱,注冊成功之后會將當前應用的ID返回給agent,agent會存在在緩存中

 

 當前服務實例也需要進行注冊,注冊成功之后,oap會給當前的實例返回一個id,然后將這個ID緩存起來

 注冊成功之后,agengt需要通過定時任務不斷向后端發送心跳包,說明當前的實例是存在的

 

 

 

 

 Tracesegement的核心概念

 

 skywalking將一個進程中的所有span封裝到一個Tracesegement中

 

 

 

 

 

 

 

 

 

 一個Tracesement中包含多個span

span的定義如下

 

 span中提供了下面的方法

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 概念3:TraceSegment中存在一個字段TraceSegmentref字段,記錄了TraceSegment與TraceSegment的相互關聯關系

 

 

 

 概念4:上面的概念介紹完成之后接下來介紹context對象來實現對TraceSegment的管理和實現對span的管理

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 在上面創建entryspan之后,會將當前的TraceSegment上傳到oap中,entryspan一般是分為兩種,一個中進程傳播,一種是線程傳播,接下來講講跨進程傳遞,需要將Trace的信息上下文進行跨進程傳播

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 跨線程傳播如下

 11、接下來在發送TracesSegment上報給oap的時候用到了DateCarrier組件,DateCarrier組件中會存儲要發送的TracesSegment

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

接下來我們重點講解下幾個重要的概念

 

 

 

 

 

 我們來查看下一個案例contextManger如何進行管理的

 

 

 

講講TraceSegment中的采樣,看是否需要將當前的審判添加到TraceSegment中

 

 

 

 

 

 

 當TraceContext調用stopSpan關閉最后一個span的時候,會調用finish方法關閉改span所在的TraceSegment,於此同時會調用TracContext的listen通過改segment被關閉了的通知,這個時候就會將TraceSegment發送給oap的后端

 

 

 

 

 

 TraceSegmentServiceClient主要負責將TraceSegment通過DataCarrier將TraceSegment序列化發送給后端的oap

整個序列化profuffer協議格式如下所示

 

 

 

 

 

 

 

 

 

 

 

 

 

 這里序列化之后將segement發送給后端oap,發送的過程是阻塞性的

 

lombok


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM