Part 1 - 为什么需要 Tracing

当前微服务架构和分布式系统变得越来越流行,系统庞大且服务数量繁杂多样,甚至数据库也开始使用分布式架构。当一个生产系统面对真正的高并发,或者解耦成大量微服务时,以前很容易实现的重点任务变得困难了。开发过程中需要面临一系列问题:用户体验优化、后台真实错误原因分析,分布式系统内各组件的调用情况等。在这些问题的驱动下,Tracing 变成了分布式系统必不可少的组成部分。

Part 2 - Opentracing 的产生

当代分布式跟踪系统(例如,Zipkin, Dapper, HTrace, X-Trace 等)旨在解决分布式系统下的用户体验优化、后台真实错误原因分析、分布式系统内各组件的调用情况等问题,但是他们使用不兼容的 API 来实现各自的应用需求。尽管这些分布式追踪系统有着相似的 API 语法,但各种语言的开发人员依然很难将他们各自的系统(使用不同的语言和技术)和特定的分布式追踪系统进行整合。

在这种背景下,opentracing 应运而生。Opentracing 通过提供平台无关、厂商无关的 API,使得开发人员能够方便的添加(或更换)追踪系统。Opentracing 提供了用于运营支撑系统的和针对特定平台的辅助程序库。

Part 3 - 什么是一个 trace

在广义上,一个 trace 代表了一个事务或者流程在(分布式)系统中的执行过程。在 Opentracing 标准中,trace 是多个 span 组成的一个有向无环图(DAG),每一个 span 代表 trace 中被命名并计时的连续性的执行片段。

分布式追踪中的每个组件都包含自己的一个或者多个 span。例如,在一个常规的 RPC 调用过程中,Opentracing 推荐在 RPC 的客户端和服务端,至少各有一个 span,用于记录 RPC 调用的客户端和服务端信息。

一个父级的 span 会显示的并行或者串行启动多个子 span。在 Opentracing 标准中,甚至允许一个子 span 有个多父 span(例如:并行写入的缓存,可能通过一次刷新操作写入动作)。

Part 4 - Opentracing 概念与术语

Traces

一个 trace 代表一个潜在的,分布式的,存在并行数据或并行执行轨迹(潜在的分布式、并行)的系统。一个 trace 可以认为是多个 span 的有向无环图(DAG)。

Spans

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

Operation Names

每一个 span 都有一个操作名称,这个名称简单,并具有可读性高。(例如:一个 RPC 方法的名称,一个函数名,或者一个大型计算过程中的子任务或阶段)。span 的操作名应该是一个抽象、通用的标识,能够明确的、具有统计意义的名称;更具体的子类型的描述,请使用 Tags。

例如,假设一个获取账户信息的 span 会有如下可能的名称:

操作名

指导意见

get

太抽象

get_account/792

太明确

get_account

正确的操作名,关于account_id=792的信息应该使用 Tag 操作

Inter-Span References

一个 span 可以和一个或者多个 span 间存在因果关系。Opentracing 定义了两种关系:ChildOf 和 FollowsFrom这两种引用类型代表了子节点和父节点间的直接因果关系。未来,Opentracing 将支持非因果关系的 span 引用关系。(例如:多个 span 被批量处理,span 在同一个队列中,等等)

ChildOf 引用:

一个 span 可能是一个父级 span 的孩子,即 "ChildOf" 关系。在 "ChildOf" 引用关系下,父级 span 某种程度上取决于子 span。下面这些情况会构成 "ChildOf" 关系:

  • 一个 RPC 调用的服务端的 span,和 RPC 服务客户端的 span 构成 ChildOf 关系

  • 一个 sql insert 操作的 span,和 ORM 的 save 方法的 span 构成 ChildOf 关系

  • 很多 span 可以并行工作(或者分布式工作)都可能是一个父级的 span 的子项,他会合并所有子 span 的执行结果,并在指定期限内返回

FollowsFrom 引用:

一些父级节点不以任何方式依赖他们子节点的执行结果,这种情况下,我们说这些子 span 和父 span 之间是 "FollowsFrom" 的因果关系。"FollowsFrom" 关系可以被分为很多不同的子类型,未来版本的 Opentracing 中将正式的区分这些类型

Logs

每个 span 可以进行多次 Logs 操作,每一次 Logs 操作,都需要一个带时间戳的时间名称,以及可选的任意大小的存储结构。

标准中定义了一些日志(logging)操作的一些常见用例和相关的 log 事件的键值,可参考 Data Conventions Guidelines 数据约定指南。

Tags

每个 span 可以有多个键值对(key:value)形式的 TagsTags 是没有时间戳的,支持简单的对 span 进行注解和补充。

和使用 Logs 的场景一样,对于应用程序特定场景已知的键值对 Tags,tracer 可以对他们特别关注一下。更多信息,可参考 Data Conventions Guidelines 数据约定指南。

SpanContext

每个 span 必须提供方法访问 SpanContext。SpanContext 代表跨越进程边界,传递到下级 span 的状态。(例如,包含 <trace_id,span_id, sampled> 元组),并用于封装 Baggage (关于 Baggage 的解释,请参考下文)。SpanContext 在跨越进程边界,和在追踪图中创建边界的时候会使用。(ChildOf 关系或者其他关系,参考 Span 间关系 )。

Baggage

Baggage 是存储在 SpanContext 中的一个键值对 (SpanContext) 集合。它会在一条追踪链路上的所有 span 内全局传输,包含这些 span 对应的 SpanContexts。在这种情况下,"Baggage" 会随着 trace 一同传播,他因此得名(Baggage 可理解为随着 trace 运行过程传送的 Baggage)。鉴于全栈 Opentracing 集成的需要,Baggage 通过透明化的传输任意应用程序的数据,实现强大的功能。例如:可以在最终用户的手机端添加一个 Baggage 元素,并通过分布式追踪系统传递到存储层,然后再通过反向构建调用栈,定位过程中消耗很大的 SQL 查询语句。

Baggage 拥有强大功能,但同时也会有很大的消耗。由于 Baggage 的全局传输,如果包含的数量太大,或者元素太多,它将降低系统的吞吐量或增加 RPC 的延迟。

Baggage vs. Span Tags

Baggage 在全局范围内,(伴随业务系统的调用)跨进程传输数据。Span 的 tag 不会进行传输,因为他们不会被子级的 span 继承。

span 的 tag 可以用来记录业务相关的数据,并存储于追踪系统中。实现 Opentracing 时,可以选择是否存储 Baggage 中的非业务数据,Opentracing 标准不强制要求实现此特性。

Inject and Extract

SpanContexts 可以通过 Injected 操作向 Carrier 增加,或者通过 Extracted 从 Carrier 中获取,跨进程通讯数据(例如:HTTP 头)。通过这种方式,SpanContexts 可以跨越进程边界,并提供足够的信息来建立跨进程的 span 间关系(因此可以实现跨进程连续追踪)。

Part 5 - Opentracing 的使用

使用 opentracing 必须实现如下接口。

Span 接口

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

GetContext:获取 span 上下文(即使 span 已经结束,或者即将结束,也可以获取)。

Finish:完成已经开始的 span。除了获取 span 上下文之外,Finish 必须是 span 实例最后被调用的方法。

SetTag:为 span 设置标签。key 必须是 string 类型;value 必须是 string、boolean 或者数值类型。

Log:增加一个日志事件。事件名称是 string 类型,参数值可以是任何类型、任何大小。实现不一定保存参数值(可能只保存格式化后的日志字符串)。

SetBaggageItem:设置一个 string:string 类型的键值对,会传递到未来的子级 span 中。

BaggageItem:获取 Baggage 中的元素。

SpanContext 接口

用户可以通过 span 实例获取 SpanContext,或者使用提取 (Extract) 操作从 Tracer 实例中获取 SpanContext。

SpaContext 必须实现:

ForeachBaggageItem:迭代所有 Baggage 元素。

Tracer 接口

必须实现以下功能:

StartSpan:创建新的 span。调用者可以指定一个或者多个 span 间的关系、一个显式指定的开始时间戳,以及标签集。

Injectspan context:用于跨进程传递数据,必须指定 Carrier。

Extractspan context:从 Carrier 中取出 span 上下文,可用于创建新的子级 span。(注意:有些实现中,span 在 RPC 两端具有相同的 ID;而另一些实现中,客户端是父级 span,服务端是子级 span。)

全局和空 Tracer

每个实现必须提供一个 no-op Tracer:其实现必须不会出错(包括传递 Baggage),不会有任何副作用。在其上进行注入操作永远返回成功;进行提取操作,则返回找不到 span 上下文。

Tracer 必须提供 no-no Span 实现:监控代码不依赖 Tracer 关于 Span 的返回值。

实现可能支持配置 (InitGlobalTracer ())和获取 (GlobalTracer ()) 全局的单例 Tracer。如果支持获取全局单例 Tracer,默认必须返回 no-op Tracer。

参考:

https://wu-sheng.gitbooks.io/opentracing-io/content/

https://www.jianshu.com/p/1231f5e1c883

https://zhuanlan.zhihu.com/p/268740698

分布式数据库 Tracing (一)— Opentracing相关推荐

  1. 开务分布式数据库 Tracing(二)—— 源码解析

    按照[开务数据库 Tracing(一)]介绍的使用opentracing要求,本文着重介绍开务数据库(原:云溪数据库)Tracing模块中是如何实现Span,SpanContexts和Tracer的. ...

  2. jdbc取款怎样限制条件_京东张亮:我们是怎样打造一款分布式数据库的

    我们是怎样打造一款分布式数据库的 作者 | 张亮 关系型数据库在过去数十年的数据库领域一直占据着绝对主导的地位,它所带来的稳定性.安全性和易用性,成为了构建现代化系统的基石.随着的互联网高速发展,构架 ...

  3. Java 服务接入 OpenTracing(1)--从 Tracing 到 OpenTracing

    Tracing 的由来 Tracing 数据模型 Tracing 的架构设计 从 Tracing 到 OpenTracing OpenTracing 做了什么事情 Tracing 的由来 随着微服务技 ...

  4. 开源分布式数据库中间件

    转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性 ...

  5. tp3分布式session mysql_分布式数据库支持

    ThinkPHP内置了分布式数据库的支持,包括主从式数据库的读写分离,但是分布式数据库必须是相同的数据库类型. 配置`DB_DEPLOY_TYPE` 为1 可以采用分布式数据库支持.如果采用分布式数据 ...

  6. 基于Sql Server 2008的分布式数据库的实践(一)

    原文 基于Sql Server 2008的分布式数据库的实践(一) 配置Sql Server 2008(Win7) 1.打开SQL server2012,使用windows身份登录 2.登录后,右键选 ...

  7. 区块链技术的本质是分布式数据库

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链技术是基于比特币应用提出的一个概念,他是一个融合了多种技术的一个集成式创新.目前区块链的应用早已不仅仅局限在比特币 ...

  8. 重磅!分布式数据库解决方案Apache ShardingSphere毕业成为顶级项目

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 全球最大的开源软件基金会 Apache 软件基金会(以下简称 Ap ...

  9. 网易分布式数据库多活架构的演进与实践

    本文根据周劲松老师在[deeplus直播第228期]线上分享演讲内容整理而成. 周劲松 网易杭州研究院资深研发工程师 来自网易数据科学中心,目前是网易分布式数据库DDB及网易数据运河NDC项目负责人. ...

最新文章

  1. 550种Blender风格化笔刷素材
  2. 用共振频率去理解神经网络-将乙烯模型运行300次的数据
  3. 从0到1建立一张评分卡之数据预处理
  4. Jvm之用java解析class文件
  5. Delphi如果要追赶C#,最应该做的
  6. nssl1438-战略威慑【枚举,树的直径】
  7. 前端学习(526):等分布局
  8. 【CCFCSP - 201403-4】无线网络(分层图最短路)
  9. 计算机与交互式白板通过USB数据线,选购交互式电子白板注意哪些事项【详细介绍】...
  10. centos中mysql启动失败,解决CentOS下mysql启动失败
  11. 项目笔记:分层模型建立
  12. LADRC的学习——换被控对象进行仿真测试
  13. 训练赛20160403
  14. Python 3.65 安装geopandas
  15. aix查看文件夹大小命令_AIX5.3系统文件大小的限制
  16. Java Web开发实战经典(基础篇)
  17. 计算机毕业设计JAVA鸿鹄教育培训mybatis+源码+调试部署+系统+数据库+lw
  18. 点云 3D 目标跟踪 - AB3DMOT(IROS 2020, ECCVW 2020)
  19. 医学院交换去计算机学院,第一临床学院成功举办2018年国际医学生SCOPE交换项目...
  20. 服务器拒绝了您发送离线文件的请求,处理qq发送离线文件被提示“服务器拒绝了您发送离线文件”的方法...

热门文章

  1. 写给年轻程序员:37岁的我,正在找工作!
  2. PMP证书真的有用吗?
  3. tplink怎么进去_在TP-Link工作体验如何?
  4. 海豚湾在哪_前任3中的海豚湾在哪里揭晓 热爱海洋之人的梦中圣地
  5. M1 和 Docker 谈了个恋爱
  6. Hive误删除后,如何恢复数据
  7. REWORK读书笔记
  8. PMBOK(第4版)--项目管理九大知识领域的【输入】、【工具与技术】、【输出】一览表
  9. 内存池(memory pool)
  10. 计算机最大数最小数的函数,Excel函数教程: 求最大、最小、中间数、最多数-excel技巧-电脑技巧收藏家...