公众号 :moon聊技术

分布式链路追踪要怎么玩

2021-03-26  本文已影响0人  moon聊技术

微信公众号:moon聊技术
关注选择“ 星标 ”, 重磅干货,第一 时间送达!
[如果你觉得文章对你有帮助,欢迎关注,点赞,转发]

image

前言


最近公司服务出现了一个bug,问题一直没有查出来在哪里,主要是某个接口调用两个应用的日志输出都没有问题,并且在整个请求链路较长,仅仅定位这个问题就定位了很久,效率奇低,于是'在moon的强烈要求下',准备在各服务接入分布式链路追踪框架了。

为什么需要分布式链路追踪


截屏2021-03-23 下午5.41.06.png

在现有的微服务体系架构下,随着服务数量的增多,服务与服务之间的关联关系错综复杂,一个请求下发后可能会经过N个服务处理后才返回响应,所以,当出现bug时,开发人员只能依靠日志一个个排查,效率低的可怕,于是,分布式链路追踪成为了你的最优解。

当然这只是其中一个因素,分布式链路追踪能够解决服务链路的问题,他还可以做到:

trace_ID


那么怎么样才能判断一个请求发起到结束究竟经过了哪些服务呢?

大家肯定想到了一个唯一Id来实现,就是说,我的请求在发起时,创建一个全局的唯一Id,然后在后面的请求传递的时候都把这个Id带上,这样,就可以通过这个唯一Id来判断究竟经过了哪些服务。

如下图:

截屏2021-03-23 下午5.41.12.png

我们可以通过trace_ID清晰的发现一个从A开始的请求都经过了那些服务

span_ID


现在我们知道了所有调用的服务,但是我们还会发现一个问题,我们发现A服务在调用B服务的时候,会B会调用两个服务,一个是服务C,一个是服务B,那么这个先后关系有要怎么判断呢?

截屏2021-03-23 下午5.41.18.png

没错,就是再引入一个span_ID来判断服务的先后调用顺序,如图,就可以判定调用链路为

服务A->服务B->服务C->服务D->服务E->服务F

parent_ID


当然,父子间的调用关系我们就可以用一个parent_ID去管理了

截屏2021-03-23 下午5.41.24.png

比如:我们看到服务C的parent_ID为2,那么我们就知道span_ID为2的服务调用了服务C,也就是服务B调用了服务C

OpenTracing是什么


由于各种调用链监控产品层出不穷,各式各样,为了避免碎片化,促进互操作性,社区诞生了一个叫做OpenTracing的标准化组织,制定了一些链路跟踪的API规范,并且提供了一些框架和库,这些框架和库实现了它制定的那些API规范。而且它是一个独立开放的项目,现在已经是云原生基金会(Cloud Native Computing Foundation, CNCF)的项目了。任何组织和个人都可以贡献符合API规范的库/框架。

截屏2021-03-25 上午10.50.30.png

OpenTracing提供的框架和库需要重点说明的是,并不做分析,所以其并不是一个完备的链路系统.

OpenTracing旨在标准化Trace数据结构和格式,其目的是:

分布式链路跟踪系统的数据模型:


在OpenTracing规范中,有三个关键的,相关关联的类型:Tracer,Span和SpanContext

Traces(一般翻译为链路):一起请求从发出,然后经过多个模块(这个模块可能是函数或者系统,或者都有),最终得到请求回复,整个请求按照调用时间和关系串起来就是一个trace。

Span则是组成trace的最基本单元,它一般代表分布式系统中一个独立的工作单元。一个Span包含如下几部分:

截屏2021-03-24 下午4.24.07.png 对应的时间维度为: 截屏2021-03-24 下午4.24.27.png

一个trace的span间有两种可能的关系:

最后需要介绍的一个概念就是“active span”。一个线程里面可以包含多个span,但同一时刻只能有一个span处于工作状态,这个span称之为ActiveSpan。Span可以有这么几个状态:

总结


1:分布式链路追踪就是将一次完整的请求链路还原,能够清晰的追踪到每个服务的信息

2:由于分布式链路追踪实现方式多样,于是opentracing组织定制了一个规范,定义了一个标准,最重要的三个指标就是Tracer,Span和SpanContext

巨人的肩膀 https://niyanchun.com/opentracing-introduction.html

要是觉得文章还不错,顺手点个赞和在看吧,大家的支持就是我最大的动力,还可以关注我的公众号加moon的个人微信,做个萍水之交可好~

上一篇下一篇

猜你喜欢

热点阅读