跳至主要内容

[Tempo] 時光之韻 - Tempo 捕捉追蹤節奏

Background

Grafana Tempo 於 2020 年在 Grafana Labs 的 ObservabilityCON 上正式作為一個開源專案發表。

隨著微服務與雲原生應用日益普及,傳統的單一應用監控方式已無法滿足複雜系統的需求,Tempo 也因此應運而生,透過簡化索引機制與支援物件儲存的設計,實現了高效且低成本的追蹤數據儲存與查詢解決方案。

Grafana Tempo

Tempo 能夠與現今主流的追蹤系統整合,包括 Jaeger、Zipkin 與 OpenTelemetry。 其設計不僅考量到資料收集與儲存的效率,同時也強調與 Grafana 生態系統中其他工具 (如 Loki 與 Prometheus) 的無縫整合,進而提供從度量、日誌到追蹤的全方位觀察性解決方案。

Introduction

Grafana Tempo

上圖展示了 Tempo 系統的主要架構,主要分為以下幾個部分 :

  • Client Instrumentation : 透過 OpenTelemetry SDK 或其他支援的 SDK,將應用程式中關鍵的執行數據進行蒐集
  • Pipeline (Alloy) : 在分散式系統中,資料往往來自多個來源與節點。Alloy 負責將這些資料進行整合,並按照預先定義的流程將資料轉發至後端儲存系統
  • Backend : 在資料經由 Alloy 處理後,會進入 Tempo 的後端儲存模組
  • Visualization : 透過 Grafana 儀表板,使用者可以直觀地查看與分析追蹤數據

Grafana Tempo

上圖展示了 Tempo 與其他開源工具 (Jeager、Zapkin) 的比較

分佈式追踪專門用於搜集應用程式內部以及與請求相關的資料,方便對整個系統進行監控和分析。 在這個過程中,一個追踪會被分解成或多個 span,每個 span 代表請求中的一次呼叫。

Trace

Architecture

Trace

Components

Distributor

  • 負責接收從各種客戶端 (OpenTelemetry、Jeager) 進入的原始資料
  • 使用 consistent hashing 將資料分發到不同的 Ingester 節點
  • 使用 OpenTelemetry Collector 的 Receiver Layer

Ingester

  • 負責將資料分成塊,創建 Bloom Filter 以及索引,並存儲到後端儲存系統
<bucketname> / <tenantID> / <blockID> / <meta.json>
/ <index>
/ <data>
/ <bloom_0>
/ <bloom_1>
...
/ <bloom_n>

Query Frontend

  • 負責接收查詢請求,並切分查詢空間
  • 切分 block 並發送到 Queue 中,Quierier 會透過 gRPC 進行查詢
  • HTTP endpoint GET /api/traces

Querier

  • 根據參數在 ingester 跟 backend 中尋找需要的資料

Compactor

  • 負責壓縮舊的 block 來減少所需的儲存空間

Metric generator

Metric generator 是一個可選的元件,可以從 ingester 中蒐集的追蹤資料中提取並生成 metric,進一步提升系統的觀察性與診斷能力。

Metric generator 內置一組處理器,可以處理 :

  • Service graphs : 構建分散式系統中各服務間的依賴關係圖
  • Span metrics : 從每個 span 中提取 RED 指標
  • Local blocks : 此處理器暫存一段時間內的 span 資料,允許系統在後續透過更複雜的 API 進行數據計算與分析

Reference