开发者学堂课程【分布式链路追踪 Skywalking:OpenTracing 介绍】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/743/detail/13167
0pen Tracing 介绍
内容介绍
一、Tracing的概念(最核心的概念)
二、Span的概念
三、Log 的概念
四、Tags 的概念
一、 Trace的概念
在广义上,一个trace代表了一个事务或者流程在(分布式)系统中的执行过程,在OpenTracing 标准中,trace 是多个 span 组成一个有向无环图(DAG),每一个 span 代表 trace 中被命名并计时的连续性的执行片段。
详细介绍:在广义上,一个trace,在分布式系统中的执行过程,外部系统前端发起调用,调用的整个运作流程就代表一个 trace。对于外端的开发人员来说,要去定位问题,问题最初的根源是在 trace 上,可以通过 trace 来定位到,弄清楚在 trace当中,哪个部分出现了性能的瓶颈或者调用失败。
trace 是由 span 来组成的一个有向无环图,是定向的,不会出现一个环状物。span 代表 trace 中被命名并计时的连续性的执行片段,就是trace的一个调用过程。
这张图整体上一笔调用就代表一个trace,然而这张图不是特别的直观,因为它不能标识出每一笔调用的时间,所以就不能知道是在哪一笔调用,就无法知道span的那一个部分出现了一个性能的问题。
opeaing trace 将概念语义化之后,通过它的一个设计可以画出下面这张图。这张图上整体的调用就是一个trace,其中每一个颜色的色块代表一个span,比如说权限服务的调用过程就是一个span,它调用完之后会调用订单服务过程,这也是一个span。
通过这张图,可以很直观的看到,到底在这个过程中经过了哪几个过程,每个过程都是一个span,那个span耗时最长,一般来说性能的瓶颈可能就在这里。
二、 Span 的概念
一个Span代表系统中具有开始时间和执行时长的逻辑运行单元,span之间通过嵌客或者顺序排列建立逻辑因果关系。
详细介绍:一个Span代表系统中具有开始时间和执行时长的逻辑运行单元,就是一个调用过程,这个过程是有开始时间和持续时长的,可以用来统计执行时间,span之间具有逻辑因果关系。
Span里面的信息包括:操作的名字,开始时间和结束时间,可以附带多个key.value构成的Tags(key必须是String,value可以是String,bool或者数字),还可以附带Logs信息(不一定所有的实现都支持)也是 key.value 形式。
操作的名字:方法的一个名称。
开始时间结束时间:结束时间-开始时间=执行时间。
tags:展示 span 的一些额外信息。tags里面的key必须是 string 。value 可以是string,bool 或者数字。
logs信息:主要是用来打印一些span运行过程中的一些消息。
下面例子是一个 Trace ,里面有8个 Span:
一个 span 可以和一个或者多个 span 间存在因果关系。OpenTracing 定义了两种关系:Childof 和Followsfrom, 这两种引用类型代表了子节点和父节点间的直接因果关系。未来,OpenTracing 将支持非因果关系的 span 引用关系。(例如:多个 span 被批量处理,span 在同一个队列中,等等)
Childof 很好理解,就是父亲 Span 体段另一个孩子 Span ,比如函数调用,被调用者是调用者的孩子,比如说 RPC 调用,服务端那边的 Span,就是Chidof 客户端的,很多并发的调用,然后将结果聚合起来的操作,就构成了 Childof 关系。
如果父亲 Span 并不依赖于孩子 Span 的返回结果,这时可以说它他构成 FollowsFrom 关系。
例如: span 之间的因果关系,Span A 和 Span C 之间的关系就是 childof,代表 SpanA 调用 Span C , 需要等待 Span C 的返回。
Span F 和 Span G 之间的关系是 FollowsFrom,代表 SpanF 调用 Span G, 不需要等待 SpanG 的返回,就结束了。
如图所示,左边的每一条追踪代表一个 Trace,而右边时序图中每一个节点就是一个 Span。
左边每一笔的一个调用,就是一个 trace,trace 底下会有多个 span,比如说图片上的一个 span mvc 的出入接口调用就是一个 span,而如果说这个接口内部要调用 dubbo,于是就会出现一个新的 dubbo span,所以用这样一个 span 之间的关系再加上 trace,就能很明显的描述一个追踪链路的关系。
三、 Log 的概念
每个span可以进行多次 Logs 操作,每一次 Logs 操作,都需要一个带时间戳的时间名称,以及可选的任意大小的存储结构。
如下面是一个异常的 Log:
异常的 logo,本质上是一个 key.value 键值对,比如说 event 就是一个事件类型,key 就是 event,error 就是 value。
图片上面的内容,主要还是为了丰富的span的信息展示,比如说异常可以通过 log 来查看到底是哪个位置出现了问题,这个异常对战到底是怎么样的,用来快速定位一个议程。
四、 Tags 的概念
每个 span 可以有多个健值对 (key.value) 形式的 Tags, Tags 是没有时间截的,支持简单的对 span 进行注解和补充。
如下图就是一个 Tags 的详细信息,其中记录了数据库访问的 SQL 语句等内容。
课堂概念总结:
trace 是一个大的调用,比如说从前端发起请求到后端,那么直到后端返回这整个时间,就是发起了一次 trace 的调用。在 trace 内部,可能有很多span。
如左图所示,一个 span 是 spring mvc,响应到一个外部需求进行处理。span 内部会有一些 tags,tags 标明了请求类型,请求类型是键值对的形式:spring mvc。
如果报错了,就会有一个 log,log也是键值对形式:event:info 和 message:abc。
一个 trace 会有多个 span,如右图所示,另一个 span,是 dubbo span,是一个 dubbo 调用的 span ,请求类型是 dubbo。
如果报错,键值对形式:event:error 和 stack:堆栈信息。
在 span 的额外的信息里,还包括开始时间和结束时间。通过这些信息就可以看到 span 的一个业路的情况。
在 span 与 span 之间呢,它是有一个通过 dubbo 调用的关系存在,这个关系是 childof。
Open Tracing 就是基于这样的一些概念来把它的数据进行分类并且存储,那么通过这些数据的组合,就可以去画出分布式业路追踪的一张图了。