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

NestJS中OpenTelemetry对接Datadog Agent无追踪数据问题求助

NestJS通过OpenTelemetry向Datadog Agent发送追踪数据失败排查

我在NestJS应用中尝试通过Datadog Agent将OpenTelemetry采集的后端追踪数据发送至Datadog,但追踪代理未接收到任何数据,且NestJS官方文档里找不到相关配置指引。


tracing.ts

import { NodeSDK } from '@opentelemetry/sdk-node';
// import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
import {
  SimpleSpanProcessor,
  ConsoleSpanExporter,
} from '@opentelemetry/tracing';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { Resource } from '@opentelemetry/resources';
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';

const traceExporter = new OTLPTraceExporter({
  url: 'http://localhost:4317/v1/traces',
});

const traceProvider = new NodeTracerProvider({
  resource: new Resource({
    [SemanticResourceAttributes.SERVICE_NAME]: 'RestAPI', //"YOUR-SERVICE-NAME",
  }),
}) as any;

const otelSDK = new NodeSDK({
  instrumentations: [getNodeAutoInstrumentations()],
});

traceProvider.register();

// export spans to console (useful for debugging)
traceProvider.addSpanProcessor(
  new SimpleSpanProcessor(new ConsoleSpanExporter()),
);
// export spans to opentelemetry collector
traceProvider.addSpanProcessor(new SimpleSpanProcessor(traceExporter));

export default otelSDK;

otelSDK
  .start()
  .then(() => {
    console.log('Tracing initialized');
  })
  .catch((error) => console.log('Error initializing tracing', error));

process.on('SIGTERM', () => {
  otelSDK
    .shutdown()
    .then(() => console.log('Tracing terminated'))
    .catch((error) => console.log('Error terminating tracing', error))
    .finally(() => process.exit(0));
});

datadog.yaml

api_key: xvygjhkfklljdsfhdslkhfsd

proxy:
  https: http://Username:password@URL
  http: http://Username:password@URL
  no_proxy:
    - localhost
    - 127.0.0.1

otlp_config:
  receiver:
    protocols:
      grpc:
        endpoint: localhost:4317
      http:
        endpoint: localhost:4318

log: debug

trace-agent.log

2023-03-28 09:11:57 CDT | TRACE | INFO | (run.go:253 in Info) | No data received
2023-03-28 09:11:57 CDT | TRACE | WARN | (run.go:263 in Warnf) | Failed to read pid from /proc/self: readlink /proc/self: no such file or directory. Falling back to os.Getpid

排查与修复方案

1. 修复协议端口不匹配问题

你使用的OTLPTraceExporter是HTTP协议,但配置的URL指向了Datadog Agent的gRPC端口4317,HTTP协议应对应4318端口。修改导出器配置:

const traceExporter = new OTLPTraceExporter({
  url: 'http://localhost:4318/v1/traces',
});

2. 消除重复初始化冲突

代码中同时初始化了NodeTracerProvider和NodeSDK,两者会导致配置冲突。统一用NodeSDK管理所有配置,避免重复注册:

import { NodeSDK } from '@opentelemetry/sdk-node';
import { SimpleSpanProcessor, ConsoleSpanExporter } from '@opentelemetry/tracing';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { Resource } from '@opentelemetry/resources';
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';

const otelSDK = new NodeSDK({
  resource: new Resource({
    [SemanticResourceAttributes.SERVICE_NAME]: 'RestAPI',
  }),
  instrumentations: [getNodeAutoInstrumentations()],
});

otelSDK.start().then(() => {
  const tracerProvider = otelSDK.getTracerProvider();
  // 添加控制台输出用于调试
  tracerProvider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
  // 添加Datadog Agent导出器
  tracerProvider.addSpanProcessor(new SimpleSpanProcessor(new OTLPTraceExporter({
    url: 'http://localhost:4318/v1/traces',
  })));
  console.log('Tracing initialized');
}).catch((error) => console.log('Error initializing tracing', error));

process.on('SIGTERM', () => {
  otelSDK
    .shutdown()
    .then(() => console.log('Tracing terminated'))
    .catch((error) => console.log('Error terminating tracing', error))
    .finally(() => process.exit(0));
});

3. 验证Datadog Agent状态

检查Agent的OTLP接收器是否正常启动,执行命令:

datadog-agent status | grep OTLP

确保输出显示grpc和http接收器已在对应端口监听。

4. 排查网络访问问题

如果应用和Agent不在同一主机(如容器部署),不能直接用localhost,需改用Agent所在的实际网络地址;同时确认no_proxy配置确实不会拦截本地请求。

5. 调试Span生成情况

观察ConsoleSpanExporter的输出,如果控制台没有Span日志,说明Instrumentations未正确加载——检查@opentelemetry/auto-instrumentations-node依赖是否安装,且所有OTel包版本保持兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:35:18