欢迎来到Introzo百科
Introzo百科
当前位置:网站首页 > 技术 > 使用 OpenTelemetry 构建 .NET 应用程序可观测性(2):OpenTelemetry 项目简介

使用 OpenTelemetry 构建 .NET 应用程序可观测性(2):OpenTelemetry 项目简介

日期:2023-10-05 13:43

目录
  • 前世今生
    • OpenTracing
    • OpenCensus
    • OpenTelemetry
  • OpenTelemetry项目简介
    • OpenTelemetry规范
      • 信号
      • 上下文与传播
      • 开放遥测协议
    • OpenTelemetry SDK
      • OpenTelemetry SDK 架构
    • OpenTelemetry Collector
  • 下一期预览

前世今生

OpenTracing

OpenTracing项目于2016年启动,旨在提供一套分布式追踪标准,以便开发者可以更轻松地实现分布式追踪。

OpenTracing 定义了一组跟踪模型,以及一组用于在应用程序中创建和管理这些数据模型的 API。

以下是 OpenTracing 的三个相互关联的核心模型:

  1. Span:表示一个调用过程,包括调用的开始和结束,以及调用过程中的一些信息,比如调用的服务名、调用的方法名、调用的参数、返回值呼叫的情况、呼叫异常等。
  2. Tracer:表示创建和管理 Span 并将 Span 发送到跟踪系统的跟踪器。
  3. SpanContext:表示Span的上下文,包括TraceIdSpanId行李等信息。

OpenTracing 指定 Span 将包含以下信息:

  • 操作名称:操作名称,表示Span所代表的操作的名称。
  • 开始时间:开始时间,表示Span的开始时间。
  • Finish Time:结束时间,表示Span的结束时间。
  • Tags:标签,代表Span的一些标签信息,如http.methodhttp.urlhttp .status_code 等等。
  • Logs:日志,代表Span的一些日志信息,如错误异常等。
  • SpanContext:Span的上下文,包括TraceIdSpanIdBagg年龄等信息。

行李是OpenTracing中的一个概念。跨进程SpanBaggage之间可以传递一些用户自定义的数据,例如用户的 userId orderId 等.

OpenTracing 还定义了 SpanContext 与跨进程传输相关的概念:

Tracer 通过 InjectExtract 将 SpanContext 信息注入到 Carrier 方法。 ,以便跨进程在Span之间传递。

  • 注入:将 SpanContext 信息注入到 Carrier,以在Span 之间跨进程传输。
  • 提取:从Carrier提取SpanContext信息,以便在Span之间跨进程传递。
  • Carrier:载体,代表SpanContext信息的载体,如HTTP Header、RPC Header等。
  • OpenTelemetry 规范:OpenTelemetry 规范定义了 OTel 的数据模型和 API,还包括标准数据传输协议 OpenTelemetry Protocol,简称 OTLP。
  • OpenTelemetry SDK:OpenTelemetry SDK,用于实现OpenTelemetry规范。
  • OpenTelemetry Collector:可插拔数据收集器,用于收集、处理和导出 OTel 数据。
  • 开放遥测规范

    OpenTelemetry 规范定义了所有语言的 SDK 都需要遵循的跨语言规范。
    规格包括以下部分:

    1. API规范:API规范,规定了OTel的API应该包含哪些方法。
    2. SDK规范:SDK规范规定了OTel的SDK应提供哪些功能。
    3. 数据规范:数据规范,定义了OTel的数据模型。

    详细规格请参考https://www.introzo.com/docs/specs/otel/

    信号

    OpenTelemetry 规范定义了以下数据模型,统称为信号。

    • 追踪
    • 指标
    • 日志
    • 行李

    这些概念都在上面OpenTracing的设计中,这里不再赘述。

    上下文与传播

    Context 表示通话过程中的上下文,用于在通话过程中传递一些数据,如 Tracing、Baggage 等。

    传播者利用上下文为每个横切关注点(例如跟踪和行李)注入和提取数据。

    通常,Context是通过HTTP Header、RPC Header等方式传递的。Propagators会将Context中的数据注入到HTTP Header、RPC Header等中,以便在跨进程调用时进行传递。

    开放遥测协议

    OpenTelemetry Protocol,简称OTLP,是OTel定义的标准数据传输协议,用于OTel的SDK和可观测性后端之间传输数据。
    https://www.introzo.com/docs/specs/otlp/

    OTLP 使用 gRPC 作为传输协议。每个可观测后端只需要实现OTLP的gRPC接口即可接收OTel数据。

    在此之前,每个可观测性后端都有自己的数据传输协议。例如,Jaeger 使用了 Jaeger Thrift 协议,Zipkin 使用了 Zipkin JSON V2 API 等。

    OpenTelemetry SDK

    OpenTelemetry SDK 架构

    虚线上方是OpenTelemetry API的定义,下面是具体的SDK实现。

    Tracing、Metrics、Logging等数据收集称为instrumentation,在中文资料中通常称为埋点。

    除了Instrumentation之外,还有Sampler、Processor、Exporter等组件。

    • Sampler:采样器,用于确定数据的采样规则。
    • Processor:处理器,用于处理数据,如数据聚合、压缩等。
    • 导出器:用于将数据导出到可观测性后端的导出器。通过实现不同的Exporters,可以将数据导出到不同的后端系统,比如Jaeger、Zipkin、Prometheus等。当然,也可以通过OTLP标准协议将数据导出到支持OTLP的后端系统。

    打开遥测收集器

    Collector 是一个独立的进程,用于收集、处理和导出 OTel 数据。

    收集器主要由三个部件组成:

    1. Receiver:接收器,用于接收OTel数据,支持多种数据格式,如OTLP、Jaeger Thrift、Zipkin JSON V2 API等。
    2. Processor:处理器,用于处理数据,如数据聚合、压缩等。
    3. 导出器:用于将数据导出到可观测性后端的导出器。

    Processor 和 Exporter 的功能与 OpenTelemetry SDK 中的 Processor 和 Exporter 类似,但 Collector 作为一个独立的进程,可以集中处理来自多个应用程序的数据(例如通过 OTLP 的 Receiver 统一采集),而不需要 Processor和 Exporter 集成在每个应用程序中。

    Collector也是可插拔的架构,可以通过配置文件配置不同的组件如Processor、Exporter。

    下一期预览

    从下一期开始,我们将正式介绍如何在.NET应用程序中使用OpenTelemetry,并在使用过程中进一步介绍OpenTelemetry的设计和实现。

    欢迎关注个人技术公众号