iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
Cloud Native

時光之鏡:透視過去、現在與未來的 Observability系列 第 20

Tempo - 小孩才做選擇,Trace 我全都要

  • 分享至 

  • xImage
  •  

Tempo Logo

資訊處理流程 生成 收集 儲存 使用
Tempo

Tempo 是由 Grafana Labs 在 2020 年 10 月推出的一款高效、使用便捷以及成本低廉的 Tracing Backend。Tempo 主要解決了其他 Tracing Backend 因儲存成本過高而無法保留所有 Traces 的問題,避免落入發生問題卻找不到 Trace 的窘境。Tempo 的策略是將 Traces 存放到 Object Storage 中,例如 Google Cloud Storage 或 Amazon S3,除了利用 Object Storage 低成本的優勢,也同時避免了需要維護像是 Elasticsearch 或 Cassandra 這類其他儲存服務的成本。

在資料收集方面,Tempo 秉持 Grafana Labs 的開放精神,支援多種 Tracing Protocol,包括 Jaeger、Zipkin 和 OpenTelemetry。至於在使用者介面方面,Tempo 主要透過 Grafana 進行操作。簡言之,Tempo 負責接收和儲存 Traces,並透過 API 方式將 Traces 提供給 Grafana 進行查詢,整體架構相對單純。

Pipeline

Concepts

TraceQL

Grafana Labs 在 2023 年 2 月發佈 Tempo 2.0 時,也隨之推出了 TraceQL。這是一種專為 Trace 設計的查詢語言,靈感來自於 PromQL,並且延續了 LogQL 的 Pipeline 設計。通過使用 TraceQL,使用者可以更加精準地查詢 Span 資料,並且支援多種聚合函數,如 count()avg()min()max()sum() 等。

TraceQL
TraceQL 查詢範例圖

TraceQL 查詢案例:

  1. 查詢 http.status_code 為 200 的 Span

    { .http.status_code >= 200 && .http.status_code < 300 }
    
  2. 查尋執行時間介於 0.5 秒到 1 秒的 Span

    { duration >= 0.5s && duration < 1s }
    
  3. 使用正規表達式查詢 http.url 符合 /api/v1/.* 的 Span

    { .http.url =~ "/api/v1/.*" }
    
  4. 查詢 Trace 內有 Span db.statement 符合 INSERT.* 且這些 Span 的平均執行時間超過 1 秒

    { .db.statement =~ "INSERT.*"} | avg(duration)>1s
    
  5. 查詢 http.status_code 為 500 且 http.url 符合 /api/v1/.* 且 http.method 為 POST 或 PUT 的 Span

    {
        .http.status_code = 500   &&
        .http.url =~ "/api/v1/.*" && 
        (.http.method = "POST" || .http.method = "PUT")
    }
    

儲存格式

從 2.0 版本開始,Tempo 支援 Apache Parquet 作為預設的儲存格式。Parquet 是一種 Column-based 的開源資料格式,它不僅能有效地壓縮資料,而且查詢效率高。它還支援多種程式語言,如 Java、Python 和 Go。

在介紹 2.0 版本新功能的文章中提到,改採用 Parquet 格式的其中一個原因是希望使用者能更全面地控制 Tracing Data,能夠依需求搭配其他工具分析資料,而不受限於 Tempo 的功能範疇。同時間推出的 TraceQL 也是基於 Parquet 設計,從而實現更高效和便捷的資料查詢。

Metrics-generator

Metrics-generator 是 Tempo 的一個可選功能,需要手動啟用。其主要作用是根據 Traces 生成與 Request 相關的 Metrics,如執行次數和執行時間分布。由於 Trace 完整記錄了 Request 的時間、來源與目標,Metrics-generator 能提供以下兩個主要功能:

  1. Span Metrics:根據 Span 資訊生成 Metrics。
  2. Service Graphs:利用 Trace 資料生成服務間的關係圖和 RED Metrics(Request Rate、Request Error、Request Duration)。

要啟用 Metrics-generator,需要在 Tempo 的設定檔中添加以下設定:

metrics_generator:
    storage:
      path: "/tmp/metrics"
      remote_write:
        - url: "http://prometheus:9090/api/v1/write"
overrides:
  metrics_generator_processors:
    - service-graphs
    - span-metrics

其他 Metrics-generator 的詳細設定可以參考官方文件

因為 Metrics-generator 僅負責生成 Metrics,而 Tempo 本身不儲存 Metrics,所以必須透過 Prometheus Remote Write API 將 Metrics 儲存至 Prometheus 或其他支援的服務,例如 Mimir、Cortex 等。因此,在設定檔中,我們需要指定 storage.remote_write 以設定 Metrics 儲存的服務,而 storage.path 是用於暫存 Metrics 的目錄。Span Metrics 和 Service Graphs 則是透過 overrides.metrics_generator_processors 來個別啟用。

Span Metrics 提供的 Metrics 包括:

  1. traces_spanmetrics_latency:Histogram 類型,紀錄 Span 的執行時間,可以用來計算 P99、P95 的執行時間等。
  2. traces_spanmetrics_calls_total:Counter 類型,紀錄 Span 的數量。
  3. traces_spanmetrics_size_total:Counter 類型,紀錄 Span 的大小。

這些 Metrics 預設的 Label 有 servicespan_namespan_kindstatus_code,如果要設定其他的 Label,可以透過 metrics_generator.processor.span_metrics.dimensions 設定,例如增加 http.status_code

Service Graphs 是透過 Prometheus Metrics 的方式紀錄服務間的關係,所以需要在 Tempo 的 Data Source 設定 Metrics 來源的 Prometheus,並且啟用 Grafana 的 tempoServiceGraph feature 才能使用。

Tempo Data Source
Tempo Data Source 設定 Prometheus 方式

Grafana 要啟用 feature 的方式有兩種:

  1. 於 Grafana config 中設定 feature_toggles,例如:

    # grafana.ini
    [feature_toggles]
    enable = tempoServiceGraph
    
  2. 使用環境變數 GF_FEATURE_TOGGLES_ENABLE,例如:

    # docker-compose.yaml
    grafana:
        image: grafana/grafana:10.1.0
        environment:
          GF_FEATURE_TOGGLES_ENABLE: "tempoServiceGraph"
    

Service Graphs 的畫面如下:

Service Graphs
可以查看 Service 之間的關係,並且可以看到根據 Span Name 分析的 RED Metrics

Lab

範例程式碼:20-tempo

Quick Start

Basic

  1. 啟動所有服務

    docker-compose up -d
    
  2. 檢視服務

    1. FastAPI App
      1. app-a: http://localhost:8000
      2. app-b: http://localhost:8001
    2. Spring Boot App
      1. app-c: http://localhost:8002
    3. Prometheus: http://localhost:9090
    4. Grafana: http://localhost:3000,登入帳號密碼為 admin/admin
      1. 點擊左上 Menu > Explore,左上 Data Source 選擇 Tempo

        1. Query Type:Search 可以查詢 Traces
        2. Query Type:Service Graph 可以查看 Service 之間的關係,並且可以看到根據 Span Name 分析的 RED Metrics
      2. 透過瀏覽器對 application 的 /chain 發送 Request,可以在 Trace 資訊中看到 app-aapp-bapp-c 互相呼叫的順序

        1. app-a: http://localhost:8000/chain
        2. app-b: http://localhost:8001/chain
        3. app-c: http://localhost:8002/chain
      3. 或是使用 k6 發送 Request

        k6 run --vus 1 --duration 300s k6-script.js
        
  3. 關閉所有服務

    docker-compose down
    

Fake Traces

  1. 啟動所有服務

    docker-compose -f docker-compose.fake.yaml up -d
    
  2. 檢視服務

    1. Prometheus: http://localhost:9090
    2. Grafana: http://localhost:3000,登入帳號密碼為 admin/admin
      1. 點擊左上 Menu > Explore,左上 Data Source 選擇 Tempo
        1. Query Type:Search 可以查詢 Traces
        2. Query Type:Service Graph 可以查看 Service 之間的關係,並且可以看到根據 Span Name 分析的 RED Metrics
  3. 關閉所有服務

    docker-compose -f docker-compose.fake.yaml down
    

Goals

Basic

  1. 建立 FastAPI App(app-a、app-b),透過 OpenTelemetry Automatic Instrumentation 產生與收集 Traces,並發送至 Tempo
  2. 建立 Spring Boot App(app-c),透過 OpenTelemetry Automatic Instrumentation 產生與收集 Traces,並發送至 Tempo
  3. 建立 Tempo,接收 Traces 資料
  4. 建立 Prometheus,接收 Tempo Remote Write 的 Metrics
  5. 建立 Grafana,查詢 Tempo 顯示 Traces 資料以及 Service 之間的關係圖

Fake Traces

  1. 建立 Tempo,接收 Traces 資料
  2. 建立 Prometheus,接收 Tempo Remote Write 的 Metrics
  3. 建立 Grafana,查詢 Tempo 顯示 Traces 資料以及 Service 之間的關係圖
  4. 建立 xk6-client-tracing,Container 啟動後會自動產生 Traces 資料並發送至 Tempo,模擬真實環境的 Traces 資料

小結

Tempo 在 Tracing Backend 領域具有明顯的優勢,尤其是在成本和簡易性方面。它不僅允許使用者選擇將資料儲存在 Local Disk 或 Object Storage,而且安裝和部署過程也相對簡單。如果已經是 Grafana 的使用者,那麼 Tempo 絕對是值得考慮的選項。除此之外,Tempo 也提供了強大的 Metrics-generator 和 TraceQL 功能,進一步方便了使用者從 Traces 資料中獲取有用的服務資訊。

參考資料

  1. Tempo documentation
  2. Preview of Tempo 2.0 and TraceQL
  3. Announcing Grafana Tempo, a massively scalable distributed tracing system
  4. Get to know TraceQL: A powerful new query language for distributed tracing
  5. New in Grafana Tempo 2.0: Apache Parquet as the default storage format, support for TraceQL

上一篇
OpenTelemetry SDK — Automatic Instrumentation 給你一對翅膀
下一篇
Jaeger - 系統軌跡,無所遁形
系列文
時光之鏡:透視過去、現在與未來的 Observability30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言