跳转至

传播

传播是在服务和进程之间移动数据的机制。虽然不限于跟踪,但它允许跟踪构建关于系统的 因果信息,这些信息可以跨任意分布在进程和网络边界上的服务。

使用插装库进行上下文传播

对于绝大多数用例,上下文传播是通过插装库完成的。

例如,如果你有几个通过 HTTP 通信的 Node.js 服务,你可以使 用[express]和[http]插装库在服务之间自动传播跟踪上下文。

强烈建议您使用插装库来传播上下文。 虽然可以手动传播上下文,但如果您的系统使 用插装库在服务之间进行通信,请使用匹配的插装库来传播上下文。

参考插装库了解更多关于插装库以及如何使用它们的信息。

手动 W3C 跟踪上下文传播

在某些情况下,不可能使用检测库传播上下文。可能没有与您用来使服务相互通信的库匹配 的插装库。或者您可能有一些需求是插装库无法满足的,即使它们存在。

当你必须手动传播上下文时,你可以使用上下文 api

下面的通用示例演示了如何手动传播跟踪上下文。

首先,在发送服务中,你需要注入当前的context:

// Sending service
import { context, propagation, trace } from '@opentelemetry/api';
const output = {};

// Serialize the traceparent and tracestate from context into
// an output object.
//
// This example uses the active trace context, but you can
// use whatever context is appropriate to your scenario.
propagation.inject(context.active(), output);

const { traceparent, tracestate } = output;
// You can then pass the traceparent and tracestate
// data to whatever mechanism you use to propagate
// across services.

在接收服务上,您需要提取context(例如,从解析过的 HTTP 标头中),然后将它们设置 为当前跟踪上下文。

// Receiving service
import { context, propagation, trace } from '@opentelemetry/api';

// Assume "input" is an object with 'traceparent' & 'tracestate' keys
const input = {};

// Extracts the 'traceparent' and 'tracestate' data into a context object.
//
// You can then treat this context as the active context for your
// traces.
let activeContext = propagation.extract(context.active(), input);

let tracer = trace.getTracer('app-name');

let span = tracer.startSpan(
  spanName,
  {
    attributes: {},
  },
  activeContext
);

// Set the created span as active in the deserialized context.
trace.setSpan(activeContext, span);

从那里,当您有一个反序列化的活动上下文时,您可以创建 spans,这些 spans 将成为来 自其他服务的相同跟踪的一部分。

你也可以使用上下文 API 以其他方式修改或设置反序列化的上下文。