陳晨:
Github ID:
chenmudu
,SOFATracer Committer , 專注於基礎服務和可觀察性方向。
SOFATracer 是螞蟻集團開源的基於 OpenTracing 規範的分佈式鏈路跟蹤系統組件,其核心理念就是通過一個全局的 TraceId 將分佈在各個服務節點上的同一次請求串聯起來。通過統一的 TraceId 將調用鏈路中的各種網絡調用情況以日誌的方式記錄下來同時也提供遠程彙報到 Zipkin /Jaeger 進行展示的能力,以此達到透視化網絡調用的目的。
我們選擇了將 SOFATracer 作爲公司雲原生架構下分佈式應用透傳的核心組件,並依此構建了我們公司內部的衆多的產品。其中最重要的是:藉助其全局透傳能力,將上下游及其相關中間件 Client 端串聯起來,爲我們內部應用可觀察性相關指標做了重要的補充。以此豐富了公司應用維度的相關指標,爲我們應用級問題定位、應用鏈路診斷以及中間件運行期分析提供了重要的能力。所以今天想和大家分享一下分佈式鏈路組件 SOFATracer 在億通內部落地的相關情況。
SOFATracer:
https://github.com/sofastack/sofa-tracer
在公司內,我們將 Spring Cloud 全家桶和 Apache Dubbo 作爲微服務解決方案和服務通訊框架。由於微服務下分佈式應用之間的調用關係開始變得複雜起來,不僅在開發過程中,在後續的測試和發佈過程都會存在問題排查過難;同時我們需要開始構建一些其他平臺,用於滿足我們日益增長的業務需求和其他需求。
由於公司內技術棧的更新迭代和業務增長等背景,我們急需一套應用級系統透傳的組件作爲基礎服務,並在此基礎上,爲公司內部其他相關平臺賦能。經過大量對比以及考慮到團隊內技術棧分佈和所需中間件產品的需求,我們選擇了 SOFATracer 作爲首選的透傳組件,以下則是我們選擇的重要原因。
選擇 JavaAgent 這種非侵入式的透傳組件誠然是一件省力和簡單的事兒,業內也有許多優秀的產品。但是我們的目標是尋找核心的 SDK 作爲一部分微服務應用的基礎組件,並不直接使用,藉助 SOFATracer 完成公司內平臺所需的相關需求,構建一整套的分佈式應用鏈路跟蹤解決方案;同時我們還考慮團隊內技術棧分佈情況。由於在調研期間已大致學習和觀摩過 SOFATracer 相關源碼,確定其代碼清晰、實現輕巧及利於後期擴展等特點,使得我們最終選擇了 SOFATracer 作爲應用透傳的基礎組件。
由於我們最初的目標是一整套分佈式全鏈路應用相關的解決方案,我們需要其具備易於擴展和可插拔的能力。
相信熟悉 SOFATracer 的同學已經瞭解其設計和相關架構,在 plugins 目錄下存放衆多中間件 Client 端的增強,如果有需要定製化則可自行擴展,同時基於 SOFABoot Starters 下的初始化也使得其增強 具備可插拔性。如果不太熟悉的同學,可以尋找往期介紹 SOFATracer 的相關文章。
SOFAStack 作爲業內金融級雲原生架構的標杆,其開源的組件是金融場景裏錘鍊出來的優秀實踐。由於公司內部 雲原生架構下的中間件需要具備動態性、安全性和合規性等特點,所以我們內部定製的中間件 Client 端在 SOFATracer 清晰和具備擴展性的代碼下完成了超過 10 餘種 Client 端動態能力的增強。感謝螞蟻集團開源出如此優秀的金融級雲原生組件。
問題定位及應用性能優化,並補全雲原生下可觀察性遺失的相關指標
藉助於 SOFATracer 的全鏈路透傳和藉助高性能內存隊列 Disruptor 關聯數據落盤等功能,我們在內部的可觀察性平臺上幫助業務應用快速定位問題,分析問題和對部分應用做相關優化,補全了公司雲原生架構下關於應用可觀察性的相關指標的短板。包括不僅限於業務應用級 Logs , 應用級 Traces , 及其相關中間件 Client 端的 Metrics 指標,同其他監控平臺一同構建了雲原生下企業級的的可觀察性平臺。
例如:我們利用 SOFATracer 全局透傳的 TraceId 將此次請求涉及到的所有的應用日誌數據串聯起來,以此確定整個鏈路發生的所有情況。問題發生時,確定動態系統數據產生的瞬時狀態,爲問題定位、還原業務場景提供重要能力。
這樣我們可以通過全局的 TraceId 篩選出某一次請求調用過程中,途徑的所有應用日誌數據,將複雜冗餘的調用情況及其數據轉換爲可觀察的線性數據,以此更方便的去排查問題。
而且我們藉助 Logs 與 Traces 共有的 TraceId 和 SpanId,將業務日誌數據與鏈路追蹤進行渲染和關聯,將問題定位的範圍由應用級到核心代碼層級,將可觀察性下的關鍵指標 Logs 與 Traces 進行關聯,不斷縮小問題的定位範圍。
同時我們將定時上報的統計指標信息用於反饋應用內中間件 Client 端所使用的性能,並不斷優化相關 Client 和 Server 端的相關性能參數。
例如下圖,我們內部定義了接口響應時間的步長爲 50 ms,用不同顏色去區分不同接口在不同時間內的響應速度,藉此可以清晰的確定某些 Rest 接口的響應時間,以便有利於調整相關 Rest Client 端連接參數和優化對應 Http Server 的性能。
最後,我們將上報的 Metrics 同其他相關指標信息,一起用在我們平臺內應用入口做對應的 入口流量檢測、系統健康反饋、出口流量以及基礎依賴的分析。確保當問題發生的時候,我們可以從整體到局部,從宏觀到微觀的去探測軟件內部黑盒的狀態。以便更好的定位問題、分析問題、解決問題,爲基礎服務和業務提供技術保障。
至此,很大程度上爲公司內 應用拓撲發現、跨應用追蹤、全鏈路的日誌關聯以及相關應用指標及趨勢分析等提供了技術支持。當然這是我們內部平臺在可觀察性下展現的部分能力,關於更多則涉及到公司隱私,就不在此進行討論。
我們後期可能會打算藉助 SOFATracer 作爲應用透傳系統的核心,打造出其他各式各樣滿足業務發展的平臺產品。再一次感謝 SOFA 社區開源出如此優秀的追蹤組件。
良好的社區生態除了官方的不斷迭代演進和運營之外,更需要更多的人進行參與。當有越來越多的場景落地,產品纔會越來越成熟,纔會更好的回饋廣大開發者,對此我們也積極的參與了 SOFAStack 的建設和發展:
我們內部將其作爲應用間透傳的基本組件,用於服務其他平臺,並反哺至業務。
同時將部分特殊用法案例以及相關插件的使用指南補充在了 SOFA 的 Guides 項目內,爲其他開發者提供便利。包括不僅限於 SpringData Mongo Client 、SpringData Redis Client、Spring Kafka、Spring Amqp (Rabbit)及監聽採樣的數據控制等。
使用過程中,由於我們部分服務的特殊性,致使官方代碼出現兼容性問題,我們反哺給上游分支,並修復部分開源代碼。包括不僅限於 RDB 增強端對於 Oracle 數據庫的 TNS 模式的匹配、 Http Server 端錯誤標誌的統一和信息填充以及一些小問題的Bug修復。
同時由於我們開發了多個內部中間件的插件,我們將具備通用性的相關代碼貢獻至官方,作爲回報給開源社區,以此表達開源社區爲我們帶來便利的感謝。貢獻的插件包括不僅限於 Spring Kafka、Spring Amqp(Rabbit) 等。關於相關插件代碼,詳情請關注 SOFATracer 3.X 分支。
最後,非常感謝螞蟻集團開源出的各個組件,讓我們的基礎服務插上翅膀,補全了公司在可觀察性下的遺漏的應用級指標,爲我們的業務應用提供保駕護航的能力。後續,我們將持續關注 SOFA 生態,爲社區儘可能的貢獻自己微薄的力量。