Istio最佳实践系列:如何实现方法级调用跟踪?

赵化冰,腾讯云高级工程师,Istio Member,ServiceMesher 管理委员,Istio 项目贡献者,热衷于开源、网络和云计算。目前主要从事服务网格的开源和研发工作。

引言

TCM(Tencent Cloud Mesh)是腾讯云上提供的基于Istio 进行增强,和 Istio API 完全兼容的 Service Mesh 托管服务,可以帮助用户以较小的迁移成本和维护代价快速利用到 Service Mesh 提供的流量管理和服务治理能力。本系列文章将介绍 TCM 上的最佳实践,本文将介绍如何利用 Spring 和 OpenTracing 简化应用程序的Tracing 上下文传递,以及如何在 Istio 提供的进程间调用跟踪基础上实现方法级别的细粒度调用跟踪

分布式调用跟踪和 OpenTracing 规范 什么是分布式调用跟踪?

相比传统的“巨石”应用,微服务的一个主要变化是将应用中的不同模块拆分为了独立的进程。在微服务架构下,原来进程内的方法调用成为了跨进程的RPC调用。相对于单一进程的方法调用,跨进程调用的调试和故障分析是非常困难的,很难用传统的调试器或者日志打印来对分布式调用进行查看和分析。

Istio最佳实践系列:如何实现方法级调用跟踪?


如上图所示,一个来自客户端的请求经过了多个微服务进程。如果要对该请求进行分析,则必须将该请求经过的所有服务的相关信息都收集起来并关联在一起,这就是“分布式调用跟踪”。

什么是OpenTracing? CNCF OpenTracing项目

OpenTracing是CNCF(云原生计算基金会)下的一个项目,其中包含了一套分布式调用跟踪的标准规范,各种语言的API,编程框架和函数库。OpenTracing的目的是定义一套分布式调用跟踪的标准,以统一各种分布式调用跟踪的实现。目前已有大量支持OpenTracing规范的Tracer实现,包括Jager,Skywalking,LightStep等。在微服务应用中采用OpenTracing API实现分布式调用跟踪,可以避免vendor locking,以最小的代价和任意一个兼容OpenTracing的基础设施进行对接。

OpenTracing概念模型

OpenTracing的概念模型参见下图:

Istio最佳实践系列:如何实现方法级调用跟踪?


图源自 https://opentracing.io/
如图所示,OpenTracing中主要包含下述几个概念:

Trace: 描述一个分布式系统中的端到端事务,例如来自客户端的一个请求。

Span:一个具有名称和时间长度的操作,例如一个REST调用或者数据库操作等。Span是分布式调用跟踪的最小跟踪单位,一个Trace由多段Span组成。

Span context:分布式调用跟踪的上下文信息,包括Trace id,Span id以及其它需要传递到下游服务的内容。一个OpenTracing的实现需要将Span context通过某种序列化机制(Wire Protocol)在进程边界上进行传递,以将不同进程中的Span关联到同一个Trace上。这些Wire Protocol可以是基于文本的,例如HTTP header,也可以是二进制协议。

OpenTracing数据模型

一个Trace可以看成由多个相互关联的Span组成的有向无环图(DAG图)。下图是一个由8个Span组成的Trace:

[Span A] ←←←(the root span) | +------+------+ | | [Span B] [Span C] ←←←(Span C is a `ChildOf` Span A) | | [Span D] +---+-------+ | | [Span E] [Span F] >>> [Span G] >>> [Span H] ↑ ↑ ↑ (Span G `FollowsFrom` Span F)

上图的trace也可以按照时间先后顺序表示如下:

––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–> time [Span A···················································] [Span B··············································] [Span D··········································] [Span C········································] [Span E·······] [Span F··] [Span G··] [Span H··]

Span的数据结构中包含以下内容:

name: Span所代表的操作名称,例如REST接口对应的资源名称。

Start timestamp: Span所代表操作的开始时间

Finish timestamp: Span所代表的操作的的结束时间

Tags:一系列标签,每个标签由一个key value键值对组成。该标签可以是任何有利于调用分析的信息,例如方法名,URL等。

SpanContext:用于跨进程边界传递Span相关信息,在进行传递时需要结合一种序列化协议(Wire Protocol)使用。

References:该Span引用的其它关联Span,主要有两种引用关系,Childof和FollowsFrom。

Childof: 最常用的一种引用关系,表示Parent Span和Child Span之间存在直接的依赖关系。例RPC服务端Span和RPC客户端Span,或者数据库SQL插入Span和ORM Save动作Span之间的关系。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjgxd.html