第05讲:OpenTracing 简介,先有标准后有天

news2025/1/16 19:13:03

自从 Google Dapper 的论文发布之后,各大互联网公司和开源社区开发的分布式链路追踪产品百花齐放,同时也给使用者带来了一个问题,各个分布式链路追踪产品的 API 并不兼容,如果用户在各个产品之间进行切换,成本非常高。


而 OpenTracing 就完美的解决了这个问题,OpenTracing 通过提供平台无关、厂商无关的 API,帮助开发人员能够方便地添加(或更换)追踪系统。

Trace 简介

一个 Trace 代表一个事务、请求或是流程在分布式系统中的执行过程。OpenTracing 中的一条 Trace 被认为是一个由多个 Span 组成的有向无环图( DAG 图),一个 Span 代表系统中具有开始时间和执行时长的逻辑单元,Span 一般会有一个名称,一条 Trace 中 Span 是首尾连接的。



上图展示了分布式系统中一次客户端请求的全过程,虽然这种可视化图形对于查看各组件的组合关系是有用的,但是它不能很好显示组件的调用时间、先后关系、是串行还是并行等信息,如果想要展现更复杂的调用关系,该图会更加复杂。


如果将此次客户端请求的处理流程看作一条 Trace,其中每一次调用,无论是 HTTP 调用、RPC 调用、存储访问还是我们比较关注的本地方法调用,都可以成为一个 Span,通常如下图所示:



图中每个色块都是一个 Span,我们可以清晰的看到,请求在进入后端 load balancer 之后,首先会调用 authorization 服务处理,然后调用 billing 服务处理,最后执行 resource 服务,其中 container start-up 和 storage allocation 两步操作是并行执行的。

Span 简介

Span 代表系统中具有开始时间和执行时长的逻辑单元,Span 之间通过嵌套或者顺序排列建立逻辑因果关系。


每个 Span 中可以包含以下的信息:

  • 操作名称:例如访问的具体 RPC 服务,访问的 URL 地址等;

  • 起始时间

  • 结束时间

  • Span Tag:一组键值对构成的 Span 标签集合,其中键必须为字符串类型,值可以是字符串、bool 值或者数字;

  • Span Log:一组 Span 的日志集合;

  • SpanContext:Trace 的全局上下文信息;

  • References:Span 之间的引用关系,下面详细说明 Span 之间的引用关系;

在一个 Trace 中,一个 Span 可以和一个或者多个 Span 间存在因果关系。目前,OpenTracing 定义了 ChildOf 和 FollowsFrom 两种 Span 之间的引用关系。这两种引用类型代表了子节点和父节点间的直接因果关系。

  • ChildOf 关系一个 Span 可能是一个父级 Span 的孩子,即为 ChildOf 关系。下面这些情况会构成 ChildOf 关系:

    • 一个 HTTP 请求之中,被调用的服务端产生的 Span,与发起调用的客户端产生的 Span,就构成了 ChildOf 关系;

    • 一个 SQL Insert 操作的 Span,和 ORM 的 save 方法的 Span 构成 ChildOf 关系。


很明显,上述 ChildOf 关系中的父级 Span 都要等待子 Span 的返回,子 Span 的执行时间影响了其所在父级 Span 的执行时间,父级 Span 依赖子 Span 的执行结果。除了串行的任务之外,我们的逻辑中还有很多并行的任务,它们对应的 Span 也是并行的,这种情况下一个父级 Span 可以合并所有子 Span 的执行结果并等待所有并行子 Span 结束。


下图展示了上述两种 ChildOf 关系 的 Span:



  • FollowsFrom 关系在分布式系统中,一些上游系统(父节点)不以任何方式依赖下游系统(子节点)的执行结果,例如,上游系统通过消息队列向下游系统发送消息。这种情况下,下游系统对应的子 Span 和上游系统对应的父级 Span 之间是 FollowsFrom 关系。下图展示了一些可能的 FollowsFrom 关系:



下面的示例 Trace 是由 8 个 Span 组成,其中 Span A 和 Span C 之间是 ChildOf 关系,Span F 和 Span G 之间是 FollowsFrom 关系:


Logs 简介

每个 Span 可以进行多次 Logs 操作,每一次 Logs 操作,都需要带一个时间戳,以及一个可选的附加信息。在前文搭建的环境中,请求 http://localhost:8000/err 得到的 Trace 中就会通过 Logs 记录异常堆栈信息,如下图所示,其中不仅包括异常的堆栈信息,还包括了一些说明性的键值对信息:


Tags 简介

每个 Span 可以有多个键值对形式的 Tags,Tags 是没有时间戳的,只是为 Span 添加一些简单解释和补充信息。下图展示了前文示例中 Tags 的信息:


SpanContext 和 Baggage

SpanContext 表示进程边界,在跨进调用时需要将一些全局信息,例如,TraceId、当前 SpanId 等信息封装到 Baggage 中传递到另一个进程(下游系统)中。


Baggage 是存储在 SpanContext 中的一个键值对集合。它会在一条 Trace 中全局传输,该 Trace 中的所有 Span 都可以获取到其中的信息。


需要注意的是,由于 Baggage 需要跨进程全局传输,就会涉及相关数据的序列化和反序列化操作,如果在 Baggage 中存放过多的数据,就会导致序列化和反序列化操作耗时变长,使整个系统的 RPC 的延迟增加、吞吐量下降。


虽然 Baggage 与 Span Tags 一样,都是键值对集合,但两者最大区别在于 Span Tags 中的信息不会跨进程传输,而 Baggage 需要全局传输。因此,OpenTracing 要求实现提供 Inject 和 Extract 两种操作,SpanContext 可以通过 Inject 操作向 Baggage 中添加键值对数据,通过 Extract 从 Baggage 中获取键值对数据。

核心接口语义

OpenTracing 希望各个实现平台能够根据上述的核心概念来建模实现,不仅如此,OpenTracing 还提供了核心接口的描述,帮助开发人员更好的实现 OpenTracing 规范。

  • Span 接口

Span接口必须实现以下的功能:

    • 获取关联的 SpanContext:通过 Span 获取关联的 SpanContext 对象。

    • 关闭(Finish)Span:完成已经开始的 Span。

    • 添加 Span Tag:为 Span 添加 Tag 键值对。

    • 添加 Log:为 Span 增加一个 Log 事件。

    • 添加 Baggage Item:向 Baggage 中添加一组键值对。

    • 获取 Baggage Item:根据 Key 获取 Baggage 中的元素。

  • SpanContext 接口

SpanContext 接口必须实现以下功能,用户可以通过 Span 实例或者 Tracer 的 Extract 能力获取 SpanContext 接口实例。

    • 遍历 Baggage 中全部的 KV

  • Tracer 接口

Tracer 接口必须实现以下功能:

  • 创建 Span:创建新的 Span。

  • 注入 SpanContext:主要是将跨进程调用携带的 Baggage 数据记录到当前 SpanContext 中。

  • 提取 SpanContext ,主要是将当前 SpanContext 中的全局信息提取出来,封装成 Baggage 用于后续的跨进程调用。

总结

本课时主要介绍了 Trace、Span、Logs、Tags、SpanContext 等 OpenTracing 规范的核心概念,还介绍了 OpenTracing 规范定义的核心接口的功能。SkyWalking 作为 OpenTracing 的实现之一,了解 OpenTracing 的核心概念可以更好的帮助理解 SkyWalking 的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Sprinboot聚合项目归夷

1、前言 在创建springboot项目时,都会有一个Main方法。如果将Springboot项目设计成聚合项目时,我们是不是要把所有的子项目都按照Springboot的方式创建呢?如果是会出现什么问题,以及我们怎么解决呢? 如果我们使用maven…

在线画图网站Graph Editor的使用

网站链接 链接 网站介绍 CS Academy是一个在线的算法学习和竞赛的网站,打开网站左侧导航栏中的App目录下有一个可以在线画图的应用Graph Editor,用来画图(有向、无向)非常好用。 网站使用 网站的界面如下: 左侧为…

Golang每日一练(leetDay0037) 二叉树专题(6)

目录 109. 有序链表转换二叉搜索树 Convert-sorted-list-to-binary-search-tree 🌟🌟 110. 平衡二叉树 Balanced Binary Tree 🌟 111. 二叉树的最小深度 Minimum Depth of Binary Tree 🌟 🌟 每日一练刷题专栏 …

代码随想录算法训练营第五十七天 | 647. 回文子串、516.最长回文子序列

打卡第57天。 今日任务 ● 647. 回文子串 ● 516.最长回文子序列 647. 回文子串 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开…

【云原生进阶之容器】第六章容器网络6.6.1--Cilium网络方案概述

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述

从入门到精通:带你掌握Python Requests库的全部技能

目录 引言 安装 启动用户管理项目 requests响应 Session请求 为什么Session类可以保持会话 封装requests 引言 Python Requests库是Python语言中最为流行的HTTP客户端库之一。它提供了简单易用的API,让发送HTTP/1.1请求变得异常容易,支持常见的H…

TiDB实战篇-数据导出工具Dumpling

简介 简要使用数据导出工具。 介绍 特点 适用场景 部署 下载 TiDB 社区版 | PingCAP 安装 #解压下载好的安装包 tar -zxvf tidb-community-toolkit-v6.5.0-linux-amd64.tar.gz #进入到文件夹以后解压出dumpling cd tidb-community-toolkit-v6.5.0-linux-amd64 tar -zxvf d…

MySQL中的索引index(超详细)

概念: 在MySQL中,索引(index)是一种特殊的数据结构,它能够加快数据库中数据的检索速度。索引可以看做是一本书的目录,它提供了一种快速查找数据的方式。 MySQL中的索引是建立在一张表的一列或多列上的&…

开发者社区项目开发流程

项目流程: 项目创建 首先创建一个文件夹,然后找到要创建项目的文件夹 输入CMD 进入小黑窗 输入“vue create 项目名” 创建我们这个项目(其中细节Ctrl左键点击链接见个人博客(99条消息) 创建Vue项目流程_啊唯11的博客-CSDN博客) 2.删除项认文件&#x…

C++命名空间域namespace与域作用限制符: :,cin,cout输入输出简单介绍

TIPS C是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等C总计63个关键字,C语言32个关键字,具体没有必要先不去管它 域,命名空间域与namespace关键字 cpp需要解决的第一…

Java后端面试题 重难点和被问到没答上来的点(包括java基础、关系型数据库、Redis、计算机网络、Spring、Java多线程、vue等)

以下是我记录的一些重点问题和面试中被问到没答上来的问题,包括java基础、关系型数据库、Redis、计算机网络、Spring、Java多线程、vue 问题目录 1.fail-safe和fail-fast2.四引用3.explain字段重要内容4.maven三大生命周期5.MYSQL 创建修改表6.数据库三范式7.Strin…

华科超算用户手册的学习笔记

1. 资源计费 1.1 费用记账 日期费用(上限3000元)2023.04.171002023.04.18200总计300 1.2 创建实例时显示项目的余额不足 这是因为项目账户之中目前还没有足够的卡时; Note 这里是因为上次充值的卡时还在田老师的个人账户中,还需…

vue el-table 单机行选中高亮并获取行数据,再次单击取消行选中

1. 效果展示 当没有行被选中时,按钮是不可用的 当有行被选中时,该行高亮,同时按钮可用 再次点击该行,取消高亮,按钮不可用 2. 代码 2.1 组件代码 table设置了highlight-current-row,可以在选中某个数据行…

List集合和Set集合的区别

Collection集合总结 在进行Java开发的时候经常会用到集合,而集合又主要分为两种:Collection单列集合和Map集合。这里主要介绍一下Collection的一些常用子接口的区别。 Collection集合😮 指单列集合,存储的一组对象。 List&#x…

4大方法,教你如何做好项目管理

作为一个项目经理,项目管理是我们日常工作最核心的一项职能。无论是公司的业务开发还是重大项目的推进,都离不开项目管理。然而对于很多初入职场的人来说,项目管理还是一个相当新颖、陌生的领域,因此我今天就来分享一些我在项目管…

【安全与风险】密码安全和用户认证

密码安全和用户认证 基本问题证明你是谁为什么要验证还需要什么基于口令的身份认证常用使用模式常用使用模式可惜的是社会工程悉尼大学 (绿化96)尴尬和记忆关于密码使用的3个主要问题UNIX形式的密码密码散列字典式攻击影子密码其他密码问题生物计量学多模式生物识别系统定义为什…

数字化体验时代,企业如何做好内部知识数字化管理

随着数字化时代的到来,企业内部的知识管理也面临着新的挑战和机遇。数字化技术的应用,可以极大地提高企业内部知识的数字化管理效率和质量,从而提升企业内部的工作效率、员工满意度和企业竞争力。本文将从数字化时代的背景出发,探…

NVM安装nodejs的方法

前提: 为解决nodejs升级后出现的各种问题,使用NVM在一台电脑上安装多个版本的nodejs,以便项目可以根据自身使用的node版本来开发。 nodejs版本的查询地址: https://nodejs.org/zh-cn/download/releases/ nodejs下载官网地址&…

17.样式冲突

写在 .vue 组件中的样式会全局生效,比如我现在有一个LEFT组件 有一个RIGHT组件 将LEFT组件与RIGHT组件放在App组件中 发现我只给LEFT样式,但是在RIGHT中也生效了 为了避免这种情况,我们有下面几种解决方式 目录 1 具体到指定的标签 2 sc…

【微信小程序-原生开发】实用教程22 - 绘制图表(引入 echarts,含图表的懒加载-获取到数据后再渲染图表,多图表加载等技巧)

最终效果预览 实现流程 微信小程序中使用 echarts 需使用官方提供的 ec-canvas 组件 1. 下载 ec-canvas 组件 点击下方链接,下载 ec-canvas 组件 https://gitcode.net/mirrors/ecomfe/echarts-for-weixin/-/tree/master 将其中的 ec-canvas 文件夹拷贝到微信小程序…