分布式虚拟跟踪
跟蹤提供了對系統(tǒng)的可見性,使開發(fā)人員和操作人員可以在運行時觀察應用程序。 當系統(tǒng)不斷增長并與更多微服務進行交互時,跟蹤變得非常有價值。 在這樣的環(huán)境中,這些痕跡非常棒,可以定位導致性能下降的故障和瓶頸。
在這篇文章中,我們將幫助您詳細了解跟蹤。 我們將通過示例跟蹤事件和問題管理過程中如何使用跟蹤。
什么是痕跡?
在檢查如何捕獲跟蹤及其組成之前,讓我們看一下跟蹤的正式定義:
這樣,您可以將跟蹤視為一棵樹,其根節(jié)點是用戶進行的交互,并且這些節(jié)點代表所有參與處理請求和準備響應的微服務。
分布式跟蹤的外觀如何?
上面的示例說明了一個由七個跨度組成的跡線。 要了解跨度和軌跡,請看一下定義:
- 跟蹤公開了通過分布式系統(tǒng)的執(zhí)行路徑。 跡線由一個或多個跨度組成。
- 跟蹤中的跨度代表執(zhí)行路徑中的一項微服務。 例如,信用評分檢查可能是貸款申請?zhí)幚磉^程中的跨度。 跨度可以創(chuàng)建多個子跨度,而一個子跨度恰好具有一個父跨度。
因此,將跨度組合成一條軌跡可以揭示如何處理請求在整個分布式系統(tǒng)中的流動。 可視化跟蹤使用父子表示法來顯示跨度之間的依賴性以及每個跨度執(zhí)行所需的時間。
如何捕獲跟蹤?
所有跟蹤解決方案都要求參與處理入站請求的微服務由代理庫進行檢測。 每個此類代理庫都捕獲跟蹤的一部分,并將其發(fā)送到組成跟蹤的中央服務器。 要了解它是如何工作的,讓我們看一個示例電子商店,該例子說明了跟蹤捕獲:
每當請求到達系統(tǒng)邊界時,代理會通過監(jiān)視第一個節(jié)點為它分配一個唯一的ID。 該標識符稱為跟蹤ID。
E-shop前端節(jié)點處理入站請求,并決定調用下游的SubmitOrder微服務。 這樣做時,它通常使用自定義HTTP標頭將跟蹤ID傳遞到下游。
| SubmitOrder微服務會在HTTP標頭中發(fā)現(xiàn)跟蹤ID。 這使SubmitOrder可以將其跨度與E-shop父級鏈接。 處理請求時, submitOrder微服務發(fā)現(xiàn)它需要調用checkInventory微服務。 再次通過向下游傳遞跟蹤ID來實現(xiàn)。 checkInventory微服務現(xiàn)在是此樹中的終端節(jié)點,沒有子依賴項。 因此,它僅處理請求并將響應發(fā)送回父級。 完成此操作后, checkInventory微服務中的整個范圍就準備好了。 |
在SubmitOrder中間節(jié)點和E-shop父節(jié)點中也是如此。 跨度組成,配備有開始和結束時間戳記,并使用跟蹤ID進行鏈接。
代理庫捕獲跨度后,它們會將跨度發(fā)送到集中式服務器。 在此服務器中,節(jié)點被組成跟蹤并存儲以進行查詢。
該過程的結果是組成了完整的痕跡。 在上面的示例中,組合的跟蹤看起來類似于以下內容:
代理商如何工作?
可以使用兩種不同的方法來構建從單個微服務捕獲跨度的代理:
跟蹤器庫 (例如Zipkin , OpenTracing和Jaeger)使應用程序開發(fā)人員可以檢測代碼并將跨度發(fā)送到集中式服務器。 它們提供了最常用的語言和框架的庫,并在缺少支持的情況下使用戶能夠構建自己的庫
舉例說明如何使用Zipkin來檢測PHP微服務的示例可能會給您一個想法:
SubmitOrder微服務會在HTTP標頭中發(fā)現(xiàn)跟蹤ID。這使SubmitOrder可以將其跨度與E-shop父級鏈接。處理請求時, submitOrder微服務發(fā)現(xiàn)它需要調用checkInventory微服務。 再次通過向下游傳遞跟蹤ID來實現(xiàn)。 checkInventory微服務現(xiàn)在是此樹中的終端節(jié)點,沒有子依賴項。 因此,它僅處理請求并將響應發(fā)送回父級。 完成此操作后, checkInventory微服務中的整個范圍就準備好了。
這種方法有其缺點-從將跟蹤庫引入微服務的示例可以看出,需要更改代碼才能捕獲所需的信息。 要在大型組織中實現(xiàn)這一目標,而由不同團隊開發(fā)和維護數(shù)十甚至數(shù)百個微服務,可能是一個艱巨的挑戰(zhàn)。
基于代理的解決方案(例如NewRelic或DataDog或我們自己的Plumbr)使用應用程序運行時中的低級掛鉤來對微服務進行檢測。 代理已附加在應用程序配置中,不需要更改代碼。
例如,使用Plumbr Java Agent進行跟蹤等效于僅更改JVM啟動參數(shù),類似于:
SubmitOrder微服務會在HTTP標頭中發(fā)現(xiàn)跟蹤ID。這使SubmitOrder可以將其跨度與E-shop父級鏈接。處理請求時, submitOrder微服務發(fā)現(xiàn)它需要調用checkInventory微服務。 再次通過向下游傳遞跟蹤ID來實現(xiàn)。 checkInventory微服務現(xiàn)在是此樹中的終端節(jié)點,沒有子依賴項。 因此,它僅處理請求并將響應發(fā)送回父級。 完成此操作后, checkInventory微服務中的整個范圍就準備好了。
因此,推出基于代理的解決方案更加簡單,尤其是在管理更大的部署時。 但是,大多數(shù)基于代理的解決方案都是商業(yè)的, 而不是開放源代碼的跟蹤器庫,因此涉及一些成本。
標記軌跡和跨度
跡線和跨度傾向于被標記以支持分析跡線的多維查詢。 常用標簽的一些示例:
- 用戶身份
- serverId
- clusterId
- API端點
- HTTP響應碼
使用標簽,可以輕松回答不同的問題:
- 此微服務中的哪個API端點已損壞?
- 該前端中哪些API端點最慢?
- 哪些用戶遇到了錯誤?
- 罪魁禍首是哪個微服務?
良好的跟蹤提供程序將不同的維度無縫集成到產(chǎn)品UI和警報設置中,因此您可以避免使用數(shù)百萬條單獨的跟蹤,而是立即而及時地獲得寶貴的見解。
帶走
跟蹤是一種非常強大的診斷工具,尤其是在應用于分布式環(huán)境時。 由于可以在執(zhí)行路徑中觀察每個單獨的請求,因此問題得以解決。 借助標簽,可以公開分析查詢,從而使影響估算變得微不足道。
翻譯自: https://www.javacodegeeks.com/2020/02/distributed-tracing-for-dummies.html
總結
- 上一篇: java 解析日期格式_日期/时间格式/
- 下一篇: 十大智商最高的狗排名(高智商狗狗品种排行