You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为NextJS默认Span添加自定义属性?

给Next.js默认OpenTelemetry Span注入自定义属性

要在Next.js自动生成的Span中添加自定义属性,无需手动创建Span,只需在导出前通过包装追踪导出器来修改Span数据。以下是修改后的instrumentation.ts实现:

import type { SpanExporter, 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"
    );
    const originalExporter = new AzureMonitorTraceExporter({
      connectionString: process.env.APP_INSIGHTS_CONNECTION_STRING,
    });

    // 包装导出器,在发送至Azure前注入自定义属性
    traceExporter = {
      export: (spans: ReadableSpan[], resultCallback) => {
        spans.forEach(span => {
          // 添加通用环境属性
          span.setAttribute("app_environment", process.env.NODE_ENV || "development");
          span.setAttribute("service_identifier", "nextjs-14-app");

          // 针对路由类Span添加自定义属性
          if (span.attributes["http.route"]) {
            span.setAttribute("custom_route_path", span.attributes["http.route"]);
          }

          // 针对API接口Span添加标识
          if (span.name.startsWith("POST /api/") || span.name.startsWith("GET /api/")) {
            span.setAttribute("api_category", "backend_endpoint");
          }
        });

        originalExporter.export(spans, resultCallback);
      },
      shutdown: (callback) => originalExporter.shutdown(callback),
    };
  }

  registerOTel({
    serviceName: process.env.NODE_ENV,
    traceExporter,
  });
}

关键说明

  • 采用导出器包装的方式,完全保留Next.js自动生成Span的逻辑,仅在数据发送前修改属性
  • 可根据Span的name、attributes等特征,灵活添加针对性的自定义属性,满足不同业务追踪需求
  • 所有属性修改在本地完成,确保最终发送到Azure Application Insights的Span包含自定义字段

内容的提问来源于stack exchange,提问作者Inshal Aamir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:57:43