OpenTelemetry(OTel)는 분산 시스템의 트레이싱, 메트릭, 로그를 수집·전송하는 벤더 중립적 관찰성 프레임워크다. CNCF 프로젝트로 OpenCensus와 OpenTracing을 통합했다.
세 가지 관찰성 신호
| 신호 | 설명 | 예시 |
|---|
| 트레이스 | 요청의 전체 흐름 추적 | Jaeger, Zipkin |
| 메트릭 | 수치 데이터 집계 | Prometheus, Datadog |
| 로그 | 이벤트 기록 | Loki, Elasticsearch |
아키텍처
애플리케이션
│ SDK (자동/수동 계측)
↓
OTel Collector
│ 파이프라인 (수신→처리→내보내기)
↓
백엔드 (Jaeger / Prometheus / Loki)
Node.js 자동 계측
typescript
import { NodeSDK } from '@opentelemetry/sdk-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter({
url: 'http://otel-collector:4318/v1/traces',
}),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();
수동 스팬 생성
typescript
import { trace, context } from '@opentelemetry/api';
const tracer = trace.getTracer('my-service', '1.0.0');
async function processOrder(orderId: string) {
const span = tracer.startSpan('processOrder');
span.setAttribute('order.id', orderId);
try {
const result = await doWork(orderId);
span.setStatus({ code: SpanStatusCode.OK });
return result;
} catch (err) {
span.recordException(err as Error);
span.setStatus({ code: SpanStatusCode.ERROR });
throw err;
} finally {
span.end();
}
}
OTel Collector 설정
yaml
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 1s
memory_limiter:
limit_mib: 512
exporters:
jaeger:
endpoint: jaeger:14250
prometheus:
endpoint: 0.0.0.0:8889
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [jaeger]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [prometheus]