🚀 OpenTelemetry Signals

시스템의 내부 동작을 이해하기 위한 4가지 핵심 신호

🔍

Traces (추적)

요청이 분산 시스템을 통과하는 전체 경로를 추적합니다. 마이크로서비스 환경에서 성능 문제의 근본 원인을 찾는 데 필수적입니다.

📊

Metrics (메트릭)

런타임에 캡처된 숫자 측정값으로, 시스템의 상태와 성능을 모니터링합니다. CPU 사용률, 메모리, 요청 수 등을 추적합니다.

📝

Logs (로그)

타임스탬프가 있는 텍스트 레코드로, 시스템에서 발생하는 이벤트를 기록합니다. 기존 로깅과 자동으로 통합됩니다.

🎒

Baggage (수하물)

서비스 간에 컨텍스트 정보를 전파하는 키-값 저장소입니다. 사용자 ID나 요청 ID 같은 정보를 전달합니다.

🔍

Traces 심화 이해

추적 시스템 구성 요소

Tracer Provider
Tracer
Spans
Trace Exporter

Span 구성 요소

필수 정보

  • 📌 이름 (Name)
  • 🆔 Trace ID & Span ID
  • 👆 부모 Span ID
  • ⏱️ 시작/종료 타임스탬프

추가 정보

  • 🏷️ 속성 (Attributes)
  • 📍 이벤트 (Events)
  • 🔗 링크 (Links)
  • ✅ 상태 (Status)

추적 시각화 예시

🌐 프론트엔드 요청 전체: 450ms
🔐 인증 서비스 120ms
💾 데이터베이스 쿼리 180ms
💨 캐시 조회 20ms
📤 응답 생성 50ms

Span 종류 (SpanKind)

종류 설명 예시
Client 동기식 외부 요청 HTTP 요청, DB 호출
Server 동기식 수신 요청 HTTP 서버, RPC 수신
Internal 프로세스 내부 작업 함수 호출, 미들웨어
Producer 비동기 작업 생성 메시지 큐에 작업 추가
Consumer 비동기 작업 처리 큐에서 메시지 처리
📊

Metrics 심화 이해

메트릭 계측 종류

📈 Counter

시간이 지나면서 누적되는 값

예: 총 요청 수, 에러 횟수

📉 UpDownCounter

증가하거나 감소할 수 있는 값

예: 큐 길이, 연결 수

🌡️ Gauge

현재 시점의 값

예: CPU 사용률, 메모리

📊 Histogram

값의 분포를 측정

예: 응답 시간 분포

메트릭 시스템 구조

Meter Provider
Meter
Instruments
Aggregation
Metric Exporter

💡 Views를 통한 커스터마이징

Views를 사용하면 어떤 메트릭을 처리하거나 무시할지, 어떤 집계 방식을 사용할지, 어떤 속성을 보고할지 커스터마이징할 수 있습니다.

📝

Logs 심화 이해

로그 포맷 비교

기계가 읽기 쉬운 일관된 형식 (권장)

{ "timestamp": "2024-08-04T12:34:56.789Z", "level": "INFO", "service": "user-authentication", "message": "User login successful", "userId": "12345", "traceId": "5b8aa5a2d2c872e8321cf37308d69df2", "spanId": "051581bf3cb55c13" }

사람이 읽기 쉽지만 파싱이 어려움

[ERROR] 2024-08-04 12:45:23 - Failed to connect to database. Exception: java.sql.SQLException: Timeout expired. Attempted reconnect 3 times. Server: db.example.com, Port: 5432

일부 구조를 가지지만 일관성이 부족할 수 있음

2024-08-04T12:45:23Z level=ERROR service=user-auth userId=12345 action=login message="Failed login attempt" error="Invalid password"

Log Record 필드

필드명 설명 예시
Timestamp 이벤트 발생 시간 2024-01-15T10:30:45Z
TraceId 관련 추적 ID 7bba9f33312b3dbb...
SpanId 관련 스팬 ID 086e83747d0e381e
SeverityText 로그 레벨 ERROR, WARN, INFO
Body 로그 메시지 본문 User authentication failed
Attributes 추가 메타데이터 {userId: "123", ip: "192.168.1.1"}

🔗 자동 상관관계

OpenTelemetry는 로그를 자동으로 활성 추적 및 스팬과 연결하여, 분산 시스템에서 문제를 더 쉽게 디버깅할 수 있게 합니다.

🎒

Baggage 심화 이해

Baggage 작동 방식

서비스 A
userId 설정
서비스 B
userId 읽기
서비스 C
userId로 로깅

사용 사례

✅ 좋은 사용 사례

  • 계정 ID 전파
  • 사용자 ID 전달
  • 제품 ID 추적
  • 요청 출처 IP
  • A/B 테스트 플래그

⚠️ 주의사항

  • 민감한 정보는 피하기
  • HTTP 헤더로 전송됨
  • 제3자 API에 노출 가능
  • 무결성 검사 없음
  • 속성과 별개로 관리됨

💡 Baggage vs Attributes

Baggage는 자동으로 전파되지만 속성(Attributes)에 자동으로 추가되지 않습니다. Baggage 데이터를 스팬, 메트릭, 로그의 속성으로 사용하려면 명시적으로 읽어서 추가해야 합니다.

🔄

Signals 통합 활용

실제 시나리오: 전자상거래 주문 처리

사용자가 주문을 완료하는 과정에서 모든 신호가 어떻게 연동되는지 살펴봅시다:

1️⃣ Traces - 요청 흐름 추적

주문 요청이 프론트엔드 → API Gateway → 주문 서비스 → 재고 서비스 → 결제 서비스로 흐르는 과정을 추적

2️⃣ Metrics - 성능 모니터링

• 주문 처리 시간 (Histogram)
• 동시 처리 중인 주문 수 (UpDownCounter)
• 총 주문 수 (Counter)
• 현재 재고 수준 (Gauge)

3️⃣ Logs - 상세 이벤트 기록

각 서비스에서 발생하는 이벤트를 기록하며, TraceId와 SpanId로 자동 연결됨

4️⃣ Baggage - 컨텍스트 전파

userId, orderId, customerTier 같은 정보를 모든 서비스에 전파하여 각 서비스에서 활용

🎯 핵심 포인트

OpenTelemetry의 4가지 신호를 통합적으로 사용하면
분산 시스템의 완전한 관찰가능성을 확보할 수 있습니다!