當前位置:編程學習大全網 - 遊戲軟體 - OpenTelemetry、Spring Cloud Sleuth、Kafka、Jager實現分布式跟蹤

OpenTelemetry、Spring Cloud Sleuth、Kafka、Jager實現分布式跟蹤

分布式跟蹤可讓您深入了解特定服務在分布式軟件系統中作為整體的壹部分是如何執行的。它跟蹤和記錄從起點到目的地的請求以及它們經過的系統。

在本文中,我們將使用 OpenTelemetry、Spring Cloud Sleuth、Kafka 和 Jaeger 在三個 Spring Boot 微服務 中實現分布式跟蹤。

我們先來看看分布式追蹤中的壹些基本術語。

跨度:表示系統內的單個工作單元。跨度可以相互嵌套以模擬工作的分解。例如,壹個跨度可能正在調用壹個 REST 端點,然後另壹個子跨度可能是該端點調用另壹個,等等在不同的服務中。

Trace:所有***享相同根跨度的跨度集合,或者更簡單地說,將所有跨度創建為原始請求的直接結果。跨度的層次結構(每個跨度在根跨度旁邊都有自己的父跨度)可用於形成有向無環圖,顯示請求在通過各種組件時的路徑。

OpenTelemetry ,也簡稱為 OTel,是壹個供應商中立的開源 Observability 框架,用於檢測、生成、收集和導出遙測數據,例如 跟蹤 、 指標 和 日誌 。作為 雲原生 計算基金會 (CNCF) 的孵化項目,OTel 旨在提供與供應商無關的統壹庫和 API 集——主要用於收集數據並將其傳輸到某處。OTel 正在成為生成和管理遙測數據的世界標準,並被廣泛采用。

Sleuth 是壹個由 Spring Cloud 團隊管理和維護的項目,旨在將分布式跟蹤功能集成到 Spring Boot 應用程序中。它作為壹個典型Spring Starter的 . 以下是壹些開箱即用的 Sleuth 工具:

Sleuth 添加了壹個攔截器,以確保在請求中傳遞所有跟蹤信息。每次調用時,都會創建壹個新的 Span。它在收到響應後關閉。

Sleuth 能夠跟蹤您的請求和消息,以便您可以將該通信與相應的日誌條目相關聯。您還可以將跟蹤信息導出到外部系統以可視化延遲。

Jaeger 最初由 Uber 的團隊構建,然後於 2015 年開源。它於 2017 年被接受為雲原生孵化項目,並於 2019 年畢業。作為 CNCF 的壹部分,Jaeger 是雲原生 架構 中公認的項目。它的源代碼主要是用 Go 編寫的。Jaeger 的架構包括:

與 Jaeger 類似,Zipkin 在其架構中也提供了相同的組件集。盡管 Zipkin 是壹個較老的項目,但 Jaeger 具有更現代和可擴展的設計。對於此示例,我們選擇 Jaeger 作為後端。

讓我們設計三個 Spring Boot 微服務:

這三個微服務旨在:

這是為了觀察 OpenTelemetry 如何結合 Spring Cloud Sleuth 處理代碼的自動檢測以及生成和傳輸跟蹤數據。上面的虛線捕獲了微服務導出的跟蹤數據的路徑,通過OTLP(OpenTelemetry Protocol)傳輸到OpenTelemetry Collector,收集器依次處理並將跟蹤數據導出到後端Jaeger進行存儲和查詢。

使用 monorepo,我們的項目結構如下:

第 1 步:添加 POM 依賴項

這是使用 OTel 和 Spring Cloud Sleuth 實現分布式跟蹤的關鍵。我們的目標是不必手動檢測我們的代碼,因此我們依靠這些依賴項來完成它們設計的工作——自動檢測我們的代碼,除了跟蹤實現、將遙測數據導出到 OTel 收集器等。

第 2 步:OpenTelemetry 配置

OpenTelemetry 收集器端點

對於每個微服務,我們需要在其中添加以下配置application.yml(請參閱下面部分中的示例片段)。spring.sleuth.otel.exporter.otlp.endpoint主要是配置OTel Collector端點。它告訴導出器,在我們的例子中是 Sleuth,通過 OTLP 將跟蹤數據發送到指定的收集器端點pose 服務。

跟蹤數據概率抽樣

spring.sleuth.otel.config.trace-id-ratio-based屬性定義了跟蹤數據的采樣概率。它根據提供給采樣器的分數對壹部分跡線進行采樣。概率抽樣允許 OpenTelemetry 跟蹤用戶通過使用隨機抽樣技術降低跨度收集成本。如果該比率小於 1.0,則某些跡線將不會被導出。對於此示例,我們將采樣配置為 1.0、100%。

有關其他 OTel Spring Cloud Sleuth 屬性,請參閱常見應用程序屬性。

OpenTelemetry 配置文件

我們需要項目根目錄下的 OTel 配置文件otel-config.yaml。內容如下。此配置文件定義了 OTel 接收器、處理器和導出器的行為。正如我們所看到的,我們定義了我們的接收器來監聽 gRPC 和 HTTP,處理器使用批處理和導出器作為 jaeger 和日誌記錄。

第 3 步:docker-compose 將所有內容串在壹起

讓我們看看我們需要啟動哪些 docker 容器來運行這三個微服務並觀察它們的分布式跟蹤,前三個微服務在上面的部分中進行了解釋。

運行docker-compose up -d以調出所有九個容器:

第 4 步:追蹤數據在行動

快樂之路

現在,讓我們啟動customer-service-bff流程的入口點,以創建新客戶。

啟動 Jaeger UI, /?target=http%3A//localhost%3A16686/%2C]按[/url]服務搜索customer-service-bff,單擊Find Traces按鈕,這是我們看到的創建客戶跟蹤:它跨越三個服務,總***跨越六個,持續時間 82.35 毫秒。

除了 Trace Timeline 視圖(上面的屏幕截圖),Jaeger 還提供了壹個圖形視圖(Trace Graph在右上角的下拉菜單中選擇):

三個微服務在 docker 中的日誌輸出顯示相同的跟蹤 id,以紅色突出顯示,並根據其應用程序名稱顯示不同的跨度 id(應用程序名稱及其對應的跨度 id 以匹配的顏色突出顯示)。在 的情況下customer-service,相同的 span id 從 REST API 請求傳遞到 Kafka 發布者請求。

customer-service讓我們在 docker 中暫停我們的PostgreSQL 數據庫,然後重復從customer-service-bff. 500 internal server error正如預期的那樣,我們得到了。檢查 Jaeger,我們看到以下跟蹤,異常堆棧跟蹤抱怨SocketTimeoutException,再次如預期的那樣。

識別長期運行的跨度

Jaeger UI 允許我們搜索超過指定最大持續時間的跟蹤。例如,我們可以搜索所有耗時超過 1000 毫秒的跟蹤。然後,我們可以深入研究長期運行的跟蹤以調查其根本原因。

在這個故事中,我們從 OpenTelemetry、Spring Cloud Sleuth 和 Jaeger 的角度解壓了分布式跟蹤,驗證了 REST API 調用和 Kafka pub/sub 中分布式跟蹤的自動檢測。我希望這個故事能讓妳更好地理解這些跟蹤框架和工具,尤其是 OpenTelemetry,以及它如何從根本上改變我們在 分布式系統 中進行可觀察性的方式。

  • 上一篇:二十不惑好看嗎
  • 下一篇:中國移動的非常假期怎麽取消
  • copyright 2024編程學習大全網