Si el entorno de ejecución de su aplicación no es compatible de forma nativa con un SDK de Datadog, puede utilizar el SDK de OpenTelemetry para enviar telemetría a Datadog. Este enfoque le proporciona trazas y métricas sin esperar a que exista compatibilidad nativa con el entorno de ejecución.
Esta guía explica cómo instrumentar una aplicación de Bun como ejemplo. Bun es compatible con la mayoría de las API de Node.js, por lo que puede utilizar el SDK de Node.js de OpenTelemetry para instrumentar aplicaciones de Bun. Puede aplicar el mismo patrón a otros entornos de ejecución no soportados que sean compatibles con el SDK de OpenTelemetry
Nivel de soporte
Esta guía se encuentra bajo el nivel de soporte de Componentes personalizados. Datadog proporciona esta documentación como punto de partida, pero no ofrece soporte directo para la funcionalidad del entorno de ejecución ni para el comportamiento del SDK de OpenTelemetry dentro de este. Para problemas específicos del entorno de ejecución, comuníquese con la comunidad de OpenTelemetry o con los mantenedores del entorno de ejecución.
Requisitos previos
Un backend compatible con OpenTelemetry configurado para enviar datos a Datadog. Consulte Enviar datos de OpenTelemetry a Datadog para conocer las opciones de configuración, incluyendo el colector DDOT, el colector de OpenTelemetry o la ingesta directa de OTLP.
En Node.js, OpenTelemetry normalmente se carga a través del indicador --require, que precarga la instrumentación antes de que se ejecute el código de su aplicación. El sistema de resolución de módulos de Bun funciona de manera diferente, por lo que debe inicializar OpenTelemetry mediante programación.
Cree un archivo tracing.ts que configure el SDK de OpenTelemetry para Node.js:
tracing.ts
import{NodeSDK}from'@opentelemetry/sdk-node';import{getNodeAutoInstrumentations}from'@opentelemetry/auto-instrumentations-node';import{OTLPTraceExporter}from'@opentelemetry/exporter-trace-otlp-http';import{OTLPMetricExporter}from'@opentelemetry/exporter-metrics-otlp-http';import{PeriodicExportingMetricReader}from'@opentelemetry/sdk-metrics';import{resourceFromAttributes}from'@opentelemetry/resources';import{ATTR_SERVICE_NAME,ATTR_SERVICE_VERSION}from'@opentelemetry/semantic-conventions';constresource=resourceFromAttributes({[ATTR_SERVICE_NAME]:process.env.OTEL_SERVICE_NAME||'<YOUR_SERVICE_NAME>',[ATTR_SERVICE_VERSION]:process.env.OTEL_SERVICE_VERSION||'1.0.0','telemetry.sdk.runtime':'bun',});constsdk=newNodeSDK({resource,traceExporter: newOTLPTraceExporter(),metricReaders:[newPeriodicExportingMetricReader({exporter: newOTLPMetricExporter(),})],instrumentations:[getNodeAutoInstrumentations({// Disable fs instrumentation to avoid compatibility issues with Bun
'@opentelemetry/instrumentation-fs':{enabled: false},})],});sdk.start();process.on('SIGTERM',()=>{sdk.shutdown().then(()=>console.log('OpenTelemetry SDK shut down')).catch((err)=>console.error('Error shutting down OpenTelemetry SDK',err)).finally(()=>process.exit(0));});
Reemplace <YOUR_SERVICE_NAME> con el nombre del servicio de su aplicación.
Inicialice la telemetría en el punto de entrada de su aplicación
Importe el módulo tracing.tsantes de cualquier otra importación de la aplicación. El SDK de OpenTelemetry debe inicializarse primero para aplicar parches a las bibliotecas para la instrumentación automática.
index.ts
import'./tracing';// Import your application code after tracing is initialized
import{startApp}from'./app';startApp();
Configure las variables de entorno
Establezca las siguientes variables de entorno para configurar el punto de conexión del exportador OTLP y la identidad de su servicio:
Agregue instrumentación manual para las API nativas de Bun
Las API integradas de Bun, como Bun.serve(), bun:sqlite y las API nativas de E/S de archivos, no se instrumentan automáticamente. Para capturar telemetría de estas API, cree tramos manualmente con el paquete @opentelemetry/api.
El siguiente ejemplo envuelve un controlador de rutas Bun.serve() con un tramo personalizado:
server.ts
import{trace,SpanKind}from'@opentelemetry/api';consttracer=trace.getTracer('bun-app');exportfunctionstartServer() {Bun.serve({port: 3000,fetch(req){returntracer.startActiveSpan('handleRequest',{kind: SpanKind.SERVER},(span)=>{try{span.setAttribute('http.method',req.method);span.setAttribute('http.url',req.url);returnnewResponse('Hello from Bun!');}finally{span.end();}});},});}
Confirme que las trazas aparezcan con los tramos y metadatos esperados.
Limitaciones
Cobertura de instrumentación automática: Las bibliotecas de instrumentación automática de OpenTelemetry para Node.js dependen de la capa de compatibilidad con Node.js de Bun. La mayoría de las bibliotecas comunes (clientes HTTP, Express, controladores de bases de datos) funcionan, pero algunos paquetes de instrumentación podrían no funcionar como se espera.
APIs nativas de Bun: Las APIs integradas de Bun como Bun.serve(), bun:sqlite y las APIs nativas de E/S de archivos no se instrumentan automáticamente. Consulte Agregar instrumentación manual para APIs nativas de Bun para ver un ejemplo.
Compatibilidad de bibliotecas: No se garantiza que todas las bibliotecas de instrumentación de Node.js funcionen con Bun. Pruebe sus dependencias específicas y deshabilite cualquier instrumentación que cause errores pasando opciones de configuración a getNodeAutoInstrumentations(). El paquete @opentelemetry/instrumentation-fs es una fuente común de problemas y está deshabilitado en la configuración de ejemplo anterior.
Lecturas adicionales
Documentación, enlaces y artículos útiles adicionales: