애플리케이션의 런타임이 Datadog SDK에서 기본적으로 지원되지 않는 경우, OpenTelemetry SDK를 사용하여 Datadog으로 텔레메트리를 보낼 수 있습니다. 이 접근 방식을 사용하면 기본 런타임 지원을 기다릴 필요 없이 트레이스와 메트릭을 얻을 수 있습니다.
이 가이드에서는 예시로 Bun 애플리케이션을 계측하는 방법을 살펴봅니다. Bun은 대부분의 Node.js API와 호환되므로 OpenTelemetry Node.js SDK를 사용하여 Bun 애플리케이션을 계측할 수 있습니다. OpenTelemetry SDK와 호환되는 다른 지원되지 않는 런타임에도 동일한 패턴을 적용할 수 있습니다.
지원 수준
이 가이드는 사용자 지정 구성 요소지원 수준에 해당합니다. Datadog은 이 문서를 시작점으로 제공하지만, 런타임의 기능이나 그 안에서 OpenTelemetry SDK의 동작을 직접 지원하지는 않습니다. 런타임 관련 이슈는 OpenTelemetry 커뮤니티 또는 런타임 관리자에게 문의하세요.
전제 조건
Datadog으로 데이터를 보내도록 구성된 OpenTelemetry 호환 백엔드. DDOT Collector, OpenTelemetry Collector 또는 직접 OTLP ingest를 포함한 설정 옵션은 Send OpenTelemetry Data to Datadog를 참조하십시오.
Node.js에서 OpenTelemetry는 일반적으로 --require 플래그를 통해 로드되며, 이때 애플리케이션 코드가 실행되기 전에 계측을 미리 로드합니다. Bun의 모듈 확인 시스템은 다르게 작동하므로 대신 프로그래밍 방식으로 OpenTelemetry를 초기화해야 합니다.
OpenTelemetry Node.js SDK를 구성하는 tracing.ts 파일을 만듭니다:
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));});
<YOUR_SERVICE_NAME>을 애플리케이션의 서비스 이름으로 바꿉니다.
애플리케이션 진입점에서 텔레메트리 초기화
tracing.ts 모듈을 다른 애플리케이션이 가져오기 전에 먼저 가져옵니다. 자동 계측을 위해 라이브러리를 패치하려면 OpenTelemetry SDK가 먼저 초기화되어야 합니다.
index.ts
import'./tracing';// Import your application code after tracing is initialized
import{startApp}from'./app';startApp();
자동 계측 적용 범위: OpenTelemetry Node.js 자동 계측 라이브러리는 Bun의 Node.js 호환성 계층을 사용합니다. 가장 일반적인 라이브러리(HTTP 클라이언트, Express, 데이터베이스 드라이버)는 작동하지만 일부 계측 패키지는 예상대로 작동하지 않을 수 있습니다.
Bun 네이티브 API: Bun.serve(), bun:sqlite 및 네이티브 파일 I/O API와 같은 내장 Bun API는 자동으로 계측되지 않습니다. 예시는 Bun 네이티브 API에 대한 수동 계측 추가를 참조하세요.
라이브러리 호환성: 모든 Node.js 계측 라이브러리가 Bun에서 작동한다고 보장할 수는 없습니다. 특정 종속성을 테스트하고 getNodeAutoInstrumentations()에 구성 옵션을 전달하여 오류를 일으키는 계측을 비활성화합니다. @opentelemetry/instrumentation-fs 패키지는 이슈의 일반적인 소스이므로 위의 예시 구성에서는 비활성화되어 있습니다.