什么是链路追踪--golang面试题

你们公司是如何实现链路追踪的?这个问题在各个编程语言中都会出现,这里仅以golang为例子。

假如你们公司的架构是微服务,那么一定会遇到这个问题。解决的问题主要是,在微服务场景下能够快速定位到错误的位置,错误的服务,也就是要建立一个分布式追踪系统,追踪日志。

​ 链路追踪系统的理论模型几乎都借鉴了 Google 的一篇论文”Dapper, a Large-Scale Distributed Systems Tracing Infrastructure”,典型产品有Uber jaeger、Twitter zipkin、淘宝鹰眼等。这些产品的实现方式虽然不尽相同,但核心步骤一般都有三个:数据采集、数据存储和查询展示

​ 链路追踪系统第一步,也是最基本的工作就是数据采集。在这个过程中,链路追踪系统需要侵入用户代码进行埋点,用于收集追踪数据。但是由于不同的链路追踪系统的API互不兼容,所以埋点代码写法各异,导致用户在切换不同链路追踪产品时需要做很大的改动。为了解决这类问题,于是诞生了OpenTracing规范,旨在统一链路追踪系统的API。

二、OpenTracing规范

​ OpenTracing 是一套分布式追踪协议,与平台和语言无关,具有统一的接口规范,方便接入不同的分布式追踪系统。

2.1.1 Trace

​ Trace表示一条完整的追踪链路,例如:一个事务或者一个流程的执行过程。一个 Trace 是由一个或者多个 Span 组成的有向无环图(DAG)。

2.1.2 Span

​ Span表示一个独立的工作单元,它是一条追踪链路的基本组成要素。例如:一次RPC调用、一次函数调用或者一次Http请求。

每个Span封装了如下状态:

  • 操作名称用于表示该Span的任务名称。 例如:一个 RPC方法名, 一个函数名,或者大型任务中的子任务名称。
  • 开始时间戳任务开始时间。
  • 结束时间戳。任务结束时间。通过Span的结束时间戳和开始时间戳,就能够计算出该Span的整体耗时。
  • 一组Span标签每一个Span标签是一个键值对。键必须是字符串,值可以是字符串、布尔或数值类型。
常见标签键可参考: https://github.com/opentracing/specification/blob/master/semantic_conventions.md

一组Span日志每一条Span日志由一个键值对和一个相应的时间戳组成。键必须是字符串,值可以是任何类型。

常见日志键参考: https://github.com/opentracing/specification/blob/master/semantic_conventions.md

2.1.3 Reference

​ 一个Span可以与一个或者多个Span存在因果关系,这种关系称为Reference。OpenTracing目前定义了两种关系:ChildOf(父子)关系 和 FollowsFrom(跟随)关系。

  • ChildOf关系父Span的执行依赖子Span的执行结果,此时子Span对父Span的Reference关系是ChildOf。比如对于一次RPC调用,服务端的Span(子Span)与客户端调用的Span(父Span)就是ChildOf关系。
  • FollowsFrom关系父Span的执行不依赖子Span的执行结果,此时子Span对父Span的Reference关系是FollowFrom。FollowFrom常用于表示异步调用,例如消息队列中Consumer Span与Producer Span之间的关系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值