MSA를 위한 OpenTelemetry 도입
작성일: 2025.04.15
1. 왜 OpenTelemetry인가?
마이크로서비스 아키텍처(MSA)로 전환하면서 시스템은 유연해졌지만, 운영 복잡도는 기하급수적으로 증가했습니다. 서비스 간의 호출 관계가 복잡해지면서 "도대체 어디서 에러가 난 거야?", "어느 구간이 느린 거야?" 를 파악하기가 매우 어려워졌습니다.
기존의 단순 로깅만으로는 분산된 트랜잭션을 추적하기 어렵다고 판단하여, 벤더 중립적이고 표준화된 OpenTelemetry(OTel) 를 도입하여 관측성을 확보하기로 결정했습니다.
2. OpenTelemetry란?
OpenTelemetry는 클라우드 네이티브 소프트웨어의 성능과 동작을 분석하기 위해 Trace(트레이싱), Metric(메트릭), Log(로그) 데이터를 생성, 수집, 내보내는 오픈소스 표준 프레임워크입니다.
핵심 구성 요소
OTel SDK
- 애플리케이션 내부에서 Trace / Metric / Log를 생성하고 처리하는 라이브러리
- Gradle 또는 Maven 등의 빌드 도구를 통해 관련 의존성을 추가해서 간단하게 사용 가능

OTel Collector
- 단순히 트레이스만 받아서 넘기는 애? ❌
- 다양한 소스(앱, 에이전트, 기존 시스템 등)에서 받은 Trace / Metric / Log 데이터를 가공, 필터링, 변환하고, 다양한 백엔드 (Tempo, Jaeger, Prometheus 등)로 중계하는 중간 처리기

Exporter
- Collector 안에 존재하며 데이터를 외부 저장소로 전달하는 역할을 하는 모듈
- SpanData를 최종 백엔드로 내보내는 컴포넌트
- OTLP, Jaeger, Zipkin, Prometheus 등 다양한 포맷 지원
- gRPC / HTTP 기반 전송 방식 선택 가능

3. 아키텍처 구성
프로젝트에서는 다음과 같은 파이프라인을 구축했습니다.
App(Spring Boot) ➡ OTel Collector ➡ Grafana Tempo (Tracing Backend)
- Application: Java Agent를 사용하여 코드 수정 없이 자동 계측(Auto-Instrumentation) 적용
- Collector: 중앙에서 데이터를 받아 필터링 후 저장소로 전송
- Visualization: Grafana와 Tempo를 연동하여 시각화

4. Hands-on
4-1. Spring Boot 설정
별도의 코드 수정 없이 opentelemetry-javaagent.jar를 사용하여 실행 시점에 에이전트를 붙였습니다.
java -javaagent:path/to/opentelemetry-javaagent.jar \
-Dotel.service.name=my-service \
-Dotel.exporter.otlp.endpoint=http://otel-collector:4317 \
-jar my-app.jar
Spring Boot 마이크로서비스 2개
order-service: 주문 요청 처리 및 결제 호출
payment-service: 결제 응답 처리 (응답 지연 시뮬레이션 포함)
PostgreSQL: 재고 및 주문 저장용 DB
OpenTelemetry Collector: 데이터 수집 및 처리
Tempo (Grafana): 트레이스 저장소
Grafana: 트레이스 시각화 도구
▲ 아키텍쳐
4-2. OTel Collector 설정 (otel-collector-config.yaml)
Collector는 데이터를 받아(Receiver), 처리하고(Processor), 내보내는(Exporter) 파이프라인으로 구성됩니다.
receivers:
otlp:
protocols:
grpc:
http:
exporters:
otlp:
endpoint: "tempo:4317" # Tempo 백엔드 주소
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp]
5. 성과
- 가시성 확보: 분산 트레이싱을 통해 서비스 간 호출 흐름을 한눈에 파악 가능
- MTTR 단축: 장애 발생 시 문제 구간(Root Cause)을 찾는 시간이 획기적으로 단축됨
6. 마치며
지금까지는 개발 과정에서 수많은 로그를 출력하고 그 로그 속에서 버그를 찾아내기 위해 고군분투해왔다. 이러한 방식은 단일 서비스 환경에서는 어느 정도 효과를 보았지만 마이크로서비스 환경에서는 분명한 한계가 존재한다.
OpenTelemetry는 이 한계를 극복할 수 있는 해법이었다. 서비스 간의 흐름을 시각적으로 파악할 수 있도록 구성되어 있으며 문제가 발생한 지점을 정확하게 추적(Trace)할 수 있도록 설계되었다.
이를 통해 디버깅에 소요되는 시간은 확연히 줄었고 시스템 전체에 대한 이해도 역시 눈에 띄게 향상되었다.