OpenTelemetry 在服務網格架構下的最佳實踐

語言: CN / TW / HK

【百度雲原生導讀】OpenTelemetry 由著名的 OpenTracing、 OpenCensus 兩個產品在 2019 年合併而來,擁有廣泛的應用場景和強大的開發團隊。2021年,OpenTelemetry 的使用成為新的行業規範,通過在各個資料來源之間建立一致性,使得資料收集以及處理更加便捷。那麼,如何在服務網格架構中引入 OpenTelemetry 進而獲取可觀測 trace 能力,實踐過程中會遇到哪些問題?本文對相關問題做了總結並給出瞭解法,最後通過一個 Demo 手把手教你在 Istio 中安裝 OpenTelemetry。

 

1. OpenTelemetry 介紹

OpenTelemetry(簡稱 OTel)是一系列的工具、APIs 和 SDKs。使用 OpenTelemetry 可以產生、收集、輸出一系列遙測資料(telemetry data 如 trace、metrics 和 log)幫助使用者分析應用程式的效能和行為。

OpenTelemetry 是廠商無關的,並且作為工業級別標準被大量的廠商支援。另外,OpenCensus(Google)和  OpenTracing(Uber)是其前身。

其架構如下所示:

 

主要包含了以下幾個部分:

  • Instrumentation:包含自動方式API 、SDK 方式接入 OpenTelemetry。

  • OTLP:  OpenTelemetry 定義的傳輸協議。

  • OpenTelemetry Collector:提供廠商無關的解決方案,用於實現 資料的接收(receive), 處理(process)和 輸出(export)的功能。

 

2. OpenTelemetry 在 Service Mesh 架構下的實踐

目前 Istio 實現可觀測 trace 方案 可以總結為:

  1. 需要業務透傳對應的 header 資訊(從入向請求中獲取對應的 header 資訊、並在出向請求中新增響應 header 資訊)。

  2. Sidecar 自動向監控系統傳送Span資訊。

 

通過對 Istio 方案可觀測 trace 的分析,可以發現幾個問題:

  1. 對業務程式碼是有侵入的 Trace 上下文傳播(Trace Context propagation),需要業務透傳相應的 header 資訊。

  2. 所有的 Span 資料都由 Sidecar 側生成,業務內部方法級別監控資訊無法採集。

 

在業界 APM 的技術方案中,JavaAgent(一種位元組碼技術,對業務無侵入)作為主流的技術方案。同樣 OpenTelemetry auto-instrumentation 通過 Java Agent 提供的動態注入位元組碼的技術實現任意 Java 應用遙測資料的採集,其支援了非常多的廣為流行的庫和框架。

2.1 無侵入式Trace上下文傳播

 

對於Java應用程式,OpenTelemetry JavaAgent支援的 Trace context propagation 如下:

  • "tracecontext": W3C Trace Context (add baggage as well to include W3C baggage)

  • "baggage": W3C Baggage

  • "b3": B3 Single

  • "b3multi": B3 Multi

  • "jaeger": Jaeger (includes Jaeger baggage)

  • "xray": AWS X-Ray

  • "ottrace": OT Trace

 

上述 b3multi/b3(以x-b3開頭)恰好是 Istio 中要求透傳的 header 資訊。

2.2 業務內部方法級別監控

 

目前 OpenTelemetry JavaAgent 已經支援大量的庫、框架以及應用伺服器,能夠採集業務內部方法級別執行邏輯。

 

2.3 trace資訊與業務日誌關聯

 

通常在業務排查問題中,不僅僅要檢視對應的 trace 鏈路資訊,同時也要基於對應的 trace_id、span_id 檢視對應的業務日誌資訊。

OpenTelemetry Java Agent 已經預置了很多關於當前 span 的資訊在 log 的 MDC(Mapped Diagnostic Context)中,業務可以方便配置這些資訊,業務可以方便在業務日誌中列印對應的 trace_id、span_id 資訊。如下為SpringBoot 中使用 logback 的配置示例:

  •  
logging.pattern.level = trace_id=%mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{trace_flags} %5p

 

2.4 系統架構

 

 

  • JavaAgent 將採集的資料傳送至 OpenTelemetry Collector 。

  • Sidecar 將生成的 trace span 資訊傳送至 OpenTelemetry Collector。

  • OpenTelemetry Collector 將資料輸出至監控系統如 jaeger 或 Kafka 中。

  • 使用者可以通過對應的 UI 檢視 trace 資料。

 

2.5 實踐

本文主要用於演示,均無高可用部署。

2.5.1 安裝istio

下載 istio 安裝包(本文以1.13.2 為例):https://github.com/istio/istio/releases

  •  
$ istioctl install -f istio-opentelemtry-iop.yaml

istio-opentelemetry-iop.yaml的內容如下所示:

apiVersion: install.istio.io/v1alpha1kind: IstioOperatorspec:  meshConfig:    defaultConfig:      holdApplicationUntilProxyStarts: true
tracing:        sampling: 100    enablePrometheusMerge: false    # 定義擴充套件的providers    extensionProviders:    - name: otel-trace      zipkin:        service: otel-collector.istio-system.svc.cluster.local        port: 9411        maxTagLength: 56

  components:    ingressGateways:    - name: istio-ingressgateway      enabled: true

特別說明:上述extensionProviders 屬性中定義了otel-trace,其資訊為opentelemetry Collector 的地址(其本身可以接收 zipkin 格式的trace,因此此處定義的是zipkin的資訊)

2.5.2 安裝OpenTelemetry Collector

按照https://github.com/open-telemetry/opentelemetry-operator 安裝 OpenTelemetry Collector。假設安裝的 K8S Service 為:otel-collector.istio-system.svc.cluster.local:9411,9411為接收 zipkin 資料格式的埠。

opentelemetry-collector-config.yaml的內容如下所示:

 

# collector的receivers配置receivers:  otlp:    protocols:      grpc:      http:  zipkin:processors:  batch:  memory_limiter:# collector的exporters配置,exporters:  zipkin:    endpoint: "http://zipkin.istio-system.svc.cluster.local:9411/api/v2/spans"service:  pipelines:    traces:      # 對於trace資料,開啟otlp、zipkin協議埠提供服務      receivers: [otlp, zipkin]      processors: [memory_limiter, batch]      # 對於trace資料,最後輸出至zipkin中      exporters: [zipkin]

2.5.3 安裝 jaeger

  •  
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.14/samples/addons/jaeger.yaml

由於 collector exporters 輸出的 trace 資料格式為 zipkin,jaege 相容 zipkin 格式 trace 資料,因此最終 trace 資料可通過 jaeger 展示。

2.5.4 提交Telemetry CRD

提交 Telemetry CRD,將 envoy 對接的 trace 的資訊變更為 otel-trace,即為 Opentelemetry Collector。

  •  
$ kubectl apply -f mesh-trace-telemetry.yaml

mesh-trace-telemetry.yaml的內容如下所示:

apiVersion: telemetry.istio.io/v1alpha1kind: Telemetrymetadata:  name: mesh-trace-telemtry  namespace: istio-systemspec:  tracing:  - providers:    - name: otel-trace    randomSamplingPercentage: 100

2.5.5 部署Mesh應用

為對應的名稱空間 default 開啟自動 Sidecar 注入功能:

  •  
$ kubectl label namespace default istio-injection=enabled --overwrite

按照K8S的方式部署微服務應用 consumer-demo 和 provider-demo。應用程式說明:

  • consumer-demo:服務消費方,向外提供 HTTP 介面,該介面會呼叫服務提供方 provider-demo 提供的 HTTP 介面,呼叫 provider-dem 的呼叫形式包括 RestTemplate 和 Fegin。

  • provider-demo:服務提供方,提供 HTTP 介面。

 

應用程式啟動需要加上對應的引數,如下所示:

# 啟動時要指定javaagent# -Dotel.resource.attributes=service.name=provider-demo  在span中的service資訊# -Dotel.propagators=b3multi 透傳b3multi headerjava -javaagent:/opentelemetry-javaagent.jar -Dotel.resource.attributes=service.name=provider-demo -Dotel.propagators=b3multi -jar provider-demo-1.0-SNAPSHOT.jar

部署時需要在容器的環境中新增對應的配置:

  •  
env:  - name: OTEL_TRACES_EXPORTER   # javaagent輸出otlp協議型別資料    value: otlp  - name: OTEL_EXPORTER_OTLP_ENDPOINT   # collector地址    value: http://otel-collector.istio-system.svc.cluster.local:4317  - name: OTEL_JAVAAGENT_ENABLED     # 開啟javaagent功能    value: 'true'

2.5.6 觀察Mesh監控資料

如下圖為本文consumer-demo和provider-demo在業務訪問中產生的監控資料(以監控系統Jaeger為例):

 

3.總結

 

通過在 Service Mesh 架構中引入 OpenTelemetry,可以總結帶來的業務收益如下:

  1. 通過 OpenTelemtry auto-instrumentation 機制可實現無侵入式 Trace 上下文傳播,使得業務無感接入 Service Mesh 可觀測性。

  2. 通過 OpenTelemtry auto-instrumentation 機制可實現業務內部方法級別的監控資料採集,彌補 Service Mesh 只能在 Sidecar 側採集監控資料的缺陷。

  3. 通過 OpenTelemetry Logger MDC auto-instrumentation 機制能夠將監控資訊對應的 trace_id、span_id 等資訊配置輸出在業務日誌中,方便業務排查問題。

 

為服務更多客戶,百度智慧雲現已推出服務網格產品CSM(Cloud Service Mesh),為使用者提供高可靠、免運維、開放的雲原生微服務治理產品,火熱公測中,歡迎對服務網格感興趣的開發者與我們一起探討實踐。

 

更多產品介紹與使用請點選閱讀原文或直接訪問以下連結:

https://cloud.baidu.com/product/csm.html

 

 

----------  END  ----------

 

重磅!雲原生計算交流群成立

掃碼新增小助手即可申請加入,一定要備註:名字 - 公司 / 學校 - 地區,根據格式備註,才能通過且邀請進群。

瞭解更多微服務、雲原生技術的相關資訊,請關注我們的微信公眾號【百度雲原生】