前世今生

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 的设计和实现。

使用 OpenTelemetry 构建 .NET 应用可观测性(2):OpenTelemetry 项目简介的更多相关文章

  1. 我发起了一个 用 物理服务器 和 .Net 平台 构建云平台 的 .Net 开源项目

    大家好 , 我发起了一个 用 物理服务器 和 .Net 平台 构建云平台 的 .Net 开源项目 . 对 , 用 物理服务器 和 .Net 平台 构建 云平台 . 通过 .Net 构建 分布式 计算集 ...

  2. 构建一个简单的Spring Boot项目

    11 构建一个简单的Spring Boot项目 这个章节描述如何通过Spring Boot构建一个"Hello Word"web应用,侧重介绍Spring Boot的一些重要功能. ...

  3. OpenTelemetry - 云原生下可观测性的新标准

    CNCF 简介 CNCF(Cloud Native Computing Foundation),中文为"云原生计算基金会",CNCF是Linux基金会旗下的基金会,可以理解为一个非 ...

  4. 项目构建之maven篇:2.HelloWorld项目构建过程

    文件结构说明: 项目构建生命周期: 清理 编译 測试 打包 执行 部署 清理与编译 hello\pom.xml POM:Project Object Model,项目对象模型 pom.xml与ant的 ...

  5. 从零开始构建一个的asp.net Core 项目

    最近突发奇想,想从零开始构建一个Core的MVC项目,于是开始了构建过程. 首先我们添加一个空的CORE下的MVC项目,创建完成之后我们运行一下(Ctrl +F5).我们会在页面上看到"He ...

  6. 从零开始构建一个的asp.net Core 项目(二)

    接着上一篇博客继续进行.上一篇博客只是显示了简单的MVC视图页,这篇博客接着进行,连接上数据库,进行简单的CRUD. 首先我在Controllers文件夹点击右键,添加->控制器 弹出的对话框中 ...

  7. 构建基础的SpringMVC+Hibernate+SpringloC项目

    一. SpringMVC 阅读我的上一篇文章<使用MyEclipse2015构建SpringMVC项目>,知道基本的构建方法,先构建一个纯springmvc项目,再对web.xml按照本文 ...

  8. 构建一个 预装 pm2 的 node 项目 docker 底包

    Dockerfile: 创建 dockerfile 文件, 命名为 dockerfile-yourProject-node.8.12.0-pm2 # MAGE: yourGroup/yourProje ...

  9. 利用travis自动化构建与部署(文档项目)

    背景 保持网站上文档的最新性有比较重要的意义, travis ci 提供了免费的解决方案,本文基于 latex 构建+ aliyun oss 部署对此作了尝试. 项目链接为 https://travi ...

  10. 004-restful应用构建、分布式会话、测试工具简介

    一.概述 什么是rest(表述性状态转移,Representational State Transfer)是一种架构风格.他定义了创建可扩展Web服务的最佳实践. 1.Richardson成熟度模型 ...

随机推荐

  1. es 笔记二之基础查询

    本文首发于公众号:Hunter后端 原文链接:es笔记二之基础查询 这一篇笔记介绍 es 的基础查询. 基础查询包括很多,比如排序,类似数据库 limit 的操作,like 操作,与或非等,对于这些操 ...

  2. 理论+实操,带你了解多沙箱容器运行时Kuasar

    摘要:华为云DTSE技术布道师张天阳结合沙箱容器发展历程,介绍华为云多沙箱容器运行时 Kuasar 项目优势,开启多沙箱容器运行时上手实践体验. 本文分享自华为云社区<理论+实操,带你了解多沙箱 ...

  3. linux 的 vi 命令详解

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...

  4. 如何在.net6webapi中配置Jwt实现鉴权验证

    JWT(Json Web Token) jwt是一种用于身份验证的开放标准,他可以在网络之间传递信息,jwt由三部分组成:头部,载荷,签名.头部包含了令牌的类型和加密算法,载荷包含了用户的信息,签名则 ...

  5. Java(类与对象、封装)

    面向过程.面向对象 面向对象编程(Object-Oriented Programming, OOP) 本质:以类的方式组织代码,以对象的组织(封装)数据. 抽象 三大特性 封装 继承 多态 从认识论的 ...

  6. shell工具和脚本

    Shell脚本 shell 脚本是一种更加复杂度的工具. 大多数shell都有自己的一套脚本语言,包括变量.控制流和自己的语法.shell脚本 与其他脚本语言不同之处在于,shell 脚本针对 she ...

  7. 创建springboot工程失败解决 spring initializr Error:cannot download

    创建springboot工程失败解决 问题描述 原因分析: 网络不好,因为springBooT项目的创建时必须联网的 解决方案: 方案一: 将创建 springBoot 工程的地址更换为如下的地址 阿 ...

  8. 前端 vue 自定义导航栏组件高度及返回箭头 自定义 tabbar 图标

    前端vue自定义导航栏组件高度及返回箭头 自定义tabbar图标, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12986 效 ...

  9. GPT3的技术突破:实现更准确、更真实的语言生成

    目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 6. 结论与展望 7. 附录:常见问题与解答 GPT-3 技术突破:实现更准确.更真实的语 ...

  10. 解决Springboot项目打成jar包后获取resources目录下的文件失败的问题

    前几天在项目读取resources目录下的文件时碰到一个小坑,明明在本地是可以正常运行的,但是一发到测试环境就报错了,说找不到文件,报错信息是:class path resource [xxxx] c ...