分散式鏈路追蹤Jaeger + 微服務Pig在Rainbond上的實踐分享

隨著微服務架構的流行,客戶端發起的一次請求可能需要涉及到多個或 N 個服務,致使我們對服務之間的監控和排查變得更加複雜。

舉個例子:

某條業務線的某個介面調用服務端時快時慢,這時就需要排查各個服務的日誌進行分析,調動各個服務的開發人員聯動排查,這種排查費時又費力。對於 ToB 的業務有時候還拿不到日誌,難搞哦!

因此,就需要可以幫助理解系統行為、用於分析性能問題的工具,以便發生故障的時候,能夠快速定位和解決問題,那就是 APM (Application Performance Monitor)。目前流行的 APM 開源工具有很多,比如:Zipkin,Skywalking,Pinpoint、Jaeger 等等,本文將主要介紹 Jaeger 。

Jaeger 是 Uber 技術團隊發布的開源分散式跟蹤系統,它用於監控和故障排查基於微服務的分散式系統:

  • 分散式上下文傳播、事務監控
  • 根本原因、服務依賴分析
  • 性能/延遲優化
  • OpenTracing 啟發的數據模型
  • 多個存儲後端:Cassandra, Elasticsearch, memory.
  • 系統拓撲圖
  • 服務性能監控(SPM)
  • 自適應取樣

Jaeger 架構

Component Description
Jaeger Client Jaeger Client SDK
Jaeger Agent 收集 Client 數據
Jaeger Collector 收集 Jaeger Agent 數據,有 pull/push 兩種方式
DB Storage Collector 需要存儲後端,Collector 拿到的數據將存在 Elasticsearch 或 Cassandra。
Spark jobs 用於生成拓撲圖 UI 數據
Jaeger Query Service & UI 負責從 Storage 查詢數據並提供 API 和 UI

如何在Rainbond上集成?

1.集成 OpenTelemetry Client:

v1.36 版本以前 Jaeger Client 是基於 OpenTracing API 實現的客戶端庫,Jaeger Client 結合 Jaeger Agent 一起使用,發送 span 到 Jaeger Collector。

v1.36 版本以後被棄用。使用 OpenTelemetry 替代 Jaeger Client and Jaeger Agent,詳情見 Jaeger and OpenTelemetry

OpenTelemetry 是無侵入的,只需在 Java 進程啟動時添加 javaagent,例:java -javaagent:path/to/opentelemetry-javaagent.jar -jar myapp.jar

那麼在 Rainbond 上就可以通過插件將 OpenTelemetry javaagent 下載到組件中並修改啟動命令。

2.連接到 Jaeger-Collector:

將所有安裝了 OpenTelemetry javaagent 插件的微服務組件都通過依賴連接到 Jaeger Collector

實踐步驟

實踐中將使用 Spring Cloud Pig 進行演示,Gitee://gitee.com/zhangbigqi/pig

Rainbond 部署請參閱文檔 快速安裝

1. Spring Cloud Pig 源碼部署

通過源碼部署 Spring Cloud Pig 微服務框架就不詳細介紹部署了,請參閱:

2. OpenTelemetry 插件安裝

從應用商店安裝 opentelemetry-java-agent 初始化插件,該插件的作用是下載 opentelemetry-javaagent.jar 到微服務組件內,可以在 Java 啟動項中指定。

  • 團隊視圖 -> 插件 -> 從應用商店安裝插件 -> 搜索 opentelemetry-java-agent 並安裝。

3. 部署 Jaeger

在開源應用商店中搜索 Jaeger 並安裝到指定應用中。

4. OpenTelemetry Agent 插件配置

1.開通 OpenTelemetry Agent 插件

pig-gateway 為例,在組件 -> 插件中開通 opentelemetry-java-agent 插件並更新組件生效,微服務內的其他組件均需要開通插件並更新或重啟組件生效。

2.配置環境變數

為所有微服務組件配置環境變數。

變數名 變數值 說明
OTEL_TRACES_EXPORTER jaeger 選擇 Jaeger exporter
OTEL_EXPORTER_JAEGER_ENDPOINT //127.0.0.1:14250 Jaeger Collector gRPC endpoint
OTEL_EXPORTER_JAEGER_TIMEOUT 10000 超時時間(毫秒)
OTEL_METRICS_EXPORTER none Metrics 導出器
JAVA_OPTS -javaagent:/agent/opentelemetry-javaagent.jar Java 啟動參數

可使用 應用配置組 統一配置並應用到所有組件中。

3.配置組件服務名稱

為所有微服務組件配置環境變數 OTEL_SERVICE_NAME ,配置組件的 Jaeger 服務名稱,如:OTEL_SERVICE_NAME=pig-gateway OTEL_SERVICE_NAME=pig-auth

5.建立依賴關係

將所有微服務組件添加依賴連接到 Jaeger Collector

Jaeger 部署在另外一個應用,需要進入 組件 -> 依賴 -> 添加 Jaeger Collector 依賴,就可以在當前應用的拓撲圖看到 Jaeger Collector 組件,剩下的組件都可通過拓撲圖編輯模式進行依賴連接。更新或重啟所有微服務組件使依賴關係生效。

6. Jaeger 快速使用

  1. 訪問 Spring Cloud Pig UI 進行登錄,使其產生數據。

  2. 訪問 Jaeger-Query16686 埠,打開對外服務即可訪問 Jaeger UI

  3. 在 Jaeger Search 頁面中搜索微服務 Pig-gateway 的 Traces

    • Service:選擇微服務的組件
    • Operation:選擇操作類型,例:GET POST、介面、類…..
    • Tags:根據響應頭篩選,例:http.status_code=200 error=true
    • Lookback:選擇時間
    • Max Duration:最大持續時間;Min Duration:最小持續時間。
    • Limit Results:限制返回結果數量。

  1. 找到 Pig-gateway HTTP POST 的 Traces 並包含了 pig-auth Span並進入,可看到很清晰的展示了服務之間一層一層的調用以及介面的響應時間,這樣我們就可以排查到底是哪個服務調用的慢或者調用有問題。

Jaeger 拓撲圖生成

拓撲圖默認不會生成,使用 spark-dependencies 組件生成拓撲圖數據,這是一個 Spark 作業,它從存儲中收集 span,分析服務之間的鏈接,並將它們存儲起來以供以後在 UI 中展示。請參閱 Jaeger Spark dependencies

spark-dependencies 組件佔用資源較大,不使用時可關閉,需要生成拓撲圖數據時將其啟動即可。

最後

有了 APM 系統後,使我們可以更好的分析業務性能、排查故障等。

結合 Rainbond 作為基座不管是 Spring Cloud還是 Jaeger 或其他 APM 都可以很方便、快捷的部署使用,從繁瑣的部署、配置中解放出來,讓我們更多的關注於業務層。