searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Opentelemetry Traces数据模型介绍

2023-10-30 01:57:52
24
0

Tracer Provider

Tracer Provider(有时称为TracerProvider)是  Tracers 的工厂。在大多数应用程序中,Tracer Provider 会初始化一次,并且其生命周期与应用程序的生命周期相匹配。Tracer Provider 初始化还包括 Resource 和 Exporter 初始化。这通常是使用 OpenTelemetry 进行跟踪的第一步。在某些语言的 SDK 中,已经为您初始化了全局 Tracer Provider。

Tracer

Tracer 创建的跨度包含有关给定操作(例如服务中的请求)所发生情况的更多信息。跟踪器是从跟踪器提供者创建的。

Tracer Exporter

跟踪导出器将跟踪发送给消费者。该使用者可以是用于调试和开发时的标准输出、OpenTelemetry Collector 或您选择的任何开源或供应商后端。

上下文传播

上下文传播是实现分布式跟踪的核心概念。通过上下文传播,Span 可以相互关联并组装成跟踪,无论 Span 是在哪里生成的。我们通过两个子概念来定义上下文传播:上下文和传播。

上下文是一个对象,其中包含发送和接收服务的信息,用于将一个跨度与另一个跨度关联起来,并将其与整个跟踪相关联。例如,如果服务 A 调用服务 B,则服务 A 中 ID 位于上下文中的 Span 将用作服务 B 中创建的下一个 Span 的父 Span。上下文中的跟踪 ID 将用于下一个 Span。也在服务 B 中创建了 Span,这表示该 Span 与服务 A 中的 Span 属于同一跟踪的一部分。

传播是在服务和进程之间移动上下文的机制。它序列化或反序列化上下文对象,并提供要从一个服务传播到另一服务的相关跟踪信息。传播通常由检测库处理,并且对用户来说是透明的,但如果您需要手动传播上下文,则可以使用传播 API。

OpenTelemetry 支持多种不同的上下文格式。OpenTelemetry 跟踪中使用的默认格式称为 W3C TraceContext。每个上下文对象都存储在一个范围中。有关上下文对象的详细信息以及其他可用信息,请参阅跨度上下文。

通过组合上下文和传播,您现在可以组装跟踪。

跨度

跨度代表一个工作或操作单元。Span 是 Traces 的构建块。在 OpenTelemetry 中,它们包含以下信息:

  • 姓名
  • 父跨度 ID(对于根跨度为空)
  • 开始和结束时间戳
  • 跨度上下文
  • 属性
  • 跨度事件
  • 跨度links
  • 跨度状态

样本跨度:

 
{
  "trace_id": "7bba9f33312b3dbb8b2c2c62bb7abe2d",
  "parent_id": "",
  "span_id": "086e83747d0e381e",
  "name": "/v1/sys/health",
  "start_time": "2021-10-22 16:04:01.209458162 +0000 UTC",
  "end_time": "2021-10-22 16:04:01.209514132 +0000 UTC",
  "status_code": "STATUS_CODE_OK",
  "status_message": "",
  "attributes": {
    "net.transport": "IP.TCP",
    "net.peer.ip": "172.17.0.1",
    "net.peer.port": "51820",
    "net.host.ip": "10.177.2.152",
    "net.host.port": "26040",
    "http.method": "GET",
    "http.target": "/v1/sys/health",
    "http.server_name": "mortar-gateway",
    "http.route": "/v1/sys/health",
    "http.user_agent": "Consul Health Check",
    "http.scheme": "http",
    "http.host": "10.177.2.152:26040",
    "http.flavor": "1.1"
  },
  "events": [
    {
      "name": "",
      "message": "OK",
      "timestamp": "2021-10-22 16:04:01.209512872 +0000 UTC"
    }
  ]
}

跨度可以嵌套,正如父跨度 ID 的存在所暗示的那样:子跨度表示子操作。这使得跨度能够更准确地捕获应用程序中完成的工作。

跨度上下文

Span 上下文是每个 Span 上的不可变对象,包含以下内容:

  • 表示该跨度所属跟踪的跟踪 ID
  • Span 的 Span ID
  • 跟踪标志,包含有关跟踪信息的二进制编码
  • 跟踪状态,可以携带特定于供应商的跟踪信息的键值对列表

Span 上下文是 Span 的一部分,与 分布式上下文和 Baggage一起序列化和传播。

由于 Span Context 包含 Trace ID,因此在创建 Span Links时会使用它。

属性

属性是包含元数据的键值对,可用于注释 Span 以携带有关其正在跟踪的操作的信息。

例如,如果跨度跟踪将商品添加到电子商务系统中用户的购物车的操作,则您可以捕获用户的 ID、要添加到购物车的商品的 ID 以及购物车 ID。

属性具有每种语言 SDK 实现的以下规则:

  • 键必须是非空字符串值
  • 值必须是非空字符串、布尔值、浮点值、整数或这些值的数组

此外,还有 语义属性,它们是通常出现在常见操作中的元数据的已知命名约定。尽可能使用语义属性命名很有帮助,以便跨系统标准化常见类型的元数据。

跨度事件

Span 事件可以被视为 Span 上的结构化日志消息(或注释),通常用于表示 Span 持续时间内有意义的奇异时间点。

例如,考虑 Web 浏览器中的两种场景:

  1. 跟踪页面加载
  2. 表示页面何时变为交互式

Span 最适合第一种情况,因为它是一个有开始和结束的操作。

跨度事件最适合跟踪第二种情况,因为它代表一个有意义的单一时间点。

跨度

links的存在使您可以将一个跨度与一个或多个跨度关联起来,从而暗示一种因果关系。例如,假设我们有一个分布式系统,其中一些操作是通过跟踪来跟踪的。

为了响应其中一些操作,附加操作会排队等待执行,但其执行是异步的。我们也可以通过跟踪来跟踪后续操作。

我们希望将后续操作的跟踪与第一个跟踪关联起来,但我们无法预测后续操作何时开始。我们需要关联这两个跟踪,因此我们将使用span links。

您可以将第一条迹线的最后一个span links到第二条迹线中的第一个跨度。现在,它们彼此之间存在着因果关系。

links是可选的,但它是一种将跟踪跨度相互关联的好方法。

跨度状态

状态将附加到跨度。通常,当应用程序代码中存在已知错误(例如异常)时,您将设置跨度状态。跨度状态将被标记为以下值之一:

  • Unset
  • Ok
  • Error

当处理异常时,Span状态可以设置为Error。否则,Span 状态为 Unset 状态。通过将 Span 状态设置为 Unset,处理 Span 的后端现在可以分配最终状态。

跨度类型

创建跨度时,它是ClientServerInternalProducer或之一Consumer。这种跨度类型向跟踪后端提供了有关如何组装跟踪的提示。根据 OpenTelemetry 规范,服务器 Span 的父级通常是远程客户端 Span,客户端 Span 的子级通常是服务器 Span。类似地,消费者 Span 的父级始终是生产者,生产者 Span 的子级始终是消费者。如果未提供,则假定跨度类型是内部的。

有关 SpanKind 的更多信息,请参阅 SpanKind。

客户端

客户端跨度表示同步传出远程调用,例如传出 HTTP 请求或数据库调用。请注意,在这种情况下,“同步”并不是指async/await,而是指它没有排队等待稍后处理的事实。

服务器

服务器跨度表示同步传入远程调用,例如传入 HTTP 请求或远程过程调用。

内部类型

内部跨度表示不跨越流程边界的操作。诸如检测函数调用或 Express 中间件之类的事情可能会使用内部跨度。

生产者

生产者跨度表示创建一个稍后可能会异步处理的作业。它可能是一项远程作业,例如插入作业队列的作业,也可能是由事件侦听器处理的本地作业。

消费者

消费者跨度代表对生产者创建的作业的处理,并且可能在生产者跨度已经结束之后很久才开始。

0条评论
作者已关闭评论
李****强
15文章数
0粉丝数
李****强
15 文章 | 0 粉丝
原创

Opentelemetry Traces数据模型介绍

2023-10-30 01:57:52
24
0

Tracer Provider

Tracer Provider(有时称为TracerProvider)是  Tracers 的工厂。在大多数应用程序中,Tracer Provider 会初始化一次,并且其生命周期与应用程序的生命周期相匹配。Tracer Provider 初始化还包括 Resource 和 Exporter 初始化。这通常是使用 OpenTelemetry 进行跟踪的第一步。在某些语言的 SDK 中,已经为您初始化了全局 Tracer Provider。

Tracer

Tracer 创建的跨度包含有关给定操作(例如服务中的请求)所发生情况的更多信息。跟踪器是从跟踪器提供者创建的。

Tracer Exporter

跟踪导出器将跟踪发送给消费者。该使用者可以是用于调试和开发时的标准输出、OpenTelemetry Collector 或您选择的任何开源或供应商后端。

上下文传播

上下文传播是实现分布式跟踪的核心概念。通过上下文传播,Span 可以相互关联并组装成跟踪,无论 Span 是在哪里生成的。我们通过两个子概念来定义上下文传播:上下文和传播。

上下文是一个对象,其中包含发送和接收服务的信息,用于将一个跨度与另一个跨度关联起来,并将其与整个跟踪相关联。例如,如果服务 A 调用服务 B,则服务 A 中 ID 位于上下文中的 Span 将用作服务 B 中创建的下一个 Span 的父 Span。上下文中的跟踪 ID 将用于下一个 Span。也在服务 B 中创建了 Span,这表示该 Span 与服务 A 中的 Span 属于同一跟踪的一部分。

传播是在服务和进程之间移动上下文的机制。它序列化或反序列化上下文对象,并提供要从一个服务传播到另一服务的相关跟踪信息。传播通常由检测库处理,并且对用户来说是透明的,但如果您需要手动传播上下文,则可以使用传播 API。

OpenTelemetry 支持多种不同的上下文格式。OpenTelemetry 跟踪中使用的默认格式称为 W3C TraceContext。每个上下文对象都存储在一个范围中。有关上下文对象的详细信息以及其他可用信息,请参阅跨度上下文。

通过组合上下文和传播,您现在可以组装跟踪。

跨度

跨度代表一个工作或操作单元。Span 是 Traces 的构建块。在 OpenTelemetry 中,它们包含以下信息:

  • 姓名
  • 父跨度 ID(对于根跨度为空)
  • 开始和结束时间戳
  • 跨度上下文
  • 属性
  • 跨度事件
  • 跨度links
  • 跨度状态

样本跨度:

 
{
  "trace_id": "7bba9f33312b3dbb8b2c2c62bb7abe2d",
  "parent_id": "",
  "span_id": "086e83747d0e381e",
  "name": "/v1/sys/health",
  "start_time": "2021-10-22 16:04:01.209458162 +0000 UTC",
  "end_time": "2021-10-22 16:04:01.209514132 +0000 UTC",
  "status_code": "STATUS_CODE_OK",
  "status_message": "",
  "attributes": {
    "net.transport": "IP.TCP",
    "net.peer.ip": "172.17.0.1",
    "net.peer.port": "51820",
    "net.host.ip": "10.177.2.152",
    "net.host.port": "26040",
    "http.method": "GET",
    "http.target": "/v1/sys/health",
    "http.server_name": "mortar-gateway",
    "http.route": "/v1/sys/health",
    "http.user_agent": "Consul Health Check",
    "http.scheme": "http",
    "http.host": "10.177.2.152:26040",
    "http.flavor": "1.1"
  },
  "events": [
    {
      "name": "",
      "message": "OK",
      "timestamp": "2021-10-22 16:04:01.209512872 +0000 UTC"
    }
  ]
}

跨度可以嵌套,正如父跨度 ID 的存在所暗示的那样:子跨度表示子操作。这使得跨度能够更准确地捕获应用程序中完成的工作。

跨度上下文

Span 上下文是每个 Span 上的不可变对象,包含以下内容:

  • 表示该跨度所属跟踪的跟踪 ID
  • Span 的 Span ID
  • 跟踪标志,包含有关跟踪信息的二进制编码
  • 跟踪状态,可以携带特定于供应商的跟踪信息的键值对列表

Span 上下文是 Span 的一部分,与 分布式上下文和 Baggage一起序列化和传播。

由于 Span Context 包含 Trace ID,因此在创建 Span Links时会使用它。

属性

属性是包含元数据的键值对,可用于注释 Span 以携带有关其正在跟踪的操作的信息。

例如,如果跨度跟踪将商品添加到电子商务系统中用户的购物车的操作,则您可以捕获用户的 ID、要添加到购物车的商品的 ID 以及购物车 ID。

属性具有每种语言 SDK 实现的以下规则:

  • 键必须是非空字符串值
  • 值必须是非空字符串、布尔值、浮点值、整数或这些值的数组

此外,还有 语义属性,它们是通常出现在常见操作中的元数据的已知命名约定。尽可能使用语义属性命名很有帮助,以便跨系统标准化常见类型的元数据。

跨度事件

Span 事件可以被视为 Span 上的结构化日志消息(或注释),通常用于表示 Span 持续时间内有意义的奇异时间点。

例如,考虑 Web 浏览器中的两种场景:

  1. 跟踪页面加载
  2. 表示页面何时变为交互式

Span 最适合第一种情况,因为它是一个有开始和结束的操作。

跨度事件最适合跟踪第二种情况,因为它代表一个有意义的单一时间点。

跨度

links的存在使您可以将一个跨度与一个或多个跨度关联起来,从而暗示一种因果关系。例如,假设我们有一个分布式系统,其中一些操作是通过跟踪来跟踪的。

为了响应其中一些操作,附加操作会排队等待执行,但其执行是异步的。我们也可以通过跟踪来跟踪后续操作。

我们希望将后续操作的跟踪与第一个跟踪关联起来,但我们无法预测后续操作何时开始。我们需要关联这两个跟踪,因此我们将使用span links。

您可以将第一条迹线的最后一个span links到第二条迹线中的第一个跨度。现在,它们彼此之间存在着因果关系。

links是可选的,但它是一种将跟踪跨度相互关联的好方法。

跨度状态

状态将附加到跨度。通常,当应用程序代码中存在已知错误(例如异常)时,您将设置跨度状态。跨度状态将被标记为以下值之一:

  • Unset
  • Ok
  • Error

当处理异常时,Span状态可以设置为Error。否则,Span 状态为 Unset 状态。通过将 Span 状态设置为 Unset,处理 Span 的后端现在可以分配最终状态。

跨度类型

创建跨度时,它是ClientServerInternalProducer或之一Consumer。这种跨度类型向跟踪后端提供了有关如何组装跟踪的提示。根据 OpenTelemetry 规范,服务器 Span 的父级通常是远程客户端 Span,客户端 Span 的子级通常是服务器 Span。类似地,消费者 Span 的父级始终是生产者,生产者 Span 的子级始终是消费者。如果未提供,则假定跨度类型是内部的。

有关 SpanKind 的更多信息,请参阅 SpanKind。

客户端

客户端跨度表示同步传出远程调用,例如传出 HTTP 请求或数据库调用。请注意,在这种情况下,“同步”并不是指async/await,而是指它没有排队等待稍后处理的事实。

服务器

服务器跨度表示同步传入远程调用,例如传入 HTTP 请求或远程过程调用。

内部类型

内部跨度表示不跨越流程边界的操作。诸如检测函数调用或 Express 中间件之类的事情可能会使用内部跨度。

生产者

生产者跨度表示创建一个稍后可能会异步处理的作业。它可能是一项远程作业,例如插入作业队列的作业,也可能是由事件侦听器处理的本地作业。

消费者

消费者跨度代表对生产者创建的作业的处理,并且可能在生产者跨度已经结束之后很久才开始。

文章来自个人专栏
可观测
15 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0