写点什么

基于 opentracing + Jaeger 实现全链路追踪 ---- 理论部分

用户头像
是老郭啊
关注
发布于: 2020 年 08 月 02 日

链路追踪

1.链路追踪是什么?

随着微服务化,分布式集群时代的到来,企业业务会将一个功能模块任务拆解后分布在不同团队,团队又细分在不同语言,不同机器上运行来保证业务的开发效率以及专业化。然后,随着模块的细分化,当一个功能模块出现问题时(性能,异常错误等),整个业务团队需要从第一步开始跟踪,直到定位到问题,并沟通解决问题,这一部分的运维是非常消耗后期的人工成本,因此,一个能追踪到每一个请求的完整调用链路,收集性能数据,反馈异常的全链路追踪系统被迫切需要。

2.链路追踪解决什么痛点?

1⃣️定位异常故障排查困难

2⃣️整个业务链路调用逻辑不够透明化

3⃣️容量规划难

4⃣️各项性能指标分析难

5⃣️数据无法可视化展示

OpenTracing

1.opentracing 介绍

Opentracing 是分布式链路追踪的一种规范标准,它提供一套分布式追踪协议,是一个与平台无关,编程语言无关,接口统一的分布式追踪系统。下面主要介绍 opentracing所定义的通用数据模型。

2.Span

Span 是链路中的基本组成元素,一个 span表示一个独立的工作单元,在入侵式链路追踪中可以表示一个接口的调用,一个数据库操作的调用等等。一个 span中包含的内容如下:

  • 服务名称(operation name)

  • 服务的开始和结束时间

  • Tags

  • Logs

  • SpanContext

  • Refrences

Tags

Tags 是一个 K/V类型的键值对,用户可以自定义该标签,但是 value只能是 string类型。主要用于链路追踪结果对查询和过滤。需要注意的是, tags不会传递给下一个 span调用,即仅自己可见。

span.SetTag("http_code":"400")
span.SetTag("http_method":"GET")
Logs

Logs 也是一个 K/V类型的键值对,主要是用来存储时间发生时间,value的类型没有做限制。

span.LogFields(
log.String("database","mysql"),
log.Int("used_time":5),
log.Int("start_ts":1596335100),
)



更多 opentracing用法请参考官方 github



SpanContext

SpanContexxt 携带一些宽服务通信的数据:

  • 任何需要跨进程 Span关联的,依赖于 OpenTracing 实现状态 (例如 trace_id 和 span_id)

  • K/V类型的键值对 Baggage Items,baggage是全局范围,跨进程保持传递。

Refrences

Refrences 是该 span 对一个或者多个 span的引用。存在两种引用关系 CHildOf 和 FollowFrom

  • ChildOf : 父 span的执行依赖于子 span的执行结果,如需要等待返回的事件,如 http请求等。

  • FollowFrom 父 span的执行不依赖子 span的执行结果,通常采用异步调用表示,如消息队列 consumer与 producer。



3.Trance

Trace 表示一次完整的追踪链路,trace由一个或多个 span组成。下面用 Jaeger可视化出来的一个 Trace来展示一次调用链所追踪的所有 span:

下面用时间线来展示这个 trace:

图片来源于 Jaeger文档手册

Jaeger

Jaeger 是 Uber 开源的分布式追踪系统,是遵循 Opentracing标准。

图片为 Jaeger官方系统框架图



参考

Opentracing

Go集成Opentracing(分布式链路监控)

发布于: 2020 年 08 月 02 日阅读数: 294
用户头像

是老郭啊

关注

一位头发日渐稀疏的 90后 IT男 2020.04.07 加入

当你焦虑大于努力时,你将沦为焦虑本身。

评论

发布
暂无评论
基于 opentracing + Jaeger 实现全链路追踪 ----理论部分