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

Vercel托管NextJS应用通过自定义OTEL Collector向Datadog发Trace失败求助

Vercel Next.js 自定义OTEL Collector 链路追踪问题排查

问题背景

过去一周尝试在Vercel托管的Next.js应用中,通过自定义OTEL Collector向Datadog发送OpenTelemetry数据,但目前仅能在Datadog看到无Trace ID的错误日志,本地控制台的OTEL Span完全未同步。联系Vercel支持后得到回复:该功能处于私有测试阶段,即便使用自定义OTEL导出器也无法正常工作,因为Vercel侧的数据转发设置尚未对所有客户开放。

疑问:这似乎违背了OpenTelemetry厂商无关性的核心优势,难道非New Relic/Datadog(后者仅面向企业客户)就无法在Vercel上实现链路追踪?求助是否有人成功在Vercel上结合自定义Collector实现OTEL instrumentation?

附当前代码(instrumentation.ts)

import { OTLPHttpJsonTraceExporter, registerOTel } from '@vercel/otel';

export async function register() {
  registerOTel({
    serviceName: 'my-service',
    traceExporter: new OTLPHttpJsonTraceExporter({
      url: 'url-to-the-custom-collector',
    }),
  });
}

操作与结果

  • 操作:通过自定义OTEL Collector向Datadog发送OTEL追踪数据及Span
  • 预期:在Datadog中查看完整的OTEL追踪数据及Span
  • 实际:仅显示少量无Trace ID的错误日志,本地OTEL追踪数据未同步
  • 错误日志说明:Datadog中显示的错误日志无关联Trace ID,无法对应到本地的OTEL Span

可能的排查与解决方向

1. 确认Vercel OTEL权限

Vercel官方的自定义OTEL导出器支持目前确实处于私有测试阶段,仅对部分用户开放:

  • 直接向Vercel support提交工单,申请加入私有测试队列
  • 升级@vercel/otel到最新版本(npm install @vercel/otel@latest),新版本可能包含针对部分用户的灰度更新

2. 检查自定义Collector配置

确保你的OTEL Collector能正确接收并转发数据:

  • 验证Collector的端点URL可被Vercel网络访问(Vercel部署的应用可能受限于出站网络,需确保Collector公网可达或配置VPC对等连接)
  • 确认Collector的Datadog Exporter配置正确,示例片段:
exporters:
  datadog:
    api:
      key: ${DD_API_KEY}
      site: datadoghq.com
  • 查看Collector的运行日志,确认是否收到Vercel发送的Span数据。如果日志中无相关条目,大概率是Vercel侧未转发,需回到第一步确认权限

3. 绕过Vercel封装,手动配置OTEL

如果@vercel/otel的限制无法突破,可尝试原生OTEL配置:

  • 安装依赖:
npm install @opentelemetry/sdk-trace-node @opentelemetry/exporter-trace-otlp-http @opentelemetry/auto-instrumentations-node @opentelemetry/resources @opentelemetry/semantic-conventions
  • 修改instrumentation.ts为手动配置:
import { NodeTracerProvider, BatchSpanProcessor } from '@opentelemetry/sdk-trace-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { registerInstrumentations } from '@opentelemetry/instrumentation';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { Resource } from '@opentelemetry/resources';
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';

export async function register() {
  const tracerProvider = new NodeTracerProvider({
    resource: new Resource({
      [SemanticResourceAttributes.SERVICE_NAME]: 'my-service',
    }),
  });

  const exporter = new OTLPTraceExporter({
    url: 'url-to-the-custom-collector',
  });

  tracerProvider.addSpanProcessor(new BatchSpanProcessor(exporter));
  tracerProvider.register();

  registerInstrumentations({
    instrumentations: [getNodeAutoInstrumentations()],
  });
}

注意:这种方式需要确认Vercel的运行环境支持原生OTEL,部分边缘函数环境可能存在限制,需测试验证

4. 临时替代:日志关联Trace ID

如果暂时无法同步Span,可通过手动注入Trace ID实现基础关联:

  • 在业务代码中获取当前Trace ID:
import { trace, context } from '@opentelemetry/api';

const currentSpan = trace.getSpan(context.active());
const traceId = currentSpan?.spanContext().traceId;
  • 将Trace ID添加到所有日志输出中
  • 在Datadog中通过Trace ID搜索,关联错误日志与本地Span数据

内容的提问来源于stack exchange,提问作者Antti Hyppola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 00:49:56