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
相关产品推荐
相关产品推荐

