我试图将我的Node.js
应用程序从jaeger-client
迁移到@opentelemetry/*
包
在我的Node.js
应用程序中,我有一个简单的http服务器,我想在每个响应上创建跨度。
对于jaeger-client
,我是这样做的:
import { FORMAT_HTTP_HEADERS } from 'opentracing';
import { initTracerFromEnv } from 'jaeger-client';
const tracer = initTracerFromEnv(/* some options here */);
// app is expressjs app
app.get('/home', req => {
const rootSpan = tracer.startSpan('response', {
childOf: tracer.extract(FORMAT_HTTP_HEADERS, req.headers),
});
// ...make child spans of rootSpan
});
我想连接我的根跨度的响应与跨度从其他应用程序,执行请求到我的Node.js
应用服务器。和jaeger-client
差不多。
我怎么能使它与OpenTelemetry而不是jeager-client
和opentracing
?是否有可能手动创建子跨度,而不进行自动检测?
您可以通过从请求头中提取父上下文并使用它创建子跨度来进行上下文传播,如下所示:
const opentelemetry = require('@opentelemetry/api');
const {SpanKind, ROOT_CONTEXT} = require("@opentelemetry/api");
app.get('/home', req => {
// Get incoming context from headers
const remoteCtx = opentelemetry.propagation.extract(ROOT_CONTEXT, req.headers);
// ...make child spans of remoteSpan
// Create child span passing parent context
const childSpan = tracer.startSpan(
'childSpan',
remoteCtx
);
// ... Do important stuff
// End the span
childSpan.end();
});