[ Monitoring ] Opentelemetry
Opentelemetry란 Observability를 구성하는 분산 추적, 매트릭, 로그 수집을 표준화하고 통합적으로 관리하기 위한 CNCF 산하의 오픈 소스 프로젝트입니다. 이에 특정 벤더에 종속되지 않고 다양한 APM/Observability백엔드와 연동이 가능합니다.
Trace, Metric, Log를 하나의 표준 스펙으로 수집 가능하며, 다양한 언어에서 자동으로 애플리케이션 계측이 가능하도록 지원합니다.
즉, OpenTelemetry는 기존의 다양한 벤더별 SDK나 Agent 문제를 해결하고, 하나의 표준화된 방식으로 다양한 백엔드 (예: Jaeger, Tempo, Prometheus, Mimir, Loki 등)로 데이터를 전송할 수 있도록 설계되었습니다.
[ Opentelemetry의 구성요소 ]
Instrumentation : 사용자 애플리케이션 코드에서 Trace, Metric, Log를 생성하는 역할로 수동/자동 방식이 존재합니다. 각 언어별 라이브러리가 존재하며, Opentelemetry SDK, Instrumentation Library로 구성됩니다.
Context Propagation : 서비스 간 호출 시 trace context(tarce ID, span ID)를 HTTP/gRPC 헤더에 담아 다음 서비스로 전달
SDK : 앱 내부에서 Trace, Metric, Log 생성 및 수집하여 Exporter로 전달하며 일반적으로 batch처리하여 주기적으로 보냅니다.
Exporter : 수집한 데이터를 OTLP, Jaeger, Prometheus등으로 내보내는 역할을 합니다.
Opentelemetry Collector : 데이터를 수신 > 처리 > 내보내기 하는 플러그인 기반 구성입니다. (독립 실행형 서비스)
Procotol : OTLP(Opentelemetry Procotol)로 기본 전송 방식은 HTTP, gRPC로 구성되며 Collector 및 백엔드 연동 시 사용합니다
Application
└── Instrumentation (SDK + Auto)
└── Span 생성
└── Exporter → OTLP 전송
└── OpenTelemetry Collector
├── Receiver (OTLP)
├── Processor (batch, filter)
└── Exporter (Tempo, Jaeger 등)
동작 원리는 앱 코드에 SDK혹은 Auto -instrumentation을 적용하여 요청 처리 시 Span객체가 생성되도록 구현합니다. 이후 HTTP헤더에 context가 포함되며 이후 호출되는 서비스도 같은 trace context로 이어지게 됩니다. 앱 내부에서 만든 Span은 Exporter를 통해 OTLP Collector로 전송되고 Collector가 필터링, 변형, 배치 처리 후 원하는 백엔드로 전송하게 됩니다.
# Collector구성 예시
image:
repository: otel/opentelemetry-collector
tag: "0.126.0"
mode: deployment
replicaCount: 1
config:
receivers:
otlp:
protocols:
grpc: {}
http: {}
processors:
batch: {}
exporters:
prometheusremotewrite/mimir:
endpoint: "http://mimir-distributor.monitoring.svc.cluster.local:8080/api/v1/push"
tls:
insecure: true
resource_to_telemetry_conversion:
enabled: true
otlphttp/tempo:
endpoint: "http://tempo.monitoring.svc.cluster.local:4318"
tls:
insecure: true
service:
pipelines:
metrics:
receivers: [otlp]
processors: [batch]
exporters: [prometheusremotewrite/mimir]
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlphttp/tempo]
[ LGTM 스택과의 연동 구조 ]
OpenTelemetry는 LGTM 스택의 Loki(Log), Grafana(시각화), Tempo(Trace), Mimir(Metric)와 직접 연동 가능합니다.
Trace → Tempo
- OTLP를 통해 Span 데이터 전송
- Grafana Tempo는 OpenTelemetry Collector와 OTLP 프로토콜로 연동됨
- Grafana UI에서 Trace 확인 가능
Metrics → Mimir
- Prometheus Exporter 또는 OTLP Metric Exporter 사용
- Collector가 Mimir에 OTLP 또는 Prometheus 포맷으로 전송
Logs → Loki
- 로그 수집은 일반적으로 promtail, fluentbit, vector 등을 사용
- OpenTelemetry에서 log를 OTLP로 Collector에 보내고, Collector가 Loki로 내보내는 설정도 가능
- filelog receiver + loki exporter 플러그인 사용
Opentelemetry Collector를 통해 매트릭과 트레이싱 데이터 전송
- Exporter에서 Mimir로 매트릭 전송, Tempo로 트레이싱 데이터 전송
- Loki에서 확인할 수 있는 로그 데이터에서 trace_id, span_id를 사용하여 Tempo에서 trace, span정보 확인 가능
OpenTelemetry는 LGTM 스택 전체에 메트릭, 트레이스, 로그를 유기적으로 전달하여 완전한 observability 구현을 가능하게 합니다.
애플리케이션 레벨에서 계측만 해두면 Collector를 통해 모든 스택으로 데이터를 유연하게 분배할 수 있으며, Grafana 상에서 Trace와 Log를 넘나드는 분산 추적 기반 디버깅 환경을 완성할 수 있습니다.