基于 opentracing + Jaeger 实现全链路追踪 ---- 理论部分
链路追踪
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调用,即仅自己可见。
Logs
Logs 也是一个 K/V类型的键值对,主要是用来存储时间发生时间,value的类型没有做限制。
更多 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官方系统框架图
参考
版权声明: 本文为 InfoQ 作者【是老郭啊】的原创文章。
原文链接:【http://xie.infoq.cn/article/2a19ef287069f4d51cf0d8070】。文章转载请联系作者。
评论