分布式应用追踪方案

分布式应用跟踪也称为请求跟踪,是一种分析和监控应用的方法,微服务架构中尤为重要。

是理解系统行为、快速定位和解决问题的关键。

分布式跟踪系统通常分为:数据收集、数据存储、数据展示三部分。

Spring Cloud Sleuth通过集成Zipkin,完成数据收集、存储和展示。

基本思路

在服务调用请求和响应中加入ID,标明上下游请求关系。分析服务调用链和依赖关系,执行可视化处理。

Spring Cloud Sleuth封装Zipkin,生成Span、Trace等信息,将跟踪数据发送到Zipkin Server。

Zipkin架构

跟踪器(Tracer)嵌入到应用程序中,记录操作的时间和元数据。

收集的跟踪数据称为Span,将数据发给Zipkin Server的组件称为Reporter,负责将数据发送到Zipkin收集器(collector)。

Span

对一个服务的跟踪处理是一个Span,Span是跟踪信息的基本单元。

包含了一组描述信息:id,parentId,name,timestamp,duration,annotations等。

初始span称为根span,span id和 trace id相同。

Trace

Zipkin使用Trace结构表示一次请求的调用链,一次请求由后台若干服务组成,每个服务是一个Span,Span间存在依赖关系,Trace是Span的集合。

Transport

Transport负责将收集到的Span发给Zipkin collector,传输方式为:HTTP、Kafka和Scribe。

下图为Zipkin跟踪收集数据的过程:

Zipkin Server组成

collector(收集器)

跟踪数据被送达时,负责验证、存储和索引。

storage(存储)

Zipkin最初基于Cassandra数据库,后引入ElasticSearch和MySQL。同时为其他后端开发了扩展组件。

search(检索)

以JSON API方式提供数据提取功能。

web UI(用户界面)

一个Web UI数据查看界面,UI未内置身份验证功能。

Zipkin Annotation

Client Sent:客户端发起一个请求,span的开始

Server Received:服务端收到请求并开始处理。

Server Sent:服务端处理完成,开始响应客户端。

Client Received:客户端收到结果,span结束。

分布式跟踪规范(OpenTracing)

OpenTracing意在解锁特定产品或供应商,统一API调用。

OpenTracing不是标准,是一种API规范。

以下是支持OpenTracing规范的APM(应用性能管理)工具。

inspectIT

inspectIT是针对Java的端到端APM解决方案(零配置)。

stagemonitor

stagemonitor针对Java应用的开源跟踪,分析和度量解决方案。使用字节码织入跟踪,无需手动修改代码。

Apache SkyWalking

SkyWalking专为微服务,云原生和容器(Docker,K8s,Mesos)架构而设计(github地址)。

Wavefront by VMware

Wavefront云原生监控和分析平台。

Elastic APM

Elastic APM基于Elastic Stack的开源APM解决方案。通过Kibana中的curated UI 提供可视化,能集成机器学习和告警。

CNCF Jaeger

Jaeger 来自Uber开源技术,支持:Java,Go,Python,Node.js,C ++和C。

LightStep

LightStep支持:Go,Python,Javascript,Objective-C,Java,PHP,Ruby和C ++。

Instana

Instana支持:Crystal, Go,Java,Node.js, .Net,Crystal,Java,Scala,NodeJs,PHP,Python和Ruby。

国内大厂出品

鹰眼、Hydra、CAT、Watchman、Microscope、Tracing。

OpenTracing Span

分布式系统的每个组件都有一个span(跨度),一个span由如下内容组成:

操作名称、开始时间戳和结束时间戳、键/值对标签(Tags)、键/值对日志(Logs)、一个SpanContext。

Tags:一般使用Tags标识简单数据,以供查询、过滤和理解跟踪数据。

如订单跟踪:orderId=567,数据库标识:db.instance=orcl,http响应状态:http.status_code=200

Logs:用于捕获特定span内的日志及应用调试信息。也用于记录span内的特定时刻或事件。常用于Trace dashboard的查询和问题追踪。

SpanContext:携带跨进程边界数据。

Span示例: