在 Rust 中使用 OpenTelemetry 做分佈式跟蹤
在本文中,將分享如何在 Rust 應用程序中添加 OpenTelemetry 做分佈式跟蹤。
OpenTelemetry 是什麼?
OpenTelemetry 是一個 api 和 sdk 的集合,它允許我們收集跟蹤、導出日誌和生成指標 (也稱爲可觀察性的三大支柱)。
它是 CNCF 社區 (雲原生計算基金會) 驅動的開源項目。在雲原生環境中,我們使用 OpenTelemetry(簡稱 OTel)從應用系統的操作和事件中收集數據。換句話說,爲我們的分佈式服務提供觀測工具。這些數據使我們能夠理解和調查我們的軟件的行爲,並排除性能問題和錯誤。
OpenTelemetry 是一個標準的可觀測框架,它捕獲單個規範下的所有數據。它提供了幾個組件,包括:
-
api/sdk:用於生成遙測數據
-
OpenTelemetry Collector:用於接收、處理遙測數據,並將其導出到不同的目的地。
-
OTLP:遙測數據協議
關於使用 OpenTelemetry,以下是你需要知道的術語:
-
Span:最基本的單位。span 表示系統中的一個事件 (例如,一個 HTTP 請求或一個跨時間的數據庫操作)。一個 span 通常是另一個 span 的父 span 或子 span。
-
Trace:分佈式服務的 “調用棧”。traces 表示父子 Span 的關係樹,trace 指定了應用程序中跨不同服務和組件的請求進程 (DB、數據源、隊列等)。例如,向 user-service 發送 API 調用會導致向 users-db 進行數據庫查詢。
-
Exporter:導出器。一旦我們創建了一個 span,導出器將處理數據發送到我們的後端 (例如,在內存中,Jaeger,或控制檯輸出)。
-
Context Propagation:這個機制允許我們跨分佈式服務關聯事件。Context 被稱爲我們收集和傳輸的元數據。Propagation 是將上下文打包並跨服務傳輸,通常是通過 HTTP 頭。上下文傳播是 OpenTelemetry 的亮點之一。
-
Instrumentation:收集數據的工具庫,並基於我們應用程序中不同的庫生成相對應的 Span(Actix-Web、Postgres…)。
Rust 中的跟蹤
在 Rust 中有一個很棒的 crate 叫 tracing。它是我們追蹤 Rust 程序的核心框架,它的文檔概述了它的核心概念和由這些術語組成的 api — spans, events, and subscribers.
前面已經介紹了 span 和 Events 是什麼,但 subscriber 是一個新的術語。要記錄 span 和 event,必須實現 subscriber 特徵。這意味着需要實現以下方法:
-
enter:表示一個 span 開始
-
exit:表示一個 span 結束
-
event:表示一個 event 已經發生
要開始記錄跟蹤,我們需要初始化訂閱者。
我們需要先初始化註冊表 struct:
let subscriber = tracing_subscriber::Registry::default()
這個 struct 實現了一個 subscriber,並向我們展示了另一個重要特性——層。通過使用層,我們可以配置 subscriber,以便在與 span 和 event 交互時應用特定的行爲。
例如,如果我們希望過濾、導出、格式化或編輯一些數據,可以創建或使用現有層,並將其與註冊表的 subscriber 組合在一起。
let subscriber = tracing_subscriber::Registry::default().with(SomeLayer)
我們將在實踐部分看到更多如何使用這些 crate 來編寫 Rust 程序的例子。
Rust 中的 OpenTelemetry
在 Rust 中提供 OpenTelemetry 支持的 crate 就被稱爲 OpenTelemetry。它的介紹是 “OpenTelemetry 提供了一組 api、庫、代理和收集器服務,用於從應用程序中捕獲分佈式跟蹤數據和指標”。
讓我們來看看它的一些關鍵 api:
-
Tracer:在 crate 內部,有一個稱爲 traces 的模塊。它向我們介紹了一個叫做 Tracer 的特徵。這是跟蹤和連接我們的 span 來創建跟蹤數據。爲了使用 Tracer,我們創建了一個 subscriber 層。這就是 subscriber 如何知道將 span 發送到哪裏以及如何生成跟蹤數據。
-
Global:該模塊提供了一個 API,因此無論當前處於代碼的哪個部分,我們都可以訪問 subscriber、tracer 和傳播上下文。
-
SDK:該模塊提供了常用用例的實現。例如,它提供了一個導出器,用於向 stdout 發送跟蹤數據。它還實現了上下文傳播的方法,因此就我們自己去實現。
Rust 中的分佈式跟蹤
使用 opentelemetry-rust,我們可以跨多個服務檢測我們的應用程序,並將它們發送到分佈式平臺。
例如,我們可以使用 opentelemetry-jaeger crate 將我們的跟蹤數據發送到一個遠程的 Jaeger 平臺。
另一個例子是 OpenTelementy-otlp crate,可以使用導出器將 OTLP 格式的跟蹤數據導出到 OpenTelemetry 收集器。OpenTelemetry Collector 以與供應商無關的方式接受、處理和導出跟蹤數據。
在 Rust 應用如何使用 OpenTelemetry 來集成和可視化跟蹤數據,請參考 << 用 Rust 實現 KV Server-6 併發連接限制和測量監控 >> 這篇文章。
本文翻譯自:
https://medium.com/@team_Aspecto/guide-to-opentelemetry-distributed-tracing-in-rust-f1d9294b662e
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/UimE4oiWb2ZUz8gWPpV8yQ