魏华兰 發表於 2023-9-4 22:12:00

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

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>前世今生<ul><li>OpenTracing</li><li>OpenCensus</li><li>OpenTelemetry</li></ul></li><li>OpenTelemetry 项目介绍<ul><li>OpenTelemetry Specification<ul><li>Signals</li><li>Context &amp; Propagation</li><li>OpenTelemetry Protocol</li></ul></li><li>OpenTelemetry SDK<ul><li>OpenTelemetry SDK架构</li></ul></li><li>OpenTelemetry Collector</li></ul></li><li>下期预告</li></ul></div><p></p>
<h1 id="前世今生">前世今生</h1>
<h2 id="opentracing">OpenTracing</h2>
<p>OpenTracing 项目启动于 2016 年,旨在提供一套分布式追踪标准,以便开发人员可以更轻松地实现分布式追踪。</p>
<p>OpenTracing 定义了一套 Tracing 模型,以及一套 API,用于在应用程序中创建和管理这些数据模型。</p>
<p>下面是 OpenTracing 的三种相互关联的核心模型:</p>
<ol>
<li><code>Span</code>:表示一次调用过程,包括调用的起始和结束,以及调用过程中的一些信息,比如调用的服务名称、调用的方法名称、调用的参数、调用的返回值、调用的异常等。</li>
<li><code>Tracer</code>:表示一个追踪器,用于创建和管理 <code>Span</code>,并将 <code>Span</code> 发送到追踪系统。</li>
<li><code>SpanContext</code>:表示 <code>Span</code> 的上下文,包括 <code>TraceId</code>、<code>SpanId</code>、<code>Baggage</code> 等信息。</li>
</ol>
<p>OpenTracing 规定了 <code>Span</code> 上会包含以下信息:</p>
<ul>
<li>Operation Name:操作名称,表示 <code>Span</code> 所代表的操作的名称。</li>
<li>Start Time:开始时间,表示 <code>Span</code> 的开始时间。</li>
<li>Finish Time:结束时间,表示 <code>Span</code> 的结束时间。</li>
<li>Tags:标签,表示 <code>Span</code> 的一些标签信息,比如 <code>http.method</code>、<code>http.url</code>、<code>http.status_code</code> 等。</li>
<li>Logs:日志,表示 <code>Span</code> 的一些日志信息,比如 <code>error</code>、<code>exception</code> 等。</li>
<li>SpanContext:<code>Span</code> 的上下文,包括 <code>TraceId</code>、<code>SpanId</code>、<code>Baggage</code> 等信息。</li>
</ul>
<p><code>Baggage</code> 是 OpenTracing 中的一个概念,跨进程的 <code>Span</code> 之间可以通过 <code>Baggage</code> 传递一些用户自定义的数据,比如用户的 <code>userId</code>、<code>orderId</code> 等。</p>
<p>OpenTracing 还定义了 <code>SpanContext</code> 跨进程传递相关的概念:</p>
<p>Tracer 通过 <code>Inject</code> 和 <code>Extract</code> 方法,将 <code>SpanContext</code> 信息注入到 <code>Carrier</code> 中,以便在跨进程的 <code>Span</code> 之间传递。</p>
<ul>
<li>Inject:将 <code>SpanContext</code> 信息注入到 <code>Carrier</code> 中,以便在跨进程的 <code>Span</code> 之间传递。</li>
<li>Extract:从 <code>Carrier</code> 中提取 <code>SpanContext</code> 信息,以便在跨进程的 <code>Span</code> 之间传递。</li>
<li>Carrier:载体,表示 <code>SpanContext</code> 信息的载体,比如 HTTP Header、RPC Header 等。</li>
</ul>
<p>更多完整的 OpenTracing 规范,可以参考 OpenTracing Specification https://opentracing.io/specification/ 。</p>
<p>OpenTracing 还提供了一套 SDK用来实现 OpenTracing 规范,https://github.com/opentracing 。</p>
<p>这套 SDK 只包含数据模型和 API,不包含往后端追踪系统发送数据等功能,需要进一步集成后端追踪系统的 SDK,才能将数据发送到后端追踪系统。</p>
<p>例如,如果要将 <code>Span</code> 发送到 Jaeger,需要进一步集成 Jaeger 的 SDK,将 <code>Span</code> 发送到 Jaeger。</p>
<p>https://github.com/jaegertracing/jaeger-client-csharp/tree/master</p>
<h2 id="opencensus">OpenCensus</h2>
<p>OpenCensus 是 Google 于 2018年 组织的一个开源项目,相较于 OpenTracing 项目只支持 Tracing,OpenCensus 项目同时支持 Tracing 和 Metrics。</p>
<h2 id="opentelemetry">OpenTelemetry</h2>
<p>OpenTelemetry 是 OpenCensus 和 OpenTracing 项目的合并,于 2019年 由 CNCF 组织的一个开源项目。除了支持 Tracing 和 Metrics,还支持 Logging。</p>
<p>OpenTelemetry 的 Tracing 模型很大程度上继承了 OpenTracing 的 Tracing 模型,所以了解 OpenTracing 的 Tracing 模型,有助于理解 OpenTelemetry 的 Tracing 模型。</p>
<h1 id="opentelemetry-项目介绍">OpenTelemetry 项目介绍</h1>
<p>OpenTelemetry 简称 OTel,包含三部分:</p>
<ol>
<li>OpenTelemetry Specification:OpenTelemetry 规范,定义了 OTel 的数据模型和 API,还包括标准的数据传输协议 OpenTelemetry Protocol,简称 OTLP。</li>
<li>OpenTelemetry SDK:OpenTelemetry SDK,用于实现 OpenTelemetry 规范。</li>
<li>OpenTelemetry Collector:一个可插拔的数据收集器,用于收集、处理、导出 OTel 的数据。</li>
</ol>
<h2 id="opentelemetry-specification">OpenTelemetry Specification</h2>
<p>OpenTelemetry Specification 定义了跨语言的规范,所有语言的 SDK 都需要遵循这个规范。<br>
规范包括以下几个部分:</p>
<ol>
<li>API Specification:API 规范,规定了 OTel 的 API 应该包含哪些方法。</li>
<li>SDK Specification:SDK 规范,规定了 OTel 的 SDK 应该应该提供哪些功能。</li>
<li>Data Specification:数据规范,定义了 OTel 的数据模型。</li>
</ol>
<p>详细的规范可以参考 https://opentelemetry.io/docs/specs/otel/</p>
<h3 id="signals">Signals</h3>
<p>OpenTelemetry Specification 定义了以下数据模型,这些模型统称为 Signals。</p>
<ul>
<li>Tracing</li>
<li>Metrics</li>
<li>Logs</li>
<li>Baggage</li>
</ul>
<p>上文 OpenTracing 的设计中都有这些概念,这边不再赘述。</p>
<h3 id="context--propagation">Context &amp; Propagation</h3>
<p>Context,表示一次调用过程中的上下文,用于在调用过程中传递一些数据,比如 Tracing、Baggage 等。</p>
<p>Propagators(传播器) 利用 Context 为每个横切关注点(例如 Tracing 和 Baggage)注入和提取数据。</p>
<p><img src="https://img2023.cnblogs.com/blog/1201123/202309/1201123-20230904220741132-727330852.png" alt="" loading="lazy"></p>
<p>通常,Context 会通过 HTTP Header、RPC Header 等方式传递。Propagators 会将 Context 中的数据注入到 HTTP Header、RPC Header 等中,以便在跨进程的调用过程中传递。</p>
<p><img src="https://img2023.cnblogs.com/blog/1201123/202309/1201123-20230904220740735-1052873871.png" alt="" loading="lazy"></p>
<h3 id="opentelemetry-protocol">OpenTelemetry Protocol</h3>
<p>OpenTelemetry Protocol,简称 OTLP,是 OTel 定义的标准的数据传输协议,用于在 OTel 的 SDK 和可观测性后端之间传输数据。<br>
https://opentelemetry.io/docs/specs/otlp/</p>
<p>OTLP 使用 gRPC 作为传输协议,各个可观测性后端只需要实现 OTLP 的 gRPC 接口,就可以接收 OTel 的数据。</p>
<p>在此之前,各个可观测性后端都有自己的数据传输协议,比如 Jaeger 使用的是 Jaeger Thrift Protocol,Zipkin 使用的是 Zipkin JSON V2 API 等。</p>
<h2 id="opentelemetry-sdk">OpenTelemetry SDK</h2>
<h3 id="opentelemetry-sdk架构">OpenTelemetry SDK架构</h3>
<p><img src="https://img2023.cnblogs.com/blog/1201123/202309/1201123-20230904220740269-1334836818.png" alt="" loading="lazy"></p>
<p>虚线的上方是 OpenTelemetry API 的定义,下面是具体的 SDK 实现。</p>
<p>Tracing、Metrics、Logging 等数据收集被称为 Instrumentation,中文资料中通常叫做埋点。</p>
<p>除了 Instrumentation,还有 Sampler、Processor、Exporter 等组件。</p>
<ul>
<li>Sampler:采样器,用于决定数据的采样规则。</li>
<li>Processor:处理器,用于处理数据,比如将数据聚合、压缩等。</li>
<li>Exporter:导出器,用于将数据导出到可观测性后端。通过实现不同的 Exporter,可以将数据导出到不同的后端系统,比如 Jaeger、Zipkin、Prometheus 等。当然也可以通过 OTLP 标准协议将数据导出支持 OTLP 的后端系统。</li>
</ul>
<h2 id="opentelemetry-collector">OpenTelemetry Collector</h2>
<p>Collector 是一个独立的进程,用于收集、处理、导出 OTel 的数据。</p>
<p><img src="https://img2023.cnblogs.com/blog/1201123/202309/1201123-20230904220739627-799635817.png" alt="" loading="lazy"></p>
<p>Collector 主要由三个组件组成:</p>
<ol>
<li>Receiver:接收器,用于接收 OTel 的数据,支持多种数据格式,比如 OTLP、Jaeger Thrift、Zipkin JSON V2 API 等。</li>
<li>Processor:处理器,用于处理数据,比如将数据聚合、压缩等。</li>
<li>Exporter:导出器,用于将数据导出到可观测性后端。</li>
</ol>
<p>Processor 和 Exporter 功能与 OpenTelemetry SDK 中的 Processor 和 Exporter 功能类似,但是 Collector 作为独立的进程,可以集中处理多个应用程序的数据(如通过 OTLP 的 Receiver 进行统一的收集),而不需要在每个应用程序中都集成 Processor 和 Exporter。</p>
<p>Collector 也是一个可插拔的架构,可以通过配置文件的方式,配置不同的 Processor、Exporter 等组件。</p>
<h1 id="下期预告">下期预告</h1>
<p>下期开始将正式开始介绍如何在 .NET 应用中使用 OpenTelemetry,并在使用过程中,进一步介绍 OpenTelemetry 的设计和实现。</p>
<p>欢迎关注个人技术公众号<br>
<img src="https://img2023.cnblogs.com/blog/1201123/202303/1201123-20230302194546214-138980196.png" alt="" loading="lazy"></p><br><br>
来源:https://www.cnblogs.com/eventhorizon/p/17678251.html
頁: [1]
查看完整版本: 使用 OpenTelemetry 构建 .NET 应用可观测性(2):OpenTelemetry 项目简介