OpenTelemetry

데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약
observability tracing metrics 2026.03 DevOps · 인프라

📋 목차

  1. OpenTelemetry란?
  2. 왜 써야 하는가?
  3. 핵심 개념
  4. 퀵스타트
  5. 핵심 설정 레퍼런스
  6. 실무 팁 & 트러블슈팅
  7. 참고 자료

1. OpenTelemetry란?

OpenTelemetry (OTel) 은 클라우드 네이티브 소프트웨어의 관측 가능성(observability)을 위한 표준화된 프레임워크이자 CNCF 인큐베이팅 프로젝트입니다. 하나의 에이전트/라이브러리로 트레이스, 메트릭, 로그를 수집하여 벤더 중립적으로 내보낼 수 있습니다.

🔍 트레이스 (Tracing)

요청의 종단 간 흐름을 추적. 분산 시스템에서 지연 병목과 오류 지점을 식별합니다.

📊 메트릭 (Metrics)

CPU, 메모리, 요청률, 에러율 등 수집. Prometheus 호환, 사용자 정의 메트릭 지원.

📄 로그 (Logs)

구조화된 로그 수집 및 상관관계. 트레이스 ID와 연결하여 디버깅 가속화.

3대 핵심 능력 — 단일 SDK로 트레이스, 메트릭, 로그를 통합. 백엔드 (Jaeger, Prometheus, Datadog 등)로 자유롭게 내보내기.

2. 왜 써야 하는가?

기존 모니터링 도구 대비 OpenTelemetry의 차별점:

영역OpenTelemetry기존 (Jaeger/Prometheus SDK 등)
벤더 종속완전히 벤더 중립 (Exporter 교체)특정 백엔드에 강결합
신호 통합트레이스+메트릭+로그 단일 SDK별도 라이브러리/에이전트 필요
표준화W3C Trace Context, OTLP 프로토콜사설 프로토콜, 변환 오버헤드
커뮤니티CNCF, 40+ 벤더, 활성 생태계단일 벤더 의존

⚠️ Legacy SDK 대비 이점 — 마이그레이션 비용이 있지만, 장기적인 유연성과 표준화로 인프라 엔지니어에게 필수 도구로 자리잡고 있습니다.

3. 핵심 개념

OpenTelemetry 아키텍처는 크게 API, SDK, Collector, Exporter로 구성됩니다.

┌─────────────────────────────────────────────────────────┐ │ Application │ │ ┌──────────┐ ┌──────────┐ ┌───────────────────┐ │ │ │ Tracer │ │ Meter │ │ Logger (API/SDK) │ │ │ └────┬─────┘ └────┬─────┘ └────────┬──────────┘ │ │ │ │ │ │ │ └──────────────┼───────────────────┘ │ │ │ OTLP / HTTP / gRPC │ │ ┌───────▼────────┐ │ │ │ OpenTelemetry │ │ │ │ Collector │ │ │ └───────┬────────┘ │ │ │ OTLP / exporters │ │ ┌────────────┼─────────────┐ │ │ ▼ ▼ ▼ │ │ Jaeger Prometheus Datadog / etc. │ └─────────────────────────────────────────────────────────┘

4. 퀵스타트

Python 기준, 5분 안에 트레이스와 메트릭을 수집해보세요.

4.1 설치

pip install opentelemetry-sdk \
  opentelemetry-exporter-otlp-proto-grpc \
  opentelemetry-instrumentation-flask \
  opentelemetry-api

4.2 기본 설정 (Python)

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!")

4.3 Collector 실행 (Docker)

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 환경변수로 엔드포인트를 간편하게 설정할 수 있습니다.

5. 핵심 설정 레퍼런스

환경변수 / 설정기본값설명
OTEL_SERVICE_NAMEunknown_service서비스 식별자 (트레이스/메트릭에 태깅)
OTEL_EXPORTER_OTLP_ENDPOINThttp://localhost:4317OTLP gRPC 엔드포인트
OTEL_TRACES_SAMPLERparentbased_always_on샘플링 전략 (always_on, traceidratio 등)
OTEL_METRICS_EXPORTERotlp메트릭 익스포터 (otlp, prometheus, none)
OTEL_PYTHON_LOG_CORRELATIONfalse로그-트레이스 상관관계 활성화

Collector 설정은 YAML로 세밀하게 제어: receivers, processors, exporters 파이프라인 구성.

6. 실무 팁 & 트러블슈팅

🔥 자주 겪는 문제 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를 추가하여 안정적인 수집을 보장하세요.

7. 참고 자료

📘 추가 학습 — opentelemetry-instrumentation 자동 계측, OTLP 내보내기, 커스텀 메트릭 작성법은 공식 예제를 참고하세요.