首页 > 其他分享 >Traces

Traces

时间:2022-11-30 18:45:04浏览次数:61  
标签:Span 04 Trace 跟踪 Context span Traces

跟踪为我们提供了用户或应用程序发出请求时发生的情况的全貌

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中,它们包括以下信息:

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浏览器中的两种情况:

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

Span最好用于第一种场景,因为它是一个有开始和结束的操作。

Span Event 最好用于跟踪第二个场景,因为它代表一个有意义的单一时间点。

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

相关文章