使用 OpenTelemetry 構建 .NET 應用可觀測性(2):OpenTelemetry 項目簡介

前世今生

OpenTracing

OpenTracing 項目啓動於 2016 年,旨在提供一套分佈式追蹤標準,以便開發人員可以更輕鬆地實現分佈式追蹤。

OpenTracing 定義了一套 Tracing 模型,以及一套 API,用於在應用程序中創建和管理這些數據模型。

下面是 OpenTracing 的三種相互關聯的核心模型:

  1. Span:表示一次調用過程,包括調用的起始和結束,以及調用過程中的一些信息,比如調用的服務名稱、調用的方法名稱、調用的參數、調用的返回值、調用的異常等。
  2. Tracer:表示一個追蹤器,用於創建和管理 Span,並將 Span 發送到追蹤系統。
  3. SpanContext:表示 Span 的上下文,包括 TraceIdSpanIdBaggage 等信息。

OpenTracing 規定了 Span 上會包含以下信息:

  • Operation Name:操作名稱,表示 Span 所代表的操作的名稱。
  • Start Time:開始時間,表示 Span 的開始時間。
  • Finish Time:結束時間,表示 Span 的結束時間。
  • Tags:標籤,表示 Span 的一些標籤信息,比如 http.methodhttp.urlhttp.status_code 等。
  • Logs:日誌,表示 Span 的一些日誌信息,比如 errorexception 等。
  • SpanContext:Span 的上下文,包括 TraceIdSpanIdBaggage 等信息。

Baggage 是 OpenTracing 中的一個概念,跨進程的 Span 之間可以通過 Baggage 傳遞一些用戶自定義的數據,比如用戶的 userIdorderId 等。

OpenTracing 還定義了 SpanContext 跨進程傳遞相關的概念:

Tracer 通過 InjectExtract 方法,將 SpanContext 信息注入到 Carrier 中,以便在跨進程的 Span 之間傳遞。

  • Inject:將 SpanContext 信息注入到 Carrier 中,以便在跨進程的 Span 之間傳遞。
  • Extract:從 Carrier 中提取 SpanContext 信息,以便在跨進程的 Span 之間傳遞。
  • Carrier:載體,表示 SpanContext 信息的載體,比如 HTTP Header、RPC Header 等。

更多完整的 OpenTracing 規範,可以參考 OpenTracing Specification https://opentracing.io/specification/

OpenTracing 還提供了一套 SDK用來實現 OpenTracing 規範,https://github.com/opentracing

這套 SDK 只包含數據模型和 API,不包含往後端追蹤系統發送數據等功能,需要進一步集成後端追蹤系統的 SDK,才能將數據發送到後端追蹤系統。

例如,如果要將 Span 發送到 Jaeger,需要進一步集成 Jaeger 的 SDK,將 Span 發送到 Jaeger。

https://github.com/jaegertracing/jaeger-client-csharp/tree/master

OpenCensus

OpenCensus 是 Google 於 2018年 組織的一個開源項目,相較於 OpenTracing 項目只支持 Tracing,OpenCensus 項目同時支持 Tracing 和 Metrics。

OpenTelemetry

OpenTelemetry 是 OpenCensus 和 OpenTracing 項目的合併,於 2019年 由 CNCF 組織的一個開源項目。除了支持 Tracing 和 Metrics,還支持 Logging。

OpenTelemetry 的 Tracing 模型很大程度上繼承了 OpenTracing 的 Tracing 模型,所以瞭解 OpenTracing 的 Tracing 模型,有助於理解 OpenTelemetry 的 Tracing 模型。

OpenTelemetry 項目介紹

OpenTelemetry 簡稱 OTel,包含三部分:

  1. OpenTelemetry Specification:OpenTelemetry 規範,定義了 OTel 的數據模型和 API,還包括標準的數據傳輸協議 OpenTelemetry Protocol,簡稱 OTLP。
  2. OpenTelemetry SDK:OpenTelemetry SDK,用於實現 OpenTelemetry 規範。
  3. OpenTelemetry Collector:一個可插拔的數據收集器,用於收集、處理、導出 OTel 的數據。

OpenTelemetry Specification

OpenTelemetry Specification 定義了跨語言的規範,所有語言的 SDK 都需要遵循這個規範。
規範包括以下幾個部分:

  1. API Specification:API 規範,規定了 OTel 的 API 應該包含哪些方法。
  2. SDK Specification:SDK 規範,規定了 OTel 的 SDK 應該應該提供哪些功能。
  3. Data Specification:數據規範,定義了 OTel 的數據模型。

詳細的規範可以參考 https://opentelemetry.io/docs/specs/otel/

Signals

OpenTelemetry Specification 定義了以下數據模型,這些模型統稱爲 Signals。

  • Tracing
  • Metrics
  • Logs
  • Baggage

上文 OpenTracing 的設計中都有這些概念,這邊不再贅述。

Context & Propagation

Context,表示一次調用過程中的上下文,用於在調用過程中傳遞一些數據,比如 Tracing、Baggage 等。

Propagators(傳播器) 利用 Context 爲每個橫切關注點(例如 Tracing 和 Baggage)注入和提取數據。

通常,Context 會通過 HTTP Header、RPC Header 等方式傳遞。Propagators 會將 Context 中的數據注入到 HTTP Header、RPC Header 等中,以便在跨進程的調用過程中傳遞。

OpenTelemetry Protocol

OpenTelemetry Protocol,簡稱 OTLP,是 OTel 定義的標準的數據傳輸協議,用於在 OTel 的 SDK 和可觀測性後端之間傳輸數據。
https://opentelemetry.io/docs/specs/otlp/

OTLP 使用 gRPC 作爲傳輸協議,各個可觀測性後端只需要實現 OTLP 的 gRPC 接口,就可以接收 OTel 的數據。

在此之前,各個可觀測性後端都有自己的數據傳輸協議,比如 Jaeger 使用的是 Jaeger Thrift Protocol,Zipkin 使用的是 Zipkin JSON V2 API 等。

OpenTelemetry SDK

OpenTelemetry SDK架構

虛線的上方是 OpenTelemetry API 的定義,下面是具體的 SDK 實現。

Tracing、Metrics、Logging 等數據收集被稱爲 Instrumentation,中文資料中通常叫做埋點。

除了 Instrumentation,還有 Sampler、Processor、Exporter 等組件。

  • Sampler:採樣器,用於決定數據的採樣規則。
  • Processor:處理器,用於處理數據,比如將數據聚合、壓縮等。
  • Exporter:導出器,用於將數據導出到可觀測性後端。通過實現不同的 Exporter,可以將數據導出到不同的後端系統,比如 Jaeger、Zipkin、Prometheus 等。當然也可以通過 OTLP 標準協議將數據導出支持 OTLP 的後端系統。

OpenTelemetry Collector

Collector 是一個獨立的進程,用於收集、處理、導出 OTel 的數據。

Collector 主要由三個組件組成:

  1. Receiver:接收器,用於接收 OTel 的數據,支持多種數據格式,比如 OTLP、Jaeger Thrift、Zipkin JSON V2 API 等。
  2. Processor:處理器,用於處理數據,比如將數據聚合、壓縮等。
  3. Exporter:導出器,用於將數據導出到可觀測性後端。

Processor 和 Exporter 功能與 OpenTelemetry SDK 中的 Processor 和 Exporter 功能類似,但是 Collector 作爲獨立的進程,可以集中處理多個應用程序的數據(如通過 OTLP 的 Receiver 進行統一的收集),而不需要在每個應用程序中都集成 Processor 和 Exporter。

Collector 也是一個可插拔的架構,可以通過配置文件的方式,配置不同的 Processor、Exporter 等組件。

下期預告

下期開始將正式開始介紹如何在 .NET 應用中使用 OpenTelemetry,並在使用過程中,進一步介紹 OpenTelemetry 的設計和實現。

歡迎關注個人技術公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章