开始使用 Grafana Tempo

讓我們深入探討分散式追蹤後端系統 Grafana Tempo 的基本原理。

分散式追蹤是一種獲取系統效能細緻資訊的方法。 它提供了一種可視化請求在應用程式生命週期中如何流動的方式。 此應用程式可能包含存在於單個節點上或分散在多個節點上的多個服務。

因此,透過使用分散式追蹤,您可以獲得所有服務的統一視圖。 Grafana Tempo 就是為此而生。

什麼是 Grafana Tempo?

在今年的 ObservabilityCon 大會上,Grafana Labs 發表了一些重大更新,其中之一就是 Grafana Tempo。 Grafana Labs 在其開源產品組合中新增了一個項目:「Grafana Tempo」。

Grafana Tempo 是一個開源分散式追蹤後端系統,具有高度的可擴展性和易用性。 Tempo 完全相容於其他追蹤協定,例如 Zipkin、Jaeger、OpenTelemetry 和 OpenCensus。 目前支援 Loki 中的 Tempo 資料探索引擎,以及 Prometheus、Grafana 等監控平台。 Grafana 7.3+ 版本提供了 Grafana 和 Tempo 之間的無縫整合體驗。

為什麼要使用 Tempo?

Tempo 用於關聯指標、追蹤和日誌。 在某些情況下,使用者可能會多次遇到相同類型的錯誤。 如果想瞭解發生了什麼事,我們需要檢視確切的追蹤記錄。 但由於下採樣,一些有價值的信息可能會遺失。 使用 Tempo,我們不再需要對分散式追蹤資料進行下採樣。 我們可以將完整的追蹤資訊儲存在 S3 或 GCS 等物件儲存中,這使得 Tempo 非常具有成本效益。

此外,Tempo 允許您從指標快速跳轉到記錄問題的特定日誌的相關追蹤,從而實現更快速的偵錯/故障排除。

以下是 Tempo 中使用的配置選項:

  • Distributor(分發器): 這些用於配置接收跨度(span)的選項,然後將它們傳送到攝取器。
  • Ingester(攝取器): 這些用於建立批次追蹤,並將其傳送到 TempoDB 進行儲存。
  • Compactor(壓縮器): 它從 S3 或 GCS 等儲存中串流處理區塊,將它們合併,然後寫回儲存中。
  • 儲存: 這用於配置 TempoDB。 您需要在配置中提及其他參數來指定儲存後端名稱(S3 或 GCS)。
  • Memberlist(成員列表): 用於 Tempo 组件之間的協調。
  • Authentication/Server(驗證/伺服器): Tempo 使用 Weaveworks/Common 伺服器。 它用於設定伺服器配置。

Tempo 架構

上圖顯示了 Grafana Tempo 的工作架構。

首先,分發器從 Zipkin、Jaeger、OpenTelemetry、OpenCensus 接收不同格式的跨度,並透過雜湊追蹤 ID 將這些跨度傳送到攝取器。 攝取器接著建立批次追蹤,稱為「區塊」。

然後,它將這些區塊傳送到後端儲存 (S3/GCS)。 當您有需要進行故障排除的追蹤 ID 時,您可以使用 Grafana UI 並將追蹤 ID 放入搜尋欄中。 現在,查詢器負責從攝取器或物件儲存中取得您輸入的追蹤 ID 的詳細資訊。

首先,它檢查該追蹤 ID 是否存在於攝取器中; 如果找不到,它會檢查儲存後端。 它使用一個簡單的 HTTP 端點來公開追蹤。 同時,壓縮器從儲存中取出區塊,將它們合併,然後發回儲存,以減少儲存中的區塊數量。

使用 Docker 設定 Tempo

在本節中,我將逐步說明如何使用 Docker 設定 Grafana Tempo。 首先,您需要一個 Tempo 後端,因此請設定一個 Docker 網路。

docker network create docker-tempo

下載 Tempo 的設定檔。

curl -o tempo.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-local.yaml

以下是您可用的通訊協定選項列表:

通訊協定 連接埠
OpenTelemetry 55680
Jaeger – Thrift Compact 6831
Jaeger – Thrift Binary 6832
Jaeger – Thrift HTTP 14268
Jaeger – GRPC 14250
Zipkin 9411

使用 Tempo 設定檔,執行一個 Docker 容器。 在這裡,我選擇使用 Jaeger – Thrift Compact 格式(連接埠 6831)來傳送追蹤。

docker run -d --rm -p 6831:6831/udp --name tempo -v $(pwd)/tempo-local.yaml:/etc/tempo-local.yaml --network docker-tempo grafana/tempo:latest -config.file=/etc/tempo-local.yaml

現在,您需要執行 Tempo 查詢容器。 所以,首先下載 Tempo 查詢設定檔。

curl -o tempo-query.yaml https://raw.githubusercontent.com/grafana/tempo/master/example/docker-compose/etc/tempo-query.yaml

使用 Tempo 查詢設定檔,執行 Docker 容器。

docker run -d --rm -p 16686:16686 -v $(pwd)/tempo-query.yaml:/etc/tempo-query.yaml --network docker-tempo grafana/tempo-query:latest --grpc-storage-plugin.configuration-file=/etc/tempo-query.yaml

現在,可以透過 http://localhost:16686 存取 Jaeger UI,如下所示。

在搜尋欄中,您可以新增要進行故障排除的日誌中的追蹤 ID,它會為您產生追蹤資訊。

在 Tempo 上執行示範應用程式

現在是時候執行 Grafana Tempo 提供的示範範例了。 我將執行一個 docker-compose 範例,因此,如果您要嘗試相同的範例,必須在您的電腦上安裝 docker-compose。

下載 Grafana Tempo zip 檔案: https://github.com/grafana/tempo

將其解壓縮到您的主資料夾中,然後切換到 docker-compose 目錄。 您會發現 docker-compose 的多個範例; 我將使用應用程式資料儲存在本機的範例。

cd tempo-master/example/docker-compose/
ls
docker-compose.loki.yaml docker-compose.s3.minio.yaml docker-compose.yaml etc
example-data readme.md tempo-link.png

執行下列命令來啟動堆疊。

docker-compose up -d
Starting docker-compose_prometheus_1 ... done
Starting docker-compose_tempo_1 ... done
Starting docker-compose_grafana_1 ... done
Starting docker-compose_tempo-query_1 ... done
Starting docker-compose_synthetic-load-generator_1 ... done

您會看到它已啟動 Grafana、Loki、Tempo、Tempo-query 和 Prometheus 的容器。

docker ps
CONTAINER ID   IMAGE                                      COMMAND                  CREATED          STATUS         PORTS                                                                                                      NAMES
84cd557ce07b   grafana/tempo-query:latest                 "/go/bin/query-linux…"   10 minutes ago   Up 4 seconds   0.0.0.0:16686->16686/tcp                                                                                   docker-compose_tempo-query_1
f7cd9cf460d9   omnition/synthetic-load-generator:1.0.25   "./start.sh"             10 minutes ago   Up 4 seconds                                                                                                              docker-compose_synthetic-load-generator_1
6d9d9fbdb8f1   grafana/grafana:7.3.0-beta1                "/run.sh"                10 minutes ago   Up 6 seconds   0.0.0.0:3000->3000/tcp                                                                                     docker-compose_grafana_1
d8574ea25028   grafana/tempo:latest                       "/tempo -config.file…"   10 minutes ago   Up 6 seconds   0.0.0.0:49173->3100/tcp, 0.0.0.0:49172->14268/tcp                                                          docker-compose_tempo_1
5f9e53b5a09c   prom/prometheus:latest                     "/bin/prometheus --c…"   10 minutes ago   Up 6 seconds   0.0.0.0:9090->9090/tcp                                                                                     docker-compose_prometheus_1

您也可以前往瀏覽器並驗證 Grafana、Jaeger UI 和 Prometheus 是否正在執行。

現在,在容器內執行的合成負載產生器會產生將放入 Tempo 中的追蹤 ID。 執行下列命令,您就可以檢視日誌。

docker-compose logs -f synthetic-load-generator
Attaching to docker-compose_synthetic-load-generator_1
synthetic-load-generator_1 
| using params: 
--jaegerCollectorUrl http://tempo:14268
synthetic-load-generator_1 
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /product, 2880 traces/hr
synthetic-load-generator_1 
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /cart, 14400 traces/hr
synthetic-load-generator_1 
| 21/04/17 14:24:34 INFO ScheduledTraceGenerator: Starting trace generation for service frontend, route /checkout, 480 traces/hr
synthetic-load-generator_1 
| 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 17867942c5e161f2 for service frontend route /currency
synthetic-load-generator_1 
| 21/04/17 14:24:37 INFO ScheduledTraceGenerator: Emitted traceId 3d9cc23c8129439f for service frontend route /shipping
synthetic-load-generator_1 

這些是您需要傳遞以產生追蹤的追蹤 ID。

我正在複製其中一個追蹤 ID 並將其放入 Jaeger UI 搜尋欄中。

您可以看到它已成功產生與我提供的追蹤 ID 相關的追蹤資訊。

總結

以上就是有關 Grafana Tempo 的全部內容。 請繼續並開始使用 Tempo 來產生追蹤資訊,以便深入瞭解日誌中的指標和問題。

一切都記錄在 Tempo 中,您不會因為過去發生的下採樣而遺漏任何細節。 Tempo 可以讓開發人員或生產團隊直接了解日誌中可能發生的錯誤或警告的根本原因。