如何从 NodeJS 中的传入 http 请求中手动提取上下文或跨度?

How to manually extract context or span from incoming http request in NodeJS?

我正在尝试将我的 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-clientopentracing?是否可以在没有自动检测的情况下手动创建子跨度?

您可以通过从请求 headers 中提取 parent 上下文并使用它创建 child 跨度来执行上下文传播,如下所示:

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();
});