OpenTelemetry (OTel) 은 클라우드 네이티브 소프트웨어의 관측 가능성(observability)을 위한 표준화된 프레임워크이자 CNCF 인큐베이팅 프로젝트입니다. 하나의 에이전트/라이브러리로 트레이스, 메트릭, 로그를 수집하여 벤더 중립적으로 내보낼 수 있습니다.
요청의 종단 간 흐름을 추적. 분산 시스템에서 지연 병목과 오류 지점을 식별합니다.
CPU, 메모리, 요청률, 에러율 등 수집. Prometheus 호환, 사용자 정의 메트릭 지원.
구조화된 로그 수집 및 상관관계. 트레이스 ID와 연결하여 디버깅 가속화.
3대 핵심 능력 — 단일 SDK로 트레이스, 메트릭, 로그를 통합. 백엔드 (Jaeger, Prometheus, Datadog 등)로 자유롭게 내보내기.
기존 모니터링 도구 대비 OpenTelemetry의 차별점:
| 영역 | OpenTelemetry | 기존 (Jaeger/Prometheus SDK 등) |
|---|---|---|
| 벤더 종속 | 완전히 벤더 중립 (Exporter 교체) | 특정 백엔드에 강결합 |
| 신호 통합 | 트레이스+메트릭+로그 단일 SDK | 별도 라이브러리/에이전트 필요 |
| 표준화 | W3C Trace Context, OTLP 프로토콜 | 사설 프로토콜, 변환 오버헤드 |
| 커뮤니티 | CNCF, 40+ 벤더, 활성 생태계 | 단일 벤더 의존 |
⚠️ Legacy SDK 대비 이점 — 마이그레이션 비용이 있지만, 장기적인 유연성과 표준화로 인프라 엔지니어에게 필수 도구로 자리잡고 있습니다.
OpenTelemetry 아키텍처는 크게 API, SDK, Collector, Exporter로 구성됩니다.
Python 기준, 5분 안에 트레이스와 메트릭을 수집해보세요.
pip install opentelemetry-sdk \
opentelemetry-exporter-otlp-proto-grpc \
opentelemetry-instrumentation-flask \
opentelemetry-api
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
# TracerProvider 설정
provider = TracerProvider()
processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="http://localhost:4317"))
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("hello-otel") as span:
span.set_attribute("service.name", "quickstart")
print("Hello OpenTelemetry!")
docker run -d --name otel-collector \
-p 4317:4317 -p 4318:4318 \
-v $(pwd)/otel-collector-config.yaml:/etc/otel/config.yaml \
otel/opentelemetry-collector:latest
💡 팁 — OTEL_EXPORTER_OTLP_ENDPOINT 환경변수로 엔드포인트를 간편하게 설정할 수 있습니다.
| 환경변수 / 설정 | 기본값 | 설명 |
|---|---|---|
OTEL_SERVICE_NAME | unknown_service | 서비스 식별자 (트레이스/메트릭에 태깅) |
OTEL_EXPORTER_OTLP_ENDPOINT | http://localhost:4317 | OTLP gRPC 엔드포인트 |
OTEL_TRACES_SAMPLER | parentbased_always_on | 샘플링 전략 (always_on, traceidratio 등) |
OTEL_METRICS_EXPORTER | otlp | 메트릭 익스포터 (otlp, prometheus, none) |
OTEL_PYTHON_LOG_CORRELATION | false | 로그-트레이스 상관관계 활성화 |
Collector 설정은 YAML로 세밀하게 제어: receivers, processors, exporters 파이프라인 구성.
🔥 자주 겪는 문제 1: Span 누락 — 비동기 컨텍스트 전파 실패. opentelemetry-instrumentation 패키지로 자동 계측을 사용하거나, 수동으로 context를 명시적으로 전달하세요.
🔥 자주 겪는 문제 2: OTLP 연결 오류 — Collector 엔드포인트가 localhost:4317인지 확인. Docker 내부에서 실행 시 host.docker.internal 사용. gRPC vs HTTP 프로토콜 일치 필수.
✅ 실무 팁 — 프로덕션에서는 샘플링을 적용하세요. OTEL_TRACES_SAMPLER=traceidratio + OTEL_TRACES_SAMPLER_ARG=0.1 (10% 샘플링). 비용과 성능을 절감합니다.
✅ 실무 팁 — Collector Pipeline에 batch 프로세서와 memory_limiter를 추가하여 안정적인 수집을 보장하세요.
📘 추가 학습 — opentelemetry-instrumentation 자동 계측, OTLP 내보내기, 커스텀 메트릭 작성법은 공식 예제를 참고하세요.