跟踪为我们提供了用户或应用程序发出请求时发生的情况的全貌
Tracing in OpenTelemetry
跟踪为我们提供了用户或应用程序发出请求时发生的情况的全貌。OpenTelemetry 通过跟踪我们的微服务和相关应用程序,为我们在生产中的代码实现可观测性提供了一种方法。
Sample Trace:
{ "name": "Hello-Greetings", "context": { "trace_id": "0x5b8aa5a2d2c872e8321cf37308d69df2", "span_id": "0x5fb397be34d26b51", }, "parent_id": "0x051581bf3cb55c13", "start_time": "2022-04-29T18:52:58.114304Z", "end_time": "2022-04-29T18:52:58.114435Z", "attributes": { "http.route": "some_route1" }, "events": [ { "name": "hey there!", "timestamp": "2022-04-29T18:52:58.114561Z", "attributes": { "event_attributes": 1 } }, { "name": "bye now!", "timestamp": "2022-04-29T22:52:58.114561Z", "attributes": { "event_attributes": 1 } } ], } { "name": "Hello-Salutations", "context": { "trace_id": "0x5b8aa5a2d2c872e8321cf37308d69df2", "span_id": "0x93564f51e1abe1c2", }, "parent_id": "0x051581bf3cb55c13", "start_time": "2022-04-29T18:52:58.114492Z", "end_time": "2022-04-29T18:52:58.114631Z", "attributes": { "http.route": "some_route2" }, "events": [ { "name": "hey there!", "timestamp": "2022-04-29T18:52:58.114561Z", "attributes": { "event_attributes": 1 } } ], } { "name": "Hello", "context": { "trace_id": "0x5b8aa5a2d2c872e8321cf37308d69df2", "span_id": "0x051581bf3cb55c13", }, "parent_id": null, "start_time": "2022-04-29T18:52:58.114201Z", "end_time": "2022-04-29T18:52:58.114687Z", "attributes": { "http.route": "some_route3" }, "events": [ { "name": "Guten Tag!", "timestamp": "2022-04-29T18:52:58.114561Z", "attributes": { "event_attributes": 1 } } ], }
此示例跟踪输出有三个项目,分别为“Hello Greetings”、“Hello Salutations”和“Hello”。因为每个请求的上下文都具有相同的跟踪ID,所以所有信息都可以绑定在一起。这提供了对请求的各种路由、时间戳和其他属性的跟踪。
为了了解OpenTelemetry中的跟踪是如何工作的,让我们来看看将在检测代码中发挥作用的组件列表:
- Tracer
- Tracer Provider
- Trace Exporter
- Trace Context
Tracer Provider
Tracer Provider(有时称为TracerProvider)是Tracer的工厂。在大多数应用程序中,Tracer Provider初始化一次,其生命周期与应用程序的生命周期匹配。Tracer Provider初始化还包括Resource和Exporter初始化。这通常是使用OpenTelemetry进行跟踪的第一步。在某些语言SDK中,已经为您初始化了全局Tracer Provider。
Tracer
Tracer 创建 spans,其中包含有关给定操作所发生情况的更多信息,例如服务中的请求。Tracers 是从 Tracer Providers 创建的。在某些语言中,已经为您初始化了全局跟踪器。
Trace Exporters
Trace Exporters 向消费者发送跟踪。该使用者可以是 debugging 和 development-time 的标准输出、OpenTelemetry Collector 或您选择的任何开源或供应商后端。
Trace Context
Trace Context 是关于跟踪 spans 的元数据,它提供了跨服务和流程边界的 spans 之间的相关性。例如,假设服务A调用服务B,您希望在跟踪中跟踪该调用。在这种情况下,OpenTelemetry将使用 Trace Context 从服务A捕获跟踪的ID和当前 span,以便在服务B中创建的 span 可以连接并添加到跟踪中。
这就是所谓的上下文传播。
Context Propagation
上下文传播是实现分布式跟踪的核心概念。使用上下文传播,Spans可以相互关联并组装到跟踪中,而不管 Spans 是在哪里生成的。我们通过两个子概念来定义上下文传播:Context和Propagation。
Context 是一个对象,它包含发送和接收服务的信息,以便将一个 span 与另一个相关联,并将其与整个跟踪相关联。
Propagation 是在服务和流程之间移动上下文的机制。通过这样做,它组装了一个分布式跟踪。它序列化或反序列化 Span 上下文,并提供要从一个服务传播到另一个服务的相关跟踪信息。我们现在有了我们所称的:Trace Context.
OpenTelemetry中还有其他形式的 Context 。例如,某些 Context 是W3C TraceContext 规范在span上的实现,在OpenTelemetry中,这称为SpanContext。
我们使用四个主要组件来标识 Span上下文:traceID和spanID、Trace Flags和Trace State
- traceID - 一个唯一的16字节数组,用于标识与 span 关联的跟踪
- spanID - 十六进制编码的8字节数组,用于标识当前范围
- Trace Flags - 提供有关跟踪的详细信息,例如是否对其进行了采样
- Trace State - 为跨多个分布式系统的跟踪提供更多供应商特定的信息。请参考 W3C Trace Context 以获得进一步解释
通过结合Context和Propagation,您现在可以组装跟踪。
For more information, see the traces specification
Spans in OpenTelemetry
Span 表示工作或操作的单位。 Spans 是Traces的构造块。在OpenTelemetry中,它们包括以下信息:
- Name
- Parent span ID (empty for root spans)
- Start and End Timestamps
- Span Context
- Attributes
- Span Events
- Span Links
- Span Status
Sample Span:
{ "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" } ] }
Spans 可以嵌套,正如 parent span ID的存在所暗示的:child spans 表示子操作。这允许 spans 更准确地捕捉应用程序中完成的工作。
Span Context
Span Context是每个Span上的一个不可变对象,包含以下内容:
- 表示 span 所属的跟踪的Trace ID
- The Span’s Span ID
- Trace Flags, 跟踪标志,一种二进制编码,包含有关跟踪的信息
- Trace State, 跟踪状态,可以携带供应商特定跟踪信息的键值对列表
Span Context是与 Distributed Context 和 Baggage 一起序列化和传播的span的一部分。
因为Span Context包含Trace ID,所以在创建 Span Links 时使用它。
Attributes
Attributes 是包含元数据的键值对,您可以使用这些元数据对Span进行注释,以携带有关其正在跟踪的操作的信息。
例如,如果 span 跟踪将商品添加到电子商务系统中用户购物车的操作,则可以捕获用户ID、要添加到购物车的商品ID和购物车ID。
Attributes 在每个语言的SDK实现都有以下规则:
- 键必须是非空字符串值
- 值必须是非空字符串、布尔值、浮点值、整数或这些值的数组
此外,还有语义属性(Semantic Attributes),这是常见操作中通常存在的元数据的已知命名约定。尽可能使用语义属性命名有助于跨系统标准化常见类型的元数据。
Span Events
Span Event 可以被认为是Span上的结构化日志消息(或注释),通常用于表示Span持续时间内有意义的单一时间点。
例如,考虑web浏览器中的两种情况:
- 跟踪页面加载
- 表示页面何时变为交互式
Span最好用于第一种场景,因为它是一个有开始和结束的操作。
Span Event 最好用于跟踪第二个场景,因为它代表一个有意义的单一时间点。
Span Links
Links 的存在,因此您可以将一个span 与一个或多个 span 相关联,从而暗示因果关系。例如,假设我们有一个分布式系统,其中一些操作由跟踪跟踪。
作为对其中一些操作的响应,将有一个附加操作排队等待执行,但其执行是异步的。我们也可以通过跟踪跟踪后续操作。
我们希望将后续操作的跟踪与第一个跟踪相关联,但无法预测后续操作何时开始。我们需要将这两个轨迹关联起来,因此我们将使用 span link。
您可以将第一个跟踪的最后一个 span 链接到第二个跟踪中的第一个span。现在,它们彼此有因果关系。
Links 是可选的,但它是将跟踪span彼此关联的好方法。
Span Status
Span Kind
Client
Server
Internal
Producer
Consumer
标签:Span,04,Trace,跟踪,Context,span,Traces From: https://www.cnblogs.com/zhouyuguang/p/16939409.html