go-zero docker-compose 搭建課件服務(八):整合jaeger鏈路追蹤

slowquery發表於2022-09-05

0、轉載

go-zero docker-compose 搭建課件服務(八):整合jaeger鏈路追蹤

0.1原始碼地址

github.com/liuyuede123/go-zero-cou...

1、鏈路追蹤

一個外部請求需要內部若干服務的聯動響應,這時候完整的呼叫軌跡將跨越多個服務,同時包括服務間的網路傳輸資訊與各個服務內部的呼叫堆疊資訊。追蹤的主要目的是排查故障,如分析呼叫鏈的哪一部分、哪個方法出現錯誤或阻塞,輸入輸出是否符合預期,等等。

鏈路追蹤中有幾個比較重要的概念:

  1. trace:從客戶端發起請求抵達系統的邊界開始,記錄請求流經的每一個服務,直到到向客戶端返回響應為止,這整個過程就稱為一次trace
  2. span:由於每次 Trace 都可能會呼叫數量不定、座標不定的多個服務,為了能夠記錄具體呼叫了哪些服務,以及呼叫的順序、開始時點、執行時長等資訊,每次開始呼叫服務前都要先埋入一個呼叫記錄,這個記錄稱為一個Span。應含有時間戳、起止時間、Trace 的 ID、當前 Span 的 ID、父 Span 的 ID 等能夠滿足追蹤需要的資訊
  3. OpenTracing:OpenTracing 是一套與平臺無關、與廠商無關、與語言無關的追蹤協議規範,只要遵循 OpenTracing 規範,任何公司的追蹤探針、儲存、介面都可以隨時切換,也可以相互搭配使用。

https://i.iter01.com/images/3cca84d8ae36aef370cbd80f01aebec2dda807e8fde6102e209a2a46b2daea4d.png

參考鳳凰架構

2、jaeger

Jaeger 受 Dapper 和 OpenZipkin 的啟發,是 Uber Technologies 以開源形式釋出的分散式跟蹤系統。 它由檢測 SDK、用於資料收集和儲存的後端、用於視覺化資料的 UI 以及用於聚合跟蹤分析的 Spark/Flink 框架組成。

jaeger架構如下:

https://i.iter01.com/images/b2df962ec960dce8bc61f856194379d37a205c320067170d9c6fe30ef74fe9cf.png

  1. Instrumentation SDKs:整合到應用程式和框架中以捕獲跟蹤資料的庫。 從歷史上看,Jaeger 專案支援使用各種程式語言編寫的自己的客戶端庫。 它們現在被棄用,取而代之的是 OpenTelemetry
  2. Jaeger Agent: Jaeger 代理是一個網路守護程式,用於偵聽透過 UDP 從 Jaeger 客戶端接收到的 span。 它收整合批的它們,然後將它們一起傳送給收集器。 如果 SDK 被配置為將 span 直接傳送到收集器,則不需要代理
  3. Jaeger Collector: Jaeger 收集器負責從 Jaeger 代理接收跟蹤,執行驗證和轉換,並將它們儲存到選定的儲存後端
  4. Storage Backends: Jaeger 支援各種儲存後端來儲存跨度。 支援的儲存後端有 In-Memory、Cassandra、Elasticsearch 和 Badger(用於單例項收集器部署)
  5. Jaeger Query:這是一項服務,負責從 Jaeger 儲存後端檢索跟蹤資訊,並使其可供 Jaeger UI 訪問。
  6. Jaeger UI:一個 React 應用程式,可讓您視覺化跟蹤並分析它們。 對於除錯系統問題很有用。
  7. Ingester:只有當我們使用 Kafka 作為收集器和儲存後端之間的緩衝區時,ingester 才是相關的。 它負責從 Kafka 接收資料並將其攝取到儲存後端。 更多資訊可以在官方 Jaeger Tracing 文件中找到。

3、go-zero中整合jaeger

首先我們需要在專案根目錄下增加jaeger和elasticsearch的Dockerfile。

jaeger的查詢和收集器服務配置了支援的儲存型別 - 目前是 Cassandra 或 Elasticsearch。

這裡我們使用elasticsearch做儲存

FROM rancher/jaegertracing-all-in-one:1.20.0

LABEL maintainer="liuyuede123 <liufutianoppo@163.com>"
FROM elasticsearch:7.13.1

LABEL maintainer="liuyuede123 <liufutianoppo@163.com>"

docker-compose.yml中增加jaeger和elasticsearch的配置。

...

  jaeger:
    build:
      context: ./jaeger
    environment:
      - TZ=Asia/Shanghai
      - SPAN_STORAGE_TYPE=elasticsearch
      - ES_SERVER_URLS=http://elasticsearch:9200
      - LOG_LEVEL=debug
    privileged: true
    ports:
      - "6831:6831/udp"
      - "6832:6832/udp"
      - "5778:5778"
      - "16686:16686"
      - "4317:4317"
      - "4318:4318"
      - "14250:14250"
      - "14268:14268"
      - "14269:14269"
      - "9411:9411"
    networks:
      - backend
    restart: always

  elasticsearch:
    build:
      context: ./elasticsearch
    environment:
      - TZ=Asia/Shanghai
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    privileged: true
    ports:
      - "9200:9200"
    networks:
      - backend
    restart: always

相關的埠解釋可以參考官方文件

go-zero中已經內建支援jaeger,所以只需要配置下就可以使用

我們在之前建立的user-api,user-rpc,courseware-api,courseware-rpc中增加鏈路追蹤相關的配置

需要在.yaml中增加配置

...

Telemetry:
  Name: user-api
  Endpoint: http://jaeger:14268/api/traces
  Sampler: 1.0
  Batcher: jaeger
Telemetry:
  Name: user-rpc
  Endpoint: http://jaeger:14268/api/traces
  Sampler: 1.0
  Batcher: jaeger
Telemetry:
  Name: courseware-api
  Endpoint: http://jaeger:14268/api/traces
  Sampler: 1.0
  Batcher: jaeger
Telemetry:
  Name: courseware-rpc
  Endpoint: http://jaeger:14268/api/traces
  Sampler: 1.0
  Batcher: jaeger

dcoker-compose up -d啟動新增的jaeger服務和elasticsearch服務

請求介面看下jaeger中服務是否寫入成功

訪問http://localhost:16686/檢視是否安裝成功

https://i.iter01.com/images/6e3b3a0f4a94831898d75ff7629d344724941e3c564418f411ab5a4629a48db9.png

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章