在上一個教學中,我們學習如何使用跨度連結來追蹤分散式系統內的互動
在本教程中,我們將了解如何實施使用跨度連結和進階用例的最佳實踐
在處理複雜的分散式系統時,選擇正確的追蹤策略對於保持清晰度和效能至關重要。
在 OpenTelemetry 中,您可以使用的兩個主要工具是父子關係和跨度連結。讓我們探討何時以及如何有效地使用跨度鏈接,特別是與更常見的父子關係相比。
了解何時使用跨度連結而不是父子追蹤對於正確映射服務的通訊方式至關重要。
親子關係:標準追蹤模型
追蹤中的親子關係很簡單。如果一個服務呼叫另一個服務,則追蹤會在兩個跨度之間建立直接的父子連結。子跨度依賴父跨度,清楚顯示操作流程。
模型在同步操作中效果很好,其中一個任務直接觸發另一個任務,並且它們遵循線性進展,例如:
跨度連結
在現實世界的系統中,特別是那些使用微服務或非同步進程的系統,並非所有操作都遵循這種整潔的分層流程。這就是跨度連結變得有價值的地方。
跨度連結可讓您連接可能不遵循直接因果模式的兩個跨度。例如:
非同步任務:訊息佇列可能會向處理服務發送請求,但您可能還想將該請求連接到觸發它的原始服務。
批次作業:您可能有一個批次處理資料的系統,其中多個子作業連結回單一觸發事件,但這些作業不會按順序執行。
解耦或非同步系統:
一個進程啟動另一個進程,但沒有直接呼叫。
多個父級:如果多個進程貢獻一個結果(例如,來自多個服務的資料聚合到一個報告中),跨度連結允許您連接所有相關的跨度。
相關事件:當您需要關聯來自不同追蹤的跨度時,例如當一個服務中的故障間接導致另一個服務中的錯誤時,跨度連結是理想的選擇。
同步操作:如果任務之間的關係是直接且同步的,則跨度連結可能會使您的追蹤視覺化變得混亂,而不會增加實際價值。在這種情況下,為了簡單起見,請堅持親子關係。
在高流量系統中,並非每個跨度或連結都需要擷取。 取樣是一種僅記錄一部分追蹤的策略,可確保您擷取足夠的資料進行分析,而不會壓垮您的系統。
基於頭部的取樣:這會捕捉系統入口點(頭部)的痕跡。您可以將此應用於關鍵服務,確保僅為高優先級或重要追蹤建立跨度連結。
基於尾部的採樣: 此採樣基於結果的跟踪,例如僅捕獲導致錯誤的跟踪。您可以使用它來確保在最有可能需要深入調查的情況下使用跨度鏈接,例如失敗。
良好的命名約定和結構化追蹤對於擁有完美的可觀測性資料非常重要,特別是在涉及跨度連結時。跨度的名稱應該清楚地描述它所代表的內容。當使用跨度連結時,這一點變得更加重要,因為跨度之間的關係並不總是視覺上顯而易見。
一致的命名約定:
對跨度名稱使用一致的模式,例如包含服務名稱、函數或操作。 例如,支付處理服務的跨度可能被命名為 payment-service.processPayment。
指出連結跨度的作用:
在您的跨度名稱中,指示連結跨度的角色(如果相關)。例如,user-authentication.request 可以連結到 session-creation.init,使它們之間的聯繫清晰。
群組相關跨度: 邏輯上的群組跨度例如,如果多個微服務參與一個更大的流程,請確保跨度連結和命名有助於識別哪個服務負責每個部分。
文件連結原因: 如果可能,請在追蹤本身(透過元資料)或文件中記錄跨度連結存在的原因。這可以像追蹤程式碼中解釋兩個跨度之間的關係的簡短註解一樣簡單。
如何使用 Span 連結追蹤服務之間的錯誤流
想像一下,您正在管理一個包含大量微服務的複雜 Web 應用程序,每個微服務負責使用者體驗的不同部分。
使用者可能下訂單,這會觸發支付服務、庫存服務和運輸服務。如果此鏈中的某個位置發生錯誤,了解錯誤發生的位置以及它如何影響其他服務至關重要。這就是跨距連結的用武之地。
跨度連結可讓您連接不具有直接父子關係但仍具有上下文相關性的追蹤。使用跨度連結進行錯誤跟踪,您可以將一項服務中的錯誤與後續對其他服務的影響關聯起來,即使他們沒有直接關係。
使用案例: 假設您的支付服務在嘗試處理交易時遇到錯誤,且此故障間接影響了運輸服務。使用跨度鏈接,您可以在付款服務的錯誤跨度與檢測到問題的運輸服務的跨度之間建立關係。
這可以幫助您視覺化跨服務的錯誤流並了解其連鎖反應。
跨微服務捕獲和連結錯誤跨度的程式碼範例
讓我們看看如何使用 OpenTelemetry 捕獲這些錯誤並在它們之間建立跨度連結。這是一個使用 Python 的簡單範例:
from opentelemetry import trace # Initialize tracer tracer = trace.get_tracer("order-service") # Create a span in the payment service with tracer.start_as_current_span("payment-processing") as payment_span: try: # Simulate a payment process that raises an error process_payment() except Exception as e: payment_span.record_exception(e) payment_span.set_status(trace.Status(trace.StatusCode.ERROR, str(e))) # Capture the error trace and create a span link error_link = trace.Link(payment_span.get_span_context()) # Now in the shipping service, you can link this error trace with tracer.start_as_current_span("shipping-service", links=[error_link]) as shipping_span: # Handle the impact of the payment error here process_shipping()
上述程式碼片段的解釋
付款處理範圍捕獲付款失敗時的錯誤。
使用支付處理範圍的上下文建立範圍連結 (error_link)。
此連結隨後會新增至運送服務範圍中,以便您追蹤付款錯誤如何影響運送流程。
您可以使用 SigNoz 等工具來視覺化這些錯誤,從而更輕鬆地確定問題的根本原因。
真實用例:使用跨度連結跨多服務架構追蹤客戶互動
讓我們來看一個現實世界的場景。想像一個電子商務平台,其中客戶操作(例如下訂單)由多種服務處理:訂單服務、庫存服務、付款服務和運輸服務。
使用者下一個訂單可以產生多個跨度,每個服務對應一個跨度。
現在,這些跨度通常以父子關係排列,其中訂單服務可能是付款服務的父級,依此類推。但是如果您想追蹤更複雜的關係怎麼辦?
例如,如果庫存服務在付款確認後獨立檢查庫存水平,則它不是付款服務的直接子級。跨度連結可讓您直接連接這些服務,從而更準確地了解您的服務如何互動。
為什麼跨度連結在複雜架構中很重要
跨度連結使您能夠靈活地捕獲這些非線性交互,從而提供跨服務的使用者操作的全面視圖。這對於解決用戶體驗問題特別有用,例如由於庫存檢查而延遲發貨。
跨度連結如何增強無伺服器或事件驅動系統中的可觀察性
在無伺服器或事件驅動的系統中,服務通常以一種解耦的方式進行交互,事件觸發操作,而服務彼此之間沒有直接了解。
例如,來自支付服務的事件可能會透過事件匯流排觸發庫存更新服務。由於這些服務沒有父子關係,因此用傳統方法追蹤它們可能具有挑戰性。
如何使用無伺服器的跨度連結
跨度連結可以充當這些脫節服務之間的黏合劑。當一個事件從一個服務產生並由另一個服務使用時,您可以建立一個跨度鏈接,將原始事件的跨度與使用服務的跨度連接起來。
這樣,即使您的無伺服器函數獨立運行,您仍然可以獲得互動的完整故事。
範例:假設您的支付服務在處理付款後向佇列發送訊息,並且該訊息觸發無伺服器架構中的庫存更新功能。
這是有關如何連結這些跨度的程式碼片段
from opentelemetry import trace # Initialize tracer tracer = trace.get_tracer("order-service") # Create a span in the payment service with tracer.start_as_current_span("payment-processing") as payment_span: try: # Simulate a payment process that raises an error process_payment() except Exception as e: payment_span.record_exception(e) payment_span.set_status(trace.Status(trace.StatusCode.ERROR, str(e))) # Capture the error trace and create a span link error_link = trace.Link(payment_span.get_span_context()) # Now in the shipping service, you can link this error trace with tracer.start_as_current_span("shipping-service", links=[error_link]) as shipping_span: # Handle the impact of the payment error here process_shipping()
透過此設置,您可以追蹤從付款處理到庫存更新的流程,即使它們是非同步操作的。
可視化後,無伺服器應用程式的不同部分如何互動就變得清晰,從而提高診斷瓶頸或意外延遲的能力。
為什麼這個方法對可觀察性很重要
傳統監控可能會顯示庫存更新速度很慢,但透過跨度鏈接,您可以將該延遲追溯到觸發它的特定支付事件。
這種洞察力對於優化系統和確保流暢的使用者體驗非常寶貴。
Span 連結是 OpenTelemetry 一項未充分利用的強大功能,可顯著增強分散式系統中的追蹤關聯性。
但這到底是什麼意思,為什麼要關心?
將您的應用程式想像為一個由不同服務和進程組成的網絡,所有服務和進程都進行通訊和協作來滿足用戶請求。您經常會遇到這樣的場景:跟蹤之間簡單的父子關係並不能完全捕捉正在發生的事情的複雜性。
例如,如果後台作業正在處理由使用者操作觸發的事件,或者多個服務正在非同步協同工作,該怎麼辦?這就是跨度連結可以輕鬆解決挑戰的地方。
那麼,使用span links有什麼好處呢?
超越親子約束的關聯跨度:
Span 連結可讓您跨服務連接跟踪,而不受父級和子級 Span 的典型層次結構的約束。
當您想要關聯同時發生的事件或共享公共上下文但沒有直接的父子關係時,這特別有用。例如,將面向使用者的服務的追蹤連結到後台進程可以讓您更全面地了解使用者操作如何影響系統效能。
它有助於改善除錯和故障排除:
透過跨度鏈接,您可以更豐富地了解不同服務如何交互,尤其是在複雜的工作流程中。透過查看哪些跨度透過連結相關,您可以識別否則可能難以發現的瓶頸、錯誤模式或效能問題。這使得跨度連結成為調試跨多個服務的問題的強大工具。
它在非同步系統中提供更好的可見性:
對於依賴非同步處理的應用程序,例如使用訊息佇列或事件驅動架構的應用程序,跨度連結是非常寶貴的。
它們允許您追蹤任務或訊息流經不同服務時的生命週期。這可以幫助您了解單一事件對整個系統的影響,從而更輕鬆地優化和完善流程。
簡而言之,跨度連結可讓您建立應用程式行為的更互聯且更有意義的圖片,從而實現更好的可觀察性並更深入地了解分散式系統的運作方式。
透過有效地利用跨度鏈接,您可以增強追蹤關聯性,從而更快地排除故障並提供更完整的系統效能視圖。
對於那些希望深入了解跨度連結和相關概念的官方指南的人,以下資源將對您的研究非常有價值:
OpenTelemetry Span 連結文件
這是了解如何建立和管理跨度連結的首選參考。它涵蓋了連結範圍的 API 規範,以及各種支援的程式語言的範例。這是了解跨度連結如何在後台工作的技術細節的一個很好的起點。
OpenTelemetry 上下文傳播
理解上下文傳播是充分利用跨度連結的關鍵,本文檔提供如何跨追蹤管理上下文的全面概述。如果您希望確保跨分散式服務的追蹤資料的一致性,這尤其有用。
開放遙測取樣策略
實現跨度連結時,了解採樣如何影響追蹤至關重要。本文檔的這一部分提供了有關如何配置不同採樣策略的詳細指導,可協助您在資料粒度和效能之間取得適當的平衡。
這些連結是可供參考和實際應用的寶貴資源,對於任何認真掌握 OpenTelemetry 追蹤功能的人來說都是必不可少的。為這些資源添加書籤,並在建立更複雜的可觀察性設定時將它們用作指南。
如果您有疑問或進一步解釋,請在評論部分分享。
以上是使用 openTelemetry 和 Signoz 掌握透過 Span Links 進行追蹤分析(實用指南,第 2 部分)的詳細內容。更多資訊請關注PHP中文網其他相關文章!