螞蟻金服分散式鏈路跟蹤元件 SOFATracer 總覽 | 剖析

螞蟻金服分散式架構發表於2018-12-28

SOFA Scalable Open Financial Architecture是螞蟻金服自主研發的金融級分散式中介軟體,包含了構建金融級雲原生架構所需的各個元件,是在金融場景裡錘鍊出來的最佳實踐。
SOFATracer 是一個用於分散式系統呼叫跟蹤的元件,通過統一的 TraceId 將呼叫鏈路中的各種網路呼叫情況以日誌的方式記錄下來,以達到透視化網路呼叫的目的,這些鏈路資料可用於故障的快速發現,服務治理等。SOFATracerhttps://github.com/alipay/sofa-tracer

本文為《剖析 | SOFATracer 框架》第一篇。《剖析 | SOFASOFATracer 框架》系列由 SOFA 團隊和原始碼愛好者們出品, 專案代號:<
SOFA:TracerLab/>
文章尾部有參與方式,歡迎同樣對原始碼熱情的你加入

螞蟻金服分散式鏈路跟蹤元件 SOFATracer 總覽 | 剖析

“>在單體應用時代,我們不需要花費時間去關心呼叫鏈路這個東西。但是鏈路跟蹤不僅僅是在分散式場景下才會有,即使是單體應用,同樣也會存在呼叫鏈路。例如,我們把應用中的每個服務介面作為一個鏈路節點,那麼從請求進來到返回響應,把這個過程中多歷經的所有的方法介面串聯起來,就能組成一條完整的鏈路,如下圖所示:

image.png | center | 747x201“>對於單體應用而言,如果訪問一個資源沒有成功,那麼我們可以很快的鎖定是哪一臺機器,然後通過查詢這臺機器上的日誌就能定位問題。
“>因此在面對這種複雜的大規模分散式叢集來實現的服務體系來說,就需要一些可以幫助理解各個應用的線上呼叫行為、並可以分析遠端呼叫的元件。
“>(“>)實現的 SOFATracer“>在介紹 SOFATracer“> 規範。

1、Opentracing 簡介

“> 是什麼

OpenTracing“> 提供了一套平臺無關、廠商無關的 API“> 中的一些概念和術語,在不同的語言環境下都是共享的。

“> 規範中,一條 trace“> 組成,一條鏈路整體可以看做是一張有向無環圖,各個 span“>”。下面是官方提供的示例:
image.png | center | 742x290“>如果已時間軸維度來看的話,也可以表現為下面的形式(官方示例):
image.png | center | 763x162“>但是為了簡化 span“>,平行執行的作為 FollowFrom“>a、ChildOf 示例
“> 中呼叫了 method

“>在時間維度上展現的視角如下:


image.png | left | 622x84“>這種關係一般會 表示為 SpanBChildOfSpanA“>b、FollowFrom 示例
method“>執行之後 methodB

“>在時間維度上展現的視角如下:


image.png | left | 622x64“>這種關係一般會 表示為 SpanBFollowFromSpanA“> 是對分散式鏈路中涉及到的一些列操作的高度抽象集合。 Opentracing“>、 Span“>、 Format“> 和 ScopeManager“> 使用的版本是 0.22.0 ,主要是對 Tracer“>、 SpanContext“> 來分析。

“>下圖為 SOFATracerOpenTracing-api 規範 (opentracing.io/specificati…)。

“> 是一個簡單、廣義的介面,它的作用就是構建

span“> 。核心介面列表如下:

“> 實現了 Tracer“>_b、Span &
SofaTracerSpan _
Span“> 就是一個完整的資料包,其包含的就是當前節點所需要上報的資料。核心介面列表如下:
“> 在實現 Span“>、 tags“>和產生當前 span“>型別等處理的能力。
“> 對於 OpenTracing“> 可以實現跨程式的鏈路透傳,並且可以通過 SpanContext“> 中只有一個介面:
“> 實現了 SpanContext“>、序列化 baggageItems“>等新的能力,除此之外, SpanContext“> 攜帶資訊 描述 traceId 全鏈路唯一的標識資訊 spanId spanId parentId 父 spanId isSampled 取樣標記 sysBaggage 系統透傳資料 bizBaggage 業務透傳資料

2、SOFATracer 擴充套件

“> 在 Opentracing“> 基於 “>(“>)實現,並且通過 “> (“>)元件實現了日誌的無鎖非同步列印能力。

基於 “>應用在通過面向日誌程式設計介面 SLF4J“> 中新增相應的引數即可,如新增 [%X{SOFA-TraceId
},%X{SOFA-SpanId
}]
“> 和 SpanId“>、 Log4j2“>。關於這部分的實現原理,期待大家一起編寫,領取方式見文末。

SOFATracer 的埋點機制

SOFATracer“> 埋點的方式。 SOFATracer“>例項,如 Mvc“> 、 HttpClient“> 等,如下圖所示:
image.png | center | 607x272“> 將不同的擴充套件元件分為 AbstractClientTracer“>,再通過 AbstractClientTracer“> 衍生出具體的元件 Tracer“> 本身來管控,對於不同的元件可以輕鬆的實現差異化和定製化。
“> 的埋點擴充套件實現,從而實現與 “> 的無縫對接。基於 OpentracingAPI“>關於 SOFATracer“> 埋點的實現以及如何實現對接 OT-api“> 中並沒有將不同的 Reporter“>從流程圖中可以看到,此過程中涉及到了三個上報點,首先是上報到 zipkin“> 中為不同的元件均提供了獨立的日誌空間,除此之外, SOFATracer“>對於鏈路中的資料,並非所有的資料都是值得關注的。一方面是可以節約磁碟空間,另一方面可以將某些無關資料直接過濾掉。基於此, SOFATracer“> 例項作為取樣計算的條件,使用者可以基於此實現豐富的取樣規則。關於取樣機制,期待大家一起編寫,領取方式見文末。

SOFATracer 鏈路透傳機制

“> 鏈路透傳 以及 OpenTracing“>首先介紹下目前 SOFATracer“> 版本說明:

3.x 版本支援 webflux 等,基於分支釋出。
2.x 版本基於 master 釋出,目前版本是 2.3.0 。

“> 有興趣的同學,一起參與開發~

3、歡迎加入 ,參與 SOFATracer 原始碼解析

“> 元件系列》第一篇,主要還是希望大家對 SOFATracer“>如果有同學對以上某個主題特別感興趣的,可以留言討論,我們會適當根據大家的反饋調整文章的順序,謝謝大家關注 SOFA“>,我們會一直與大家一起成長的。
“>掃碼關注公眾號,後臺回覆想認領的文章名稱,我們將會主動聯絡你,確認資質後,即可加入 ,It’s your show time!

除了原始碼解析,也歡迎提交 issue 和 PR:SOFATracerhttps://github.com/alipay/sofa-tracer

螞蟻金服分散式鏈路跟蹤元件 SOFATracer 總覽 | 剖析

長按關注,獲取分散式架構乾貨

歡迎大家共同打造 SOFAStack https://github.com/alipay

來源:https://juejin.im/post/5c2587fd518825721e5f514c

相關文章