前言
微服务链路追踪系列博客,后续可能会涉及到Brave、Zipkin、Sleuth内容的梳理。
Brave
何为Brave?
github地址:https://github.com/openzipkin/brave
Brave是一个分布式追踪埋点库。
主要功能:
拦截请求,收集时序数据,关联、传播追踪上下文。最后,追踪数据会上报到Zipkin等服务器。
下面介绍Brave的几个核心功能:
1、Propagation
B3Propagation
Brave使用B3传播协议,即在http请求头中存储固定字段,来传递链路信息。如:x-b3-traceId、x-b3-spanId、x-b3-sampled等
举例:
在整合spring cloud sleuth项目中,针对任一请求,可在请求头中查看到相应的链路追踪字段信息。
x-b3-traceid:3bc54fac863bedb4
x-b3-spanid:e9d611683cf3613c
x-b3-parentspanid:3bc54fac863bedb4
x-b3-sampled:0
注意:
若B3已有固定字段满足不了您的需求,还可以通过BaggageField添加自定义业务字段。
步骤
主要包括两个重要环境:Inject(注入)和Extract(提取)。
其中,Inject即将b3字段信息添加到http header中,而Extract正好相反,及从http header中提取相应b3信息。
2、Span
Span,实际记录每个功能块执行信息的类。
(1)数据内容
主要包括以下三部分内容:
基础数据:用于跟踪树中节点的关联和界面展示,包括traceId、spanId、parentId、name、timestamp和duration。
name:用于在跟踪树节点的时间条上展示。
timestamp用于记录调用的起始时间
duration表示此次调用的总耗时,在跟踪树中将表示成该Span的时间条的长度。
Annotation数据:用来记录关键事件,只有四种,cs(Client Send)、sr(Server Receive)、ss(Server Send)、cr(Client Receive),所以在Span模型中,Annotation是一个列表,长度最多为4。
每种关键事件包含value、timestamp和endpoint,value就是cs、sr、ss和cr中的一种,timestamp表示发生的时间,endpoint用于记录发生的机器(ip)和服务名称(serviceName)。
BinaryAnnotation数据:如果需要绑定一些业务数据(日志)的话,可以将数据写入BinaryAnnotation中,它的结构和Annotation数据一模一样,在Span中也是一个列表,这里就不再阐述,但BinaryAnnotation中不宜放太多数据,不然将导致性能和体验的下降。
(2)分类
NoopSpan:从不上报Zipkin
RealSpan:可能上报,在finish()后上报
LazySpan:延迟创建Span(当第一个公共方法调用时)
3、Sample
采样器,并非所有的请求数据都会记录并上报Zipkin。