Tracer Provider
Tracer Provider(有时称为TracerProvider
)是 Tracer
s 的工厂。在大多数应用程序中,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 浏览器中的两种场景:
- 跟踪页面加载
- 表示页面何时变为交互式
Span 最适合第一种情况,因为它是一个有开始和结束的操作。
跨度事件最适合跟踪第二种情况,因为它代表一个有意义的单一时间点。
跨度
links的存在使您可以将一个跨度与一个或多个跨度关联起来,从而暗示一种因果关系。例如,假设我们有一个分布式系统,其中一些操作是通过跟踪来跟踪的。
为了响应其中一些操作,附加操作会排队等待执行,但其执行是异步的。我们也可以通过跟踪来跟踪后续操作。
我们希望将后续操作的跟踪与第一个跟踪关联起来,但我们无法预测后续操作何时开始。我们需要关联这两个跟踪,因此我们将使用span links。
您可以将第一条迹线的最后一个span links到第二条迹线中的第一个跨度。现在,它们彼此之间存在着因果关系。
links是可选的,但它是一种将跟踪跨度相互关联的好方法。
跨度状态
状态将附加到跨度。通常,当应用程序代码中存在已知错误(例如异常)时,您将设置跨度状态。跨度状态将被标记为以下值之一:
Unset
Ok
Error
当处理异常时,Span状态可以设置为Error。否则,Span 状态为 Unset 状态。通过将 Span 状态设置为 Unset,处理 Span 的后端现在可以分配最终状态。
跨度类型
创建跨度时,它是Client
、Server
、Internal
、Producer
或之一Consumer
。这种跨度类型向跟踪后端提供了有关如何组装跟踪的提示。根据 OpenTelemetry 规范,服务器 Span 的父级通常是远程客户端 Span,客户端 Span 的子级通常是服务器 Span。类似地,消费者 Span 的父级始终是生产者,生产者 Span 的子级始终是消费者。如果未提供,则假定跨度类型是内部的。
有关 SpanKind 的更多信息,请参阅 SpanKind。
客户端
客户端跨度表示同步传出远程调用,例如传出 HTTP 请求或数据库调用。请注意,在这种情况下,“同步”并不是指async/await
,而是指它没有排队等待稍后处理的事实。
服务器
服务器跨度表示同步传入远程调用,例如传入 HTTP 请求或远程过程调用。
内部类型
内部跨度表示不跨越流程边界的操作。诸如检测函数调用或 Express 中间件之类的事情可能会使用内部跨度。
生产者
生产者跨度表示创建一个稍后可能会异步处理的作业。它可能是一项远程作业,例如插入作业队列的作业,也可能是由事件侦听器处理的本地作业。
消费者
消费者跨度代表对生产者创建的作业的处理,并且可能在生产者跨度已经结束之后很久才开始。