转载自:https://www.cnblogs.com/linguoguo/p/12311225.html
Opentracing 链路追踪
在微服务架构的系统中,请求在各服务之间流转,调用链错综复杂,一旦出现了问题和异常,很难追查定位,这个时候就需要链路追踪来帮忙了。链路追踪系统能追踪并记录请求在系统中的调用顺序,调用时间等一系列关键信息,从而帮助我们定位异常服务和发现性能瓶颈。
Opentracing
Opentracing是分布式链路追踪的一种规范标准,是CNCF(云原生计算基金会)下的项目之一。和一般的规范标准不同,Opentracing不是传输协议,消息格式层面上的规范标准,而是一种语言层面上的API标准。以Go语言为例,只要某链路追踪系统实现了Opentracing规定的接口(interface),符合Opentracing定义的表现行为,那么就可以说该应用符合Opentracing标准。这意味着开发者只需修改少量的配置代码,就可以在符合Opentracing标准的链路追踪系统之间自由切换。
Data Model
在使用Opentracing来实现全链路追踪前,有必要先了解一下它所定义的数据模型。
Span
Span是一条追踪链路中的基本组成要素,一个span表示一个独立的工作单元,比如可以表示一次函数调用,一次http请求等等。span会记录如下基本要素:
Tags
Tags以K/V键值对的形式保存用户自定义标签,主要用于链路追踪结果的查询过滤。例如: http.method="GET",http.status_code=200。其中key值必须为字符串,value必须是字符串,布尔型或者数值型。 span中的tag仅自己可见,不会随着 SpanContext传递给后续span。 例如:
span.SetTag("http.method","GET")
span.SetTag("http.status_code",200)
Logs
Logs与tags类似,也是K/V键值对形式。与tags不同的是,logs还会记录写入logs的时间,因此logs主要用于记录某些事件发生的时间。logs的key值同样必须为字符串,但对value类型则没有限制。例如:
span.LogFields(
log.String("event", "soft error"),
log.String("type", "cache timeout"),
log.Int("waited.millis", 1500),
)
Opentracing列举了一些惯用的Tags和Logs: https://github.com/opentracing/specification/blob/master/semantic_conventions.md
SpanContext
SpanContext携带着一些用于跨服务通信的(跨进程)数据,主要包含:
Baggage Items
Baggage Items与tags类似,也是K/V键值对。与tags不同的是:
References
Opentracing定义了两种引用关系:ChildOf和FollowFrom。
ChildOf: 父span的执行依赖子span的执行结果时,此时子span对父span的引用关系是ChildOf。比如对于一次RPC调用,服务端的span(子span)与客户端调用的span(父span)是ChildOf关系。
FollowFrom:父span的执不依赖子span执行结果时,此时子span对父span的引用关系是FollowFrom。FollowFrom常用于异步调用的表示,例如消息队列中consumerspan与producerspan之间的关系。
Trace
Trace表示一次完整的追踪链路,trace由一个或多个span组成。下图示例表示了一个由8个span组成的trace:
Causal relationships between Spans in a single 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)
时间轴的展现方式会更容易理解:
Temporal relationships between Spans in a single Trace
––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–> time
[Span A···················································]
[Span B··············································]
[Span D··········································]
[Span C········································]
[Span E·······] [Span F··] [Span G··] [Span H··]
示例来源: https://github.com/opentracing/specification/blob/master/specification.md#the-opentracing-data-model
上一篇 使用ELK搭建日志平台(二):使用Serilog写入日志到Elasticsearch中
下一篇 使用ELK搭建日志平台(四):使用 OpenTelemetry SDK