概述
微服务提供了一个弱小的架构,但也有其本身的挑战,特地是在调试和察看跨简单网络的分布式事务方面——这只是因为没有内存调用或堆栈跟踪来实现这一点。
这就是分布式跟踪呈现的中央。分布式跟踪提供了形容和剖析跨过程事务的解决方案。在谷歌的Dapper文章中形容的分布式跟踪的一些用例包含异样检测、诊断稳固状态问题、分布式剖析、资源属性和微服务的工作负载建模。
分布式跟踪
- 跟踪:事务在分布式系统中挪动时的形容。
- Span:一个命名的定时操作,示意工作流的一部分。跨度承受key:value标签以及附加到特定跨度实例的细粒度、工夫戳和结构化日志。
- 跨上下文:随同分布式事务的跟踪信息,包含通过网络或音讯总线将服务传递到服务的工夫。跨度上下文蕴含跟踪标识符、跨度标识符和跟踪零碎须要流传到上游服务的任何其余数据。
四大板块
从应用层分布式跟踪零碎的角度来看,古代软件系统看起来像上面的图表:
古代软件系统中的组件能够分为三类:
- 应用程序和业务逻辑:您的代码。
- 宽泛共享的库:其他人的代码。
- 宽泛共享服务:其他人的基础设施。
这三个组件有不同的需要,并驱动分布式跟踪零碎的设计,后者的工作是监督应用程序。最终的设计产生了四个重要局部: - 跟踪插装API:装璜利用程序代码的内容。
- 有线协定:在RPC申请中与应用程序数据一起发送的内容。
- 数据协定:异步(带外)发送到剖析零碎的内容。
- 剖析零碎:用于解决跟踪数据的数据库和交互式UI。
OpenTracing是如何适应的呢?
OpenTracing API为检测提供了一个规范的、与供应商无关的框架。这意味着,如果开发人员想要尝试不同的分布式跟踪零碎,那么与其为新的分布式跟踪零碎反复整个检测过程,开发人员能够简略地更改跟踪器的配置。
什么是分布式跟踪?
分布式跟踪,也称为分布式申请跟踪,是一种用于剖析和监督应用程序的办法,特地是那些应用微服务体系结构构建的应用程序。分布式跟踪有助于查明故障产生的地位以及导致性能低下的起因。
谁应用分布式跟踪?
- IT和DevOps团队能够应用分布式跟踪来监控应用程序。分布式跟踪特地适宜于调试和监督古代分布式软件体系结构,比方微服务。
- 开发人员能够应用分布式跟踪来帮忙调试和优化他们的代码。
OpenTracing是什么?
从OpenTracing不是什么开始可能会更容易了解一些。
- OpenTracing不是下载或程序。分布式跟踪要求软件开发人员向应用程序的代码或应用程序中应用的框架中增加检测工具。
- OpenTracing不是一个规范。Cloud Native Computing Foundation(CNCF)不是一个官网的规范机构。OpenTracing API我的项目致力于为分布式跟踪创立更多标准化的API和工具。
OpenTracing由API标准、实现了标准的框架和库以及我的项目文档组成。OpenTracing容许开发人员应用api向他们的利用程序代码中增加检测,而不会将他们锁定在任何特定的产品或供应商中。无关OpenTracing曾经在何处实现的更多信息,请参阅反对OpenTracing标准的语言列表和跟踪程序列表。
概念和术语
所有特定于语言的OpenTracing api共享一些外围概念和术语。这些概念对于我的项目来说是如此的核心和重要,以至于它们有本人的存储库(github.com/opentracing/specification)和semver计划。
- OpenTracing语义标准是对以后泛语言OpenTracing规范的版本形容
- 语义约定标准形容了通用语义场景的传统跨标记和日志键
两个文件都进行了版本控制,GitHub存储库依据版本控制策略形容的规定进行了标记。
Spans
“span”是分布式跟踪的次要构建块,示意在分布式系统中实现的单个工作单元。
分布式系统的每个组件都奉献一个span——一个命名的、计时的操作,示意工作流的一部分。
跨能够(通常也的确)蕴含对其余跨的“援用”,这容许将多个跨组装成一个残缺的跟踪——申请在分布式系统中挪动时的生命周期的可视化。
每个span依据OpenTracing标准封装了以下状态:
- 一个操作名称
- 开始工夫戳和完结工夫戳
- 一组键:值范畴标记
- 一组键:值跨度日志
- 一个SpanContext
Tags
Tags是键值对,它反对对跨域进行用户定义的正文,以便查问、筛选和了解跟踪数据。
Span tags应该利用于整个Span,在semantic_conventions.md中有一个列表,列出了用于常见场景的惯例span tags。例如db这样的标签键db.instance来辨认数据库主机,http.status_code示意HTTP响应代码,或者error,如果Span示意的操作失败,能够将其设置为True。
Logs
logs是键值对,对于捕捉特定范畴的日志音讯和应用程序自身的其余调试或信息输入十分有用。日志对于记录跨度内的特定时刻或事件可能很有用(与应该利用于整个跨度的标记相同)。
SpanContext
SpanContext跨流程边界携带数据。具体来说,它有两个次要组成部分:
- 依赖于实现的状态,用于援用跟踪中不同的跨度,即实现跟踪程序的spanID和traceID定义
任何Baggage Items
- 跨流程边界的键值对。
- 对于在整个跟踪过程中有一些可用的数据。
一个span的列子:
t=0 operation name: db_query t=x +-----------------------------------------------------+ | · · · · · · · · · · Span · · · · · · · · · · | +-----------------------------------------------------+Tags:- db.instance:"customers"- db.statement:"SELECT * FROM mytable WHERE foo='bar'"- peer.address:"mysql://127.0.0.1:3306/customers"Logs:- message:"Can't connect to mysql server on '127.0.0.1'(10061)"SpanContext:- trace_id:"abc123"- span_id:"xyz789"- Baggage Items: - special_id:"vsid1738"
Scopes and Threading
介绍
在任何给定的线程中,都有一个“流动”的span,次要负责由四周的利用程序代码实现的工作,称为ActiveSpan。OpenTracing API只容许线程中的一个span在任何工夫点处于活动状态。这是通过作用域来治理的,作用域正式确定了Span的激活和停用。
其余波及同一线程的span将满足以下任一条件:
- Started
- Not finished
- Not “active”
例如,同一线程上能够有多个跨,如果跨是: - 期待I / O
- 子跨度碰壁
- 偏离了要害门路
请留神,如果在开发人员创立一个新的Span时存在一个范畴,那么它将充当它的父Span,除非程序员在buildSpan()时调用ignoreActiveSpan()或显式地指定父上下文。
拜访以后流动的apan
因为手动地将流动范畴从一个函数传递到另一个函数是不不便的,所以OpenTracing要求每个跟踪程序都蕴含一个ScopeManager。ScopeManager API通过作用域授予对流动范畴的拜访权。这意味着开发人员能够通过Scope拜访任何流动的span。
在线程之间挪动span
应用ScopeManager API,开发人员能够在不同的线程之间传输跨。一个Span的生命周期可能从一个线程开始,在另一个线程完结。ScopeManager API容许将Span传输到另一个线程或回调。不反对将作用域传递给另一个线程或回调。无关更多细节,请参考特定于语言的文档。
Tracers
介绍
OpenTracing提供了一个凋谢的、与供应商无关的规范API来形容分布式事务,特地是因果关系、语义和工夫。它提供了一个通用的分布式上下文流传框架,由以下API原语组成:
- 在过程中传递元数据上下文
- 对元数据上下文进行编码和解码,以便在网络上传输元数据,以便进行过程间通信
- 因果关系跟踪:父-子、分叉、连贯
OpenTracing形象了许多跟踪器实现之间的差别。这意味着,不论开发人员应用哪种示踪零碎,检测伎俩都将放弃不变。为了应用OpenTracing标准检测应用程序,必须部署兼容的OpenTracing跟踪程序。所有反对的跟踪器的列表能够在这里找到。
Tracer Interface
跟踪器接口创立spans,并理解如何跨过程边界注入(序列化)和提取(反序列化)元数据。它具备以下性能:
- 开始一个新的Span
- 将SpanContext注入载体
- 从载体中提取SpanContext
上面将更具体地探讨这些问题。为了实现目标,请查看特定的语言指南。
设置Tracer
跟踪器是将记录跨度并将其公布到某处的理论实现。应用程序如何解决理论的跟踪程序取决于开发人员:或者间接在整个应用程序中应用它,或者将它存储在GlobalTracer中,以便于与仪表化框架一起应用。不同的跟踪器实现在初始化时接管参数的形式和内容各不相同,例如:
- 应用程序跟踪的组件名。
- 跟踪端点。
- 跟踪凭证。
- 抽样策略。
一旦取得了跟踪程序实例,就能够应用它手动创立Span,或者将其传递给框架和库的现有检测。为了不强制用户保留跟踪程序,io.opentrace.util工具蕴含一个实现了io.opentrace.Tracer接口的GlobalTracer类,顾名顾义,这个类充当能够在任何中央应用的全局实例。它的工作原理是将所有操作转发到另一个底层跟踪程序,该跟踪程序将在未来的某个点注册,默认状况下,底层跟踪程序是一个no-nop实现。
开始新的跟踪
每当创立新的Span而不援用父Span时,就会启动新的跟踪。在创立一个新的Span时,您须要指定一个“操作名称”,这是一个自在格局的字符串,您能够应用它来帮忙您辨认这个Span所关联的代码。咱们的新跟踪的下一个范畴可能是子范畴,并且能够被看作是在主范畴内执行的子例程的示意。因而,子跨度与父跨度之间存在child-of关系。另一种类型的关系如下所示,用于新跨独立于父跨的非凡状况,例如在异步过程中。
拜访流动的span
能够应用跟踪程序来启用对ActiveSpan的拜访。在某些语言中,activespan也能够通过ScopeManager拜访。无关更多实现细节,请参阅特定语言指南。
应用Inject/Extract流传跟踪
为了在分布式系统中跨流程边界进行跟踪,服务须要可能持续由发送每个申请的客户机注入的跟踪。OpenTracing通过提供将span的上下文编码为载体的注入和提取办法来实现这一点。inject办法容许将SpanContext传递给载体。例如,将跟踪信息传递到客户端申请中,以便发送信息的服务器能够持续跟踪。extract办法的作用正好相同。它从载体中提取SpanContext。例如,如果在客户端有一个流动的申请,开发人员必须应用io.opentracing.Tracer.extract办法提取SpanContext。
实现了opentracing的零碎
追踪零碎 | 反对的语言 |
---|---|
CNCF Jaeger | Java, Go, Python, Node.js, C++, C# |
Datadog | Go |
inspectIT | java |
Instana | Crystal, Go, Java, Node.js, Python, Ruby |
LightStep | Go, Python, JavaScript, Objective-C, Java, PHP, Ruby, C++ |
stagemonitor | java |