溫小斌 張達 諸映晴



摘要:分布式追蹤是為了解決微服務環境下服務調用的可觀察性問題。鑒于目前追蹤系統存在的各種不足之處,設計并實現了一個輕量級的分布式追蹤系統,實現了服務調用鏈、調用頻次、響應時間等觀察指標的追蹤?;贘ava agent和字節碼編輯技術實現追蹤代理程序,生成追蹤圖數據,并通過gRPC發送到監控中心。追蹤系統做到了對應用系統的零侵入,并且實現了OpenTracing標準,能夠方便地與各種運維監控系統集成。
關鍵詞:分布式追蹤;微服務;運維;監控;OpenTracing
中圖分類號:TP319
文獻標識碼:A
文章編號:1006-8228(2020)09-64-04
Design and implementation of lightweight distributed tracing system
Wen Xiaobin, Zhang Da, Zhu Yingqing
(Ningbo Hadlinks IoT Technology Co., Ltd., Ningbo, Zhejiang 315000, China)
Abstract: Distributed tracing system is to make service call observable in microservice context. To overcome the shortcomings ofcurrent systems, a lightweight distributed tracing system is designed and implemented. It makes metrics in application observable.including chain of service dependencies, calling frequency and response time. Based on Java agent and byte-code editor. a tracingagent is programmed to create tracing data with graph structure, and send the data to monitoring center via gRPC. The tracingsystem achieves zero intrusion into the application, and conforms to OpenTracing standard, it can be easily integrated with variousoperation and maintenance monitoring systems.
Key words: distribLLted tracing; microservice; operation and maintenance; monitoring; OpenTracinii
0引言
微服務架構已經成為廣泛使用的架構模式,它把復雜而龐大的業務系統拆分成一些粒度更小而且可以獨立部署的服務進程,實現了業務的解耦與復用,方便部署、擴展和維護[1]。分布式追蹤技術[2]就是在這種背景下誕生的,它主要解決服務調用的可觀察性問題,包括服務調用鏈、調用頻次、響應時間、異常調用等觀察指標。為此業界進行了一系列的研究,開發出了各種分布式追蹤系統,企業界的典型代表有谷歌的Dapper[3]、阿里巴巴的EagleEye[4],學術界的研究成果有MTracer[5],開源社區的代表性項目有Zipkin和SkyWalking。
然而這些系統存在以下幾個方面的問題:①這些系統普遍龐大而復雜,過于重量級,對應用環境的依賴程度高,難以實現和使用;②對業務系統的侵入性太強,需要在業務代碼中穿插大量追蹤代碼,破壞了業務代碼的連貫性和整體性;③自成體系,難以與其他監控系統相結合。
為了解決上述問題,設計并實現了一個輕量級的分布式追蹤系統?;贘avaagent和字節碼編輯技術,做到了對業務系統的零侵入,并且遵循OpenTracing標準,能夠方便地集成到其他運維監控系統。
1設計目標
對系統進行設計的時候,主要以如下目標作為出發點:
1)功能上,需要實現服務調用鏈、調用頻次、響應時間、異常調用等觀察指標的追蹤。
(2)輕量級。對應用環境的依賴少,使用方便。
(3)對業務系統零侵入。不會對業務系統產生功能和性能上的影響,無需對業務系統代碼做任何修改。
(4)分布式追蹤作為運維內容的一部分,能夠方便地集成到各種運維監控系統中。
(5)支持主流的微服務開發框架,包括ApacheDubbo和SpringCloud。
2追蹤圖
追蹤圖用于記錄分布式調用鏈的拓撲關系,它本質上是一個有向圖數據結構。一個追蹤圖對應一個完整的調用鏈,使用唯一的traceID表示。調用鏈由若干個追蹤段segment組成,segment代表分布式系統中的一個應用進程,在圖中用頂點表示。一個segment會生成若干個span,span代表最終的調用單元,比如調用某個RPC方法,在圖中用有向邊表示。表1列出了追蹤圖中各信息的ID和含義。
圖1展示了一個實際追蹤圖的示例,描述了追蹤圖的創建過程。
(1)用戶向Web應用發起一個請求,追蹤程序首先為該請求創建一個追蹤段(sengmentID=seg_w),如果traceID不存在,則會創建一個traceID。
(2)Web應用向Dubbo服務A發起請求時,會創建一個span(spanID=1),同理,Web應用向Dubbo服務B發起請求時,也會創建一個span(spanID=2)。在同一個段中,spanID是依次遞增的,代表調用的先后順序。
(3) Dubbo服務A收到請求后,追蹤程序同樣會創建一個追蹤段(segmentID=seg_a),同時會接收到調用者傳遞過來的參數traceID、callerSegmentID和spanID。
(4)其他服務的調用也遵循上述步驟。最終,通過traceID、callerSegmentID、segmentID等數據,可以將調用信息關聯起來,形成一個完整的追蹤圖。
3追蹤代理
追蹤代理用于獲取追蹤圖相關的數據,在整個系統中承擔數據采集的任務。追蹤代理程序的設計和實現,主要基于Javaagent和字節碼編輯兩項技術,前者用于監聽類的加載,攔截并獲取類文件的信息,后者用于編輯class文件,在其中加入分布式追蹤相關的代碼。圖2展示了追蹤代理程序的工作原理。
在類加載時,JVM會觸發ClassFileLoadHook事件,這是一個JVMTI事件,被觸發后會調用ClassFileTransformer接口,該接口是一個class文件轉換器,需要實現接口中的transform()方法,在該方法中對傳入的Java字節碼進行重新編輯。追蹤相關的功能邏輯均在transform()方法中實現,包括匹配需要監控的Java類和方法,獲取并記錄traceID、segmentID、spanID等追蹤圖的數據,并把這些數據發送到監控中心。
追蹤代理程序最終編譯成一個tracing-agent.jar文件,放入到各個應用和服務程序中,沒有其他依賴,非常輕量級。應用和服務的業務代碼,不需要做任何修改,即追蹤代理對應用層的代碼是零侵入的。
4系統實現
4.1系統架構
如圖3所示,整個追蹤系統采用分布式架構,主要由追蹤代理和監控中心兩部分組成。追蹤代理通過gRPC,往監控中心發送探測到的追蹤數據,數據格式遵循OpenTracing標準。監控中心接收到這些追蹤數據后,負責數據的解析、存儲以及可視化展示。
追蹤代理和監控中心完全解耦,這樣便于把追蹤功能集成到各種運維監控系統之中。本文的監控中心基于Galileo系統實現。Galileo是一個專門針對物聯網系統的自動化運維監控系統[6],本文把分布式追蹤功能作為其中的一個功能模塊對其進行擴展開發。
4.2關鍵技術
除了前述的Javaagent和字節碼編輯技術以外,還有以下幾個關鍵技術點,對系統的實現至關重要,決定了系統的可擴展性和并發性能。
(1) OpenTracing
OpenTracing是一套通用的、標準的追蹤數據定義接口,規范了追蹤數據的數據模型和實現流程。這套規范由三個方面組成:標準化的span管理API;標準化的追蹤數據的跨進程傳播API;標準化的active span管理API。實現這套規范意味著數據采集方只需專注于如何追蹤系統的運行流程,而無需關注追蹤數據的定義和格式。諸如Galileo這樣的運維監控平臺可以根據OpenTracing標準來解析接收到的數據,方便系統之間的集成。
(2)gRPC
追蹤代理與監控中心之間的網絡通訊,采用gRPC技術。gRPC是一個高效的RPC框架,基于HTTP/2.0協議,傳輸的是Protobuf格式的數據。與傳統的HTTP/1.1相比,它使用了TCP長連接和多路復用技術,具有更好的性能表現,相同并發量下消耗更少的資源。另外,gRPCClient向gRPCServer發送數據的時候,使用獨立的線程池異步發送,不影響業務代碼的執行。
5結束語
針對微服務調用的可觀察性,本文沒計并實現了一個輕量級的分布式追蹤系統,實現了服務的調用鏈、調用頻次、響應時間、異常調用等觀察指標的追蹤,并應用到多個正式商用的物聯網項目,取得了不錯的效果。下一步的研究工作,是計劃把分布式追蹤擴展到數據庫調用方面,包括MySQL、MongoDB、Redis等數據庫的連接池調用的追蹤。
參考文獻(References):
[1]Chris Richardson. Microservices Patterns: With Examplesin Java[M]. Manning Publications, 2019.
[2]Yuri Shkuro. Mastering Distributed Tracing[M]. PacktPublishing,2019.
[3] B. H. Sigelman, L. A. Barroso, M. Burrows, P.Stephenson, M. Plakal, et al.Dapper, a Large-ScaleDistributed Systems Tracing Infrastructure[R]. GoogleTechnical Report,Googlelnc, 20 10.
[4]鐘華,企業IT架構轉型之道:阿里巴巴中臺戰略思想與架構實戰[M].機械工業出版社,2017.
[5]J. Zhou,Z.Chen,H.Mi,J.Wang. MTracer:A Trace-Oriented Monitoring Framework for Medium-ScaleDistributed Systems[Al. IEEE 8th International Sympo-sium on Service Oriented System Engineering[C],2014:266-271
[6]溫小斌.物聯網系統自動化監控的設計與實現[J].計算機時代,2019.6:34-36
收稿日期:2020-05-14
作者簡介:溫小斌(1981-),男,江西贛州人,碩士,主要研究方向:物聯網、分布式系統。