其他分享
首页 > 其他分享> > 【分布式架构】分布式链路追踪

【分布式架构】分布式链路追踪

作者:互联网

0. 前言

本文主要介绍分布式追踪系统的原理、“可观察性” 的三大支柱、OpenTracing标准,同时对当前主流的开源分布式追踪系统进行简单对比。

随着应用容器化和微服务的兴起,借由 DockerKubernetes 等工具,服务的快速开发和部署成为可能,构建微服务应用变得越来越简单。但是随着大型单体应用拆分为微服务,服务之间的依赖和调用变得极为复杂,这些服务可能是不同团队开发的,可能基于不同的语言,微服务之间可能是利用 RPCRESTful API,也可能是通过消息队列实现调用或通讯。如何理清服务依赖调用关系、如何在这样的环境下快速 debug、追踪服务处理耗时、查找服务性能瓶颈、合理对服务的容量评估都变成一个棘手的事情。

1. 可观察性(Observability)及三大支柱

为了应对这些问题,可观察性(Observability) 这个概念被引入软件领域。传统的监控和报警主要关注系统的异常情况和失败因素,可观察性更关注的是从系统自身出发,去展现系统的运行状况,更像是一种对系统的自我审视。一个可观察的系统中更关注应用本身的状态,而不是所处的机器或者网络这样的间接证据。我们希望直接得到应用当前的吞吐和延迟信息,为了达到这个目的,我们就需要合理主动暴露更多应用运行信息。在当前的应用开发环境下,面对复杂系统我们的关注将逐渐由点到点线面体的结合,这能让我们更好的理解系统,不仅知道What,更能回答Why。

可观察性目前主要包含以下三大支柱:

LoggingMetrics 和 Tracing 既各自有其专注的部分,也有相互重叠的部分。

近年来 Metric 和 Tracing 有融合的趋势,现在很多流行的 APM (应用性能管理)系统,如Datadog 就融合了 Tracing 和Metric 信息。

就在写这篇文章的同时,在 KubeCon 2019CNCF 宣布 OpenTracing 和 Google 发起的的OpenCensus 项目合并。目前新项目仍在建设中,不过已经承诺了对现有 OpenTracing 协议提供兼容。

下面是 CNCF 总结的当前流行的实现可观察性系统的常见软件或服务,Monitoring 栏中以Prometheus 为代表,本身可以实现 Metric 的收集监控,不过结合图中其他工具可以实现更加强大和完善的监控方案:

2. 分布式追踪系统(Tracing)定位及其标准

分布式追踪系统发展很快,种类繁多,但核心步骤一般有三个:代码埋点,数据存储、查询展示。

2.1 案例分析

下图是一个分布式调用的例子,客户端发起请求,请求首先到达负载均衡器,接着经过认证服务,计费服务,然后请求资源,最后返回结果。

opentracing1.png

数据被采集存储后,分布式追踪系统一般会选择使用包含时间轴的时序图来呈现这个 Trace。

opentracing2.png

但在数据采集过程中,由于需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果您希望切换追踪系统,往往会带来较大改动。

2.2 OpenTracing

为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。

+-------------+  +---------+  +----------+  +------------+
| Application |  | Library |  |   OSS    |  |  RPC/IPC   |
|    Code     |  |  Code   |  | Services |  | Frameworks |
+-------------+  +---------+  +----------+  +------------+
       |              |             |             |
       |              |             |             |
       v              v             v             v
  +------------------------------------------------------+
  |                     OpenTracing                      |
  +------------------------------------------------------+
     |                |                |               |
     |                |                |               |
     v                v                v               v
+-----------+  +-------------+  +-------------+  +-----------+
|  Tracing  |  |   Logging   |  |   Metrics   |  |  Tracing  |
| System A  |  | Framework B |  | Framework C |  | System D  |
+-----------+  +-------------+  +-------------+  +-----------+

Tracing的功能定位

最早由于Google的论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,让Tracing流行起来。而Twitter基于这篇论文开发了Zipkin并开源了这个项目。再之后业界百花齐放,诞生了一大批开源和商业Tracing系统。

2.3 OpenTracing 标准

由于近年来各种链路监控产品层出不穷,当前市面上主流的工具既有像Datadog这样的一揽子商业监控方案,也有AWS X-RayGoogle Stackdriver Trace这样的云厂商产品,还有像ZipkinJaeger这样的开源产品。

云原生基金会(CNCF) 推出了OpenTracing标准,推进Tracing协议和工具的标准化,统一Trace数据结构和格式。OpenTracing通过提供平台无关、厂商无关的 API,使得开发人员能够方便的添加(或更换)追踪系统的实现。比如从Zipkin替换成Jaeger/Skywalking等后端。

OpenTracing中,主要定义以下基本概念:

单个Trace中,Span间的因果关系:

 1        [Span A]  ←←←(the root span)
 2            |
 3     +------+------+
 4     |             |
 5 [Span B]      [Span C] ←←←(Span C 是 Span A 的孩子节点, ChildOf)
 6     |             |
 7 [Span D]      +---+-------+
 8               |           |
 9           [Span E]    [Span F] >>> [Span G] >>> [Span H]
10                                       ↑
11                                       ↑
12                                       ↑
13                         (Span G 在 Span F 后被调用, FollowsFrom)

每个Span包含的操作名称、开始和结束时间、附加额外信息的Span Tag、可用于记录Span内特殊事件Span Log、用于传递Span上下文的SpanContext和定义Span之间关系的References

2.4 关于SpanContext

SpanContextOpenTracing 中非常重要的概念,在创建Span、向传输协议Inject(注入)和从传输协议中Extract(提取)调用链信息时,SpanContext发挥着重要作用。

SpanContext数据结构如下:

SpanContext:
- trace_id: "abc123"
- span_id: "xyz789"
- Baggage Items:
- special_id: "vsid1738"

在跨界(跨服务或者协议)传输过程中实现调用关系的传递和关联,需要能够将SpanContext 向下游介质注入,并在下游传输介质中提取 SpanContext

往往可以使用协议本身提供的类似HTTP Headers的机制实现这样的信息传递,像Kafka这样的消息中间件也有提供实现这样功能的Headers机制。

OpenTracing 实现,可以使用 api 中提供的 Tracer.Inject(...) 和 Tracer.Extract(...) 方便的实现 SpanContext的注入和提取。

下面是伪代码示例:

3. 目前主流开源方案及对比

目前比较主流的Tracing开源方案有JaegerZipkinApache SkyWalkingCATPinpointElastic APM等,这些项目源代码现在都托管在Github上。

我们按照下面的维度进行了对比:

在现有系统引入时需要考虑以下因素:

  1. 低性能损耗
  2. 应用级的透明,尽量减少业务的侵入,目标是尽量少改或者不用修改代码
  3. 扩展性

基于以上调研,可以总结如下:

相关文章

  1. opentracing-java github
  2. opentracing-java 中文文档

 

标签:调用,Span,Tracing,系统,链路,架构,日志,OpenTracing,分布式
来源: https://blog.csdn.net/qq_41893274/article/details/113959181