关于java:Opentracing规范介绍

15次阅读

共计 4793 个字符,预计需要花费 12 分钟才能阅读完成。

概述

微服务提供了一个弱小的架构,但也有其本身的挑战,特地是在调试和察看跨简单网络的分布式事务方面——这只是因为没有内存调用或堆栈跟踪来实现这一点。
这就是分布式跟踪呈现的中央。分布式跟踪提供了形容和剖析跨过程事务的解决方案。在谷歌的 Dapper 文章中形容的分布式跟踪的一些用例包含异样检测、诊断稳固状态问题、分布式剖析、资源属性和微服务的工作负载建模。

分布式跟踪

  1. 跟踪: 事务在分布式系统中挪动时的形容。
  2. Span: 一个命名的定时操作,示意工作流的一部分。跨度承受 key:value 标签以及附加到特定跨度实例的细粒度、工夫戳和结构化日志。
  3. 跨上下文: 随同分布式事务的跟踪信息,包含通过网络或音讯总线将服务传递到服务的工夫。跨度上下文蕴含跟踪标识符、跨度标识符和跟踪零碎须要流传到上游服务的任何其余数据。

四大板块
从应用层分布式跟踪零碎的角度来看,古代软件系统看起来像上面的图表:

古代软件系统中的组件能够分为三类:

  • 应用程序和业务逻辑: 您的代码。
  • 宽泛共享的库: 其他人的代码。
  • 宽泛共享服务: 其他人的基础设施。
    这三个组件有不同的需要,并驱动分布式跟踪零碎的设计,后者的工作是监督应用程序。最终的设计产生了四个重要局部:
  • 跟踪插装 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 计划。

  1. OpenTracing 语义标准是对以后泛语言 OpenTracing 规范的版本形容
  2. 语义约定标准形容了通用语义场景的传统跨标记和日志键
    两个文件都进行了版本控制,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
正文完
 0