如何向默认的NextJS span添加自定义属性?

问题描述 投票:0回答:1

我正在使用 vercel otel 发送 opentelemetry 跟踪并在 Azure 应用程序见解上监视它们。该项目是 NextJS 14 项目。我启用了检测钩子,因此 NextJS 默认发送跨度,而无需我创建它们。我可以在 Azure 上看到痕迹,一切正常。

我现在想要的是将自定义属性注入到发送的跨度中,以便更好地跟踪。我仍然想使用 NextJS 发送的默认跨度,但在导出之前我也想附加这些属性。 这是我的 Instrumentation.ts 文件。

import type { SpanExporter } from "@opentelemetry/sdk-trace-base";
import { registerOTel } from "@vercel/otel";


export async function register() {
  let traceExporter: SpanExporter | undefined;

  if (process.env.NEXT_RUNTIME === "nodejs") {
    const { AzureMonitorTraceExporter } = await import(
      "@azure/monitor-opentelemetry-exporter"
    );
    traceExporter = new AzureMonitorTraceExporter({
      connectionString: process.env.APP_INSIGHTS_CONNECTION_STRING,
    });
  }

  registerOTel({
    serviceName: process.env.NODE_ENV,
    traceExporter,
  });
}
next.js vercel open-telemetry
1个回答
0
投票

想通了。在导出之前需要一个跨度处理器来操作它。 Vercel otel在文档中没有提及,但我们可以添加一个处理器来注册OTEL。这是修改后的代码。

import type {
  SpanExporter,
  SpanProcessor,
  Span,
  ReadableSpan,
} from "@opentelemetry/sdk-trace-base";

import { registerOTel } from "@vercel/otel";

export async function register() {
  let traceExporter: SpanExporter | undefined;

  if (process.env.NEXT_RUNTIME === "nodejs") {
    const { AzureMonitorTraceExporter } = await import(
      "@azure/monitor-opentelemetry-exporter"
    );
    traceExporter = new AzureMonitorTraceExporter({
      connectionString: process.env.APP_INSIGHTS_CONNECTION_STRING,
    });
  }

  class SpanEnrichingProcessor implements SpanProcessor {
    forceFlush(): Promise<void> {
      return Promise.resolve();
    }

    shutdown(): Promise<void> {
      return Promise.resolve();
    }

    onStart(_span: Span): void {}

    onEnd(span: ReadableSpan) {
      // Add custom dimensions to the span.
      span.attributes["CustomDimension1"] = "value1";
      span.attributes["CustomDimension2"] = "value2";
    }
  }
  let processor = new SpanEnrichingProcessor();

  registerOTel({
    serviceName: process.env.NODE_ENV,
    traceExporter,
    spanProcessors: [processor],
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.