0、轉載
go-zero docker-compose 搭建課件服務(八):整合jaeger鏈路追蹤
0.1原始碼地址
github.com/liuyuede123/go-zero-cou...
1、鏈路追蹤
一個外部請求需要內部若干服務的聯動響應,這時候完整的呼叫軌跡將跨越多個服務,同時包括服務間的網路傳輸資訊與各個服務內部的呼叫堆疊資訊。追蹤的主要目的是排查故障,如分析呼叫鏈的哪一部分、哪個方法出現錯誤或阻塞,輸入輸出是否符合預期,等等。
鏈路追蹤中有幾個比較重要的概念:
- trace:從客戶端發起請求抵達系統的邊界開始,記錄請求流經的每一個服務,直到到向客戶端返回響應為止,這整個過程就稱為一次trace
- span:由於每次 Trace 都可能會呼叫數量不定、座標不定的多個服務,為了能夠記錄具體呼叫了哪些服務,以及呼叫的順序、開始時點、執行時長等資訊,每次開始呼叫服務前都要先埋入一個呼叫記錄,這個記錄稱為一個Span。應含有時間戳、起止時間、Trace 的 ID、當前 Span 的 ID、父 Span 的 ID 等能夠滿足追蹤需要的資訊
- OpenTracing:OpenTracing 是一套與平臺無關、與廠商無關、與語言無關的追蹤協議規範,只要遵循 OpenTracing 規範,任何公司的追蹤探針、儲存、介面都可以隨時切換,也可以相互搭配使用。
參考:鳳凰架構
2、jaeger
Jaeger 受 Dapper 和 OpenZipkin 的啟發,是 Uber Technologies 以開源形式釋出的分散式跟蹤系統。 它由檢測 SDK、用於資料收集和儲存的後端、用於視覺化資料的 UI 以及用於聚合跟蹤分析的 Spark/Flink 框架組成。
jaeger架構如下:
- Instrumentation SDKs:整合到應用程式和框架中以捕獲跟蹤資料的庫。 從歷史上看,Jaeger 專案支援使用各種程式語言編寫的自己的客戶端庫。 它們現在被棄用,取而代之的是 OpenTelemetry
- Jaeger Agent: Jaeger 代理是一個網路守護程式,用於偵聽透過 UDP 從 Jaeger 客戶端接收到的 span。 它收整合批的它們,然後將它們一起傳送給收集器。 如果 SDK 被配置為將 span 直接傳送到收集器,則不需要代理
- Jaeger Collector: Jaeger 收集器負責從 Jaeger 代理接收跟蹤,執行驗證和轉換,並將它們儲存到選定的儲存後端
- Storage Backends: Jaeger 支援各種儲存後端來儲存跨度。 支援的儲存後端有 In-Memory、Cassandra、Elasticsearch 和 Badger(用於單例項收集器部署)
- Jaeger Query:這是一項服務,負責從 Jaeger 儲存後端檢索跟蹤資訊,並使其可供 Jaeger UI 訪問。
- Jaeger UI:一個 React 應用程式,可讓您視覺化跟蹤並分析它們。 對於除錯系統問題很有用。
- 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/檢視是否安裝成功
本作品採用《CC 協議》,轉載必須註明作者和本文連結