传播
适用于JS SDK的上下文传播
传播是将数据在服务和进程之间传递的机制。尽管不仅限于跟踪,但它使跟踪能够在任意分布在进程和网络边界的服务之间构建系统的因果信息。
使用库进行上下文传播
对于绝大多数用例,上下文传播是通过仪表化库完成的。
例如,如果您有几个通过HTTP进行通信的Node.js服务,您可以使用
express
和 http
仪表化库,以自动传播跟踪上下文。
**强烈建议使用仪表化库进行上下文传播。**虽然您可以手动传播上下文,但如果您的系统使用库在服务之间通信,请使用匹配的仪表化库进行上下文传播。
请参考 库 了解更多关于仪表化库及其用法的信息。
手动传播 W3C Trace Context
在某些情况下,使用仪表化库无法进行上下文传播。可能不存在与您正在使用的库相匹配的仪表化库,因此无法让服务之间进行通信。或者您可能有一些要求,即使有仪表化库也无法满足。
当您必须手动进行上下文传播时,可以使用 context API。
以下是一个通用示例,演示了如何手动传播跟踪上下文。
首先,在发送服务中,您需要注入当前的 context
:
// 发送服务
import { context, propagation, trace } from '@opentelemetry/api';
const output = {};
// 将上下文中的 traceparent 和 tracestate 序列化到一个输出对象中。
//
// 此示例使用活跃的跟踪上下文,但您可以根据您的情况使用任何上下文。
propagation.inject(context.active(), output);
const { traceparent, tracestate } = output;
// 然后,您可以将 traceparent 和 tracestate 的数据传递给您用于在服务之间进行传播的机制。
在接收服务中,您需要提取 context
(例如,从解析的HTTP标头中)然后将其设置为当前的跟踪上下文。
// 接收服务
import { context, propagation, trace } from '@opentelemetry/api';
// 假设 "input" 是一个带有 'traceparent' 和 'tracestate' 键的对象
const input = {};
// 将 'traceparent' 和 'tracestate' 数据提取到一个上下文对象中。
//
// 然后,您可以将此上下文视为跟踪的活跃上下文。
let activeContext = propagation.extract(context.active(), input);
let tracer = trace.getTracer('app-name');
let span = tracer.startSpan(
spanName,
{
attributes: {},
},
activeContext,
);
// 在反序列化的上下文中将创建的 span 设置为活跃 span。
trace.setSpan(activeContext, span);
从这里开始,当您有一个反序列化的活跃上下文时,您可以创建的 span 将成为来自其他服务的相同跟踪的一部分。
您还可以使用上下文 API 以其他方式修改或设置反序列化的上下文。
最后修改 December 10, 2023: translate (a4350d6e)