本文來(lái)自微信公眾號(hào)“twt企業(yè)IT社區(qū)”,作者/李杰,專(zhuān)注于Java虛擬機(jī)技術(shù)、云原生技術(shù)領(lǐng)域的探索與研究。
什么是“Distributed Tracing-分布式追蹤”?
Distributed Tracing(分布式追蹤)是一種用于監(jiān)測(cè)和分析分布式應(yīng)用程序的技術(shù)和方法。它旨在追蹤和記錄應(yīng)用程序中的請(qǐng)求和操作,從而提供對(duì)應(yīng)用程序的全局視圖和性能分析。
在分布式系統(tǒng)中,應(yīng)用程序通常由多個(gè)微服務(wù)或組件組成,這些組件可能分布在不同的計(jì)算機(jī)、容器或云環(huán)境中。這種分布式環(huán)境使得監(jiān)測(cè)和調(diào)試應(yīng)用程序變得更加困難,因?yàn)閱蝹€(gè)請(qǐng)求可能會(huì)在多個(gè)組件之間傳遞,并涉及多個(gè)網(wǎng)絡(luò)調(diào)用。
從本質(zhì)上來(lái)講,分布式追蹤的核心思想是在整個(gè)應(yīng)用程序的各個(gè)組件之間創(chuàng)建一條可追蹤的路徑。當(dāng)一個(gè)請(qǐng)求進(jìn)入系統(tǒng)時(shí),它被賦予一個(gè)唯一的標(biāo)識(shí)符(例如Trace ID),然后隨著請(qǐng)求在不同組件之間傳遞,這個(gè)標(biāo)識(shí)符會(huì)隨之傳遞。每個(gè)組件在處理請(qǐng)求時(shí)都會(huì)生成相關(guān)的追蹤數(shù)據(jù),例如開(kāi)始時(shí)間、結(jié)束時(shí)間、執(zhí)行時(shí)間、調(diào)用的組件等。
這些追蹤數(shù)據(jù)被收集和匯總,通常存儲(chǔ)在專(zhuān)門(mén)的分布式追蹤系統(tǒng)中。開(kāi)發(fā)人員可以使用這些數(shù)據(jù)來(lái)分析應(yīng)用程序的性能瓶頸、調(diào)用鏈路和錯(cuò)誤。通過(guò)可視化界面或查詢(xún)語(yǔ)言,他們可以查看整個(gè)請(qǐng)求的路徑和時(shí)間線,并識(shí)別潛在的性能問(wèn)題和故障原因。
通常來(lái)講,在最為基本的層面上,追蹤解決方案從軟件可觀測(cè)性開(kāi)始,通過(guò)從外部輸出推斷系統(tǒng)的內(nèi)部狀態(tài)。然而,由于這是一個(gè)相對(duì)不精確的過(guò)程,為了更準(zhǔn)確地讀取和記錄各個(gè)組件的情況,我們希望引入遙測(cè)技術(shù)來(lái)捕獲和測(cè)量數(shù)據(jù)。一旦系統(tǒng)具備遙測(cè)功能,我們就可以開(kāi)始通過(guò)分布式追蹤來(lái)觀測(cè)系統(tǒng)級(jí)別發(fā)生的情況。
在云原生計(jì)算中,我們通常使用分布式系統(tǒng)和微服務(wù)架構(gòu),因此分布式追蹤成為日常調(diào)試和監(jiān)控的重要組成部分。它可以幫助我們理解請(qǐng)求是如何在多個(gè)服務(wù)之間流動(dòng)的,并提供關(guān)于性能、錯(cuò)誤和依賴(lài)關(guān)系的有用信息。通過(guò)分布式追蹤,我們可以更好地理解系統(tǒng)中的瓶頸、故障和性能問(wèn)題,并采取適當(dāng)?shù)男袆?dòng)來(lái)改進(jìn)和優(yōu)化我們的應(yīng)用程序。
因此,分布式追蹤在軟件開(kāi)發(fā)和運(yùn)維中具有重要意義,它提供了對(duì)分布式系統(tǒng)中請(qǐng)求流程和組件交互的全局視圖,幫助我們?cè)\斷問(wèn)題、監(jiān)控性能并改進(jìn)系統(tǒng)的可靠性。
“Distributed Tracing-分布式追蹤”的歷史發(fā)展脈絡(luò)
Distributed Tracing(分布式追蹤)的發(fā)展歷史可以追溯到分布式系統(tǒng)和微服務(wù)架構(gòu)的出現(xiàn)。下面是分布式追蹤的一些關(guān)鍵里程碑和發(fā)展階段,具體可參考如下:
1、Google Dapper
Google于2003年發(fā)布了一篇題為《Dapper,a Large-Scale Distributed Systems Tracing Infrastructure》的論文,這標(biāo)志著分布式追蹤的重要里程碑。這篇論文詳細(xì)介紹了Google內(nèi)部使用的分布式追蹤系統(tǒng)Dapper,該系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)為后來(lái)的分布式追蹤技術(shù)奠定了基礎(chǔ)。
在此篇論文中,Google首次提出了分布式追蹤的概念,并探索了關(guān)鍵的技術(shù)和方法。其中包括請(qǐng)求追蹤,即追蹤一個(gè)請(qǐng)求在分布式系統(tǒng)中的整個(gè)路徑和生命周期。通過(guò)跨服務(wù)追蹤,Dapper能夠追蹤一個(gè)請(qǐng)求在不同服務(wù)之間的傳遞和處理過(guò)程,從而提供全局的視圖和上下文。為了應(yīng)對(duì)大規(guī)模系統(tǒng)中的性能和存儲(chǔ)壓力,Dapper引入了采樣技術(shù),僅記錄部分請(qǐng)求的追蹤數(shù)據(jù),而非全部。此外,Dapper還提供了可視化工具,使開(kāi)發(fā)人員能夠直觀地查看和分析追蹤數(shù)據(jù),以診斷和解決問(wèn)題。
這篇論文的發(fā)表對(duì)于分布式系統(tǒng)的可觀察性和調(diào)試技術(shù)產(chǎn)生了深遠(yuǎn)的影響。它啟發(fā)了后續(xù)的研究和工具開(kāi)發(fā),促進(jìn)了分布式追蹤技術(shù)的進(jìn)一步發(fā)展和應(yīng)用。許多開(kāi)源項(xiàng)目和商業(yè)工具都受到Dapper的啟發(fā),并致力于提供更強(qiáng)大、靈活和易用的分布式追蹤解決方案。因此,Dapper論文標(biāo)志著分布式追蹤領(lǐng)域的開(kāi)端,為我們理解和管理復(fù)雜的分布式系統(tǒng)提供了重要的方法和工具。
2、Twitter Zipkin
Twitter的Zipkin項(xiàng)目受到了Google Dapper論文的啟發(fā),并在其基礎(chǔ)上進(jìn)行了擴(kuò)展和改進(jìn)。Zipkin提供了一種簡(jiǎn)單而強(qiáng)大的方式來(lái)收集、存儲(chǔ)和可視化分布式追蹤數(shù)據(jù)。通過(guò)引入Zipkin,開(kāi)發(fā)人員可以更輕松地實(shí)施分布式追蹤,從而獲得對(duì)系統(tǒng)中請(qǐng)求流程和服務(wù)交互的全局視圖。
Zipkin采用了一些與Google Dapper類(lèi)似的思想和技術(shù),例如請(qǐng)求追蹤和跨服務(wù)追蹤。它可以追蹤請(qǐng)求在分布式系統(tǒng)中的流動(dòng)路徑,并記錄每個(gè)服務(wù)的處理時(shí)間和相關(guān)信息。這使得開(kāi)發(fā)人員能夠快速識(shí)別和排查潛在的性能瓶頸和故障點(diǎn)。
除了數(shù)據(jù)收集和存儲(chǔ)功能,Zipkin還提供了直觀的可視化界面,使開(kāi)發(fā)人員能夠直觀地查看和分析分布式追蹤數(shù)據(jù)。這些可視化工具可以幫助開(kāi)發(fā)人員理解系統(tǒng)中的請(qǐng)求流程,識(shí)別慢速請(qǐng)求、異常情況和服務(wù)之間的依賴(lài)關(guān)系。
3、Uber Jaeger
在Zipkin發(fā)布三年后的2015年,Uber宣布開(kāi)源了Jaeger,這是一個(gè)專(zhuān)門(mén)用于監(jiān)控、分析和排除微服務(wù)故障的分布式追蹤系統(tǒng)。
Jaeger項(xiàng)目的推出為分布式追蹤技術(shù)帶來(lái)了新的突破和創(chuàng)新。它在基于Zipkin的思想和經(jīng)驗(yàn)的基礎(chǔ)上進(jìn)行了進(jìn)一步的改進(jìn)和優(yōu)化。Jaeger提供了更高級(jí)別的功能和性能,以適應(yīng)大規(guī)模微服務(wù)架構(gòu)的需求。
隨著其開(kāi)源項(xiàng)目的成功,Jaeger于2018年成為云原生計(jì)算基金會(huì)(CNCF)的第12個(gè)托管項(xiàng)目。Jaeger的加入進(jìn)一步加強(qiáng)了分布式追蹤技術(shù)在云原生生態(tài)系統(tǒng)中的地位,并得到了更廣泛的社區(qū)支持和貢獻(xiàn)。
由于其持續(xù)的發(fā)展和社區(qū)的努力,Jaeger于2019年晉升為CNCF的畢業(yè)項(xiàng)目級(jí)別,這是CNCF下最高的可用級(jí)別。這表明Jaeger已經(jīng)成為一個(gè)成熟而可靠的分布式追蹤系統(tǒng),被廣泛認(rèn)可和采用。
4、OpenTracing
在2016年,CNCF(Cloud Native Computing Foundation)推出了OpenTracing,這是一個(gè)旨在推動(dòng)分布式追蹤領(lǐng)域發(fā)展的開(kāi)放標(biāo)準(zhǔn)。OpenTracing的目標(biāo)是提供一套廠商中立的API和規(guī)范,以便在應(yīng)用程序中輕松集成各種分布式追蹤系統(tǒng)。
OpenTracing的推出填補(bǔ)了分布式追蹤領(lǐng)域的一個(gè)重要空白。在此之前,不同的追蹤系統(tǒng)使用不同的API和數(shù)據(jù)格式,使得在不同系統(tǒng)之間切換和集成變得復(fù)雜困難。OpenTracing的出現(xiàn)為開(kāi)發(fā)人員提供了一種通用的編程接口,使得他們可以方便地在不同的追蹤系統(tǒng)之間切換和集成,而無(wú)需修改現(xiàn)有的代碼。
通過(guò)OpenTracing,開(kāi)發(fā)人員可以使用統(tǒng)一的API來(lái)定義和記錄跨多個(gè)服務(wù)的請(qǐng)求和操作。這些API可以輕松地插入到應(yīng)用程序的代碼中,以收集關(guān)鍵的追蹤信息。這些信息包括請(qǐng)求的流經(jīng)路徑、服務(wù)之間的依賴(lài)關(guān)系以及請(qǐng)求處理的時(shí)間等。
5、OpenCensus
除了OpenTracing,Google還推出了另一個(gè)項(xiàng)目名為OpenCensus。OpenCensus是一組適用于多種編程語(yǔ)言的庫(kù),旨在幫助開(kāi)發(fā)人員收集應(yīng)用程序的指標(biāo)和分布式追蹤數(shù)據(jù),并實(shí)時(shí)傳輸?shù)剿麄冞x擇的后端系統(tǒng)。這個(gè)項(xiàng)目的目標(biāo)是提供一種簡(jiǎn)單而強(qiáng)大的方式來(lái)監(jiān)控和診斷應(yīng)用程序的運(yùn)行狀況。
通過(guò)OpenCensus,開(kāi)發(fā)人員可以獲得對(duì)應(yīng)用程序的全面觀察,并獲得有關(guān)其性能、可用性和可靠性的關(guān)鍵洞察。收集和分析這些數(shù)據(jù)可以幫助開(kāi)發(fā)人員優(yōu)化應(yīng)用程序的性能,提高用戶(hù)體驗(yàn),并及時(shí)發(fā)現(xiàn)和解決潛在的問(wèn)題。
6、OpenTelemetry
在2020年,CNCF支持了一個(gè)重要的項(xiàng)目,即OpenTelemetry。OpenTelemetry的目標(biāo)是將OpenTracing和OpenCensus項(xiàng)目合并,成為下一代分布式追蹤和觀測(cè)標(biāo)準(zhǔn)。它提供了一套全面的工具、庫(kù)和規(guī)范,用于收集、傳輸和分析應(yīng)用程序的追蹤數(shù)據(jù)和度量指標(biāo)。
OpenTelemetry的出現(xiàn)是為了解決分布式追蹤和應(yīng)用程序觀測(cè)領(lǐng)域的挑戰(zhàn)。它整合了OpenTracing和OpenCensus的最佳實(shí)踐和思想,并提供了一個(gè)統(tǒng)一的解決方案。通過(guò)OpenTelemetry,開(kāi)發(fā)人員可以方便地收集應(yīng)用程序的追蹤數(shù)據(jù)和度量指標(biāo),無(wú)論是在單個(gè)服務(wù)內(nèi)部還是跨多個(gè)服務(wù)之間。
OpenTelemetry提供了一系列的API和SDK,支持多種編程語(yǔ)言和平臺(tái)。開(kāi)發(fā)人員可以使用這些工具將追蹤和度量的收集嵌入到應(yīng)用程序代碼中。這些工具會(huì)自動(dòng)收集關(guān)鍵的數(shù)據(jù),例如請(qǐng)求處理時(shí)間、資源利用率和錯(cuò)誤率等。同時(shí),OpenTelemetry還支持分布式追蹤,能夠追蹤請(qǐng)求在整個(gè)分布式系統(tǒng)中的流經(jīng)路徑和服務(wù)之間的調(diào)用關(guān)系。
OpenTelemetry的設(shè)計(jì)具有靈活性和可擴(kuò)展性。它支持與多個(gè)后端系統(tǒng)集成,例如Jaeger、Zipkin、Prometheus和Google Cloud Monitoring等。開(kāi)發(fā)人員可以根據(jù)自己的需求選擇適合的后端,并將收集到的數(shù)據(jù)實(shí)時(shí)傳輸?shù)竭@些后端系統(tǒng)中進(jìn)行分析和可視化。這使得開(kāi)發(fā)人員能夠獲得對(duì)應(yīng)用程序的全面觀察,并及時(shí)識(shí)別和解決潛在的性能問(wèn)題和故障。
通過(guò)OpenTelemetry,開(kāi)發(fā)人員可以更加方便地實(shí)現(xiàn)應(yīng)用程序的監(jiān)控和觀測(cè)。它提供了一種統(tǒng)一的標(biāo)準(zhǔn)和工具,使得跨多個(gè)服務(wù)的追蹤和度量變得更加一致和可靠。開(kāi)發(fā)人員可以利用OpenTelemetry的功能來(lái)優(yōu)化應(yīng)用程序的性能、可用性和可靠性,提供更好的用戶(hù)體驗(yàn)。
為什么需要“Distributed Tracing-分布式追蹤”?
分布式追蹤是在分布式系統(tǒng)中追蹤和監(jiān)控請(qǐng)求的流經(jīng)路徑和服務(wù)之間的調(diào)用關(guān)系的過(guò)程。在現(xiàn)代的應(yīng)用程序架構(gòu)中,分布式系統(tǒng)變得越來(lái)越常見(jiàn)。這些系統(tǒng)通常由多個(gè)微服務(wù)組成,每個(gè)微服務(wù)負(fù)責(zé)處理特定的功能或業(yè)務(wù)邏輯。在這樣的環(huán)境下,分布式追蹤變得至關(guān)重要,原因如下:
1、故障排查和調(diào)試:在分布式系統(tǒng)中,當(dāng)出現(xiàn)故障或性能問(wèn)題時(shí),很難確定問(wèn)題的根源。分布式追蹤可以幫助開(kāi)發(fā)人員識(shí)別請(qǐng)求的流經(jīng)路徑,并記錄每個(gè)服務(wù)的處理時(shí)間和性能指標(biāo)。這樣,開(kāi)發(fā)人員可以快速定位問(wèn)題所在,并進(jìn)行故障排查和調(diào)試。
2、性能優(yōu)化:分布式追蹤可以提供對(duì)系統(tǒng)性能的全面可見(jiàn)性。通過(guò)收集和分析請(qǐng)求的流經(jīng)路徑和服務(wù)之間的調(diào)用關(guān)系,開(kāi)發(fā)人員可以了解每個(gè)服務(wù)的性能瓶頸和熱點(diǎn)。這使得他們能夠有針對(duì)性地優(yōu)化系統(tǒng),提高整體性能和響應(yīng)時(shí)間。
3、容量規(guī)劃和資源管理:分布式追蹤可以提供對(duì)資源利用率的洞察。通過(guò)監(jiān)視請(qǐng)求的流經(jīng)路徑和服務(wù)的調(diào)用關(guān)系,開(kāi)發(fā)人員可以了解每個(gè)服務(wù)的負(fù)載情況和資源消耗。這有助于進(jìn)行容量規(guī)劃和資源管理,確保系統(tǒng)具有足夠的資源來(lái)滿(mǎn)足用戶(hù)需求。
4、跨服務(wù)的請(qǐng)求追蹤:在分布式系統(tǒng)中,一個(gè)請(qǐng)求通常會(huì)涉及多個(gè)服務(wù)的協(xié)作。分布式追蹤可以追蹤請(qǐng)求在整個(gè)系統(tǒng)中的流經(jīng)路徑,并記錄每個(gè)服務(wù)的處理情況。這有助于了解服務(wù)之間的依賴(lài)關(guān)系和調(diào)用關(guān)系,提供全局的請(qǐng)求視圖,從而更好地理解系統(tǒng)的行為和性能。
5、監(jiān)控和警報(bào):分布式追蹤可以與監(jiān)控和警報(bào)系統(tǒng)集成,提供對(duì)系統(tǒng)運(yùn)行狀況的實(shí)時(shí)監(jiān)控。通過(guò)收集和分析請(qǐng)求的追蹤數(shù)據(jù),可以生成關(guān)鍵的度量指標(biāo)和報(bào)告,用于監(jiān)控系統(tǒng)的健康狀況和性能指標(biāo)。同時(shí),可以設(shè)置警報(bào)規(guī)則,及時(shí)發(fā)現(xiàn)并響應(yīng)系統(tǒng)中的異常情況。
總之,分布式追蹤在現(xiàn)代分布式系統(tǒng)中起著至關(guān)重要的作用。它幫助開(kāi)發(fā)人員進(jìn)行故障排查、性能優(yōu)化、容量規(guī)劃和資源管理。此外,它還提供了對(duì)跨服務(wù)請(qǐng)求的全局視圖,以及與監(jiān)控和警報(bào)系統(tǒng)的集成,實(shí)現(xiàn)對(duì)系統(tǒng)的實(shí)時(shí)監(jiān)控和警報(bào)。通過(guò)分布式追蹤,開(kāi)發(fā)人員可以更好地理解和管理復(fù)雜的分布式系統(tǒng),提供高性能、可靠和可伸縮的應(yīng)用程序。