분산 추적

지원 버전: Istio 1.28 마지막 업데이트: 2026년 2월 19일

분산 추적은 마이크로서비스 간 요청 흐름을 추적하고 시각화하여, 레이턴시 병목 지점 파악, 에러 원인 분석, 서비스 의존성 이해를 가능하게 합니다.

목차

  1. [분산 추적 개요](#분산 추적-개요)

분산 추적 개요

W3C Trace Context

Istio는 W3C Trace Context 표준을 지원하여 표준화된 trace 전파를 보장합니다.

spinner

핵심 개념

Trace

단일 요청이 시스템을 통과하는 전체 경로를 나타내는 스팬들의 집합

Span

특정 작업(operation)의 시작과 끝을 나타내는 단위

  • Span ID: 고유 식별자

  • Parent Span ID: 부모 스팬 참조

  • Trace ID: 전체 trace 식별자

  • Operation Name: 작업 이름 (e.g., HTTP GET /api/products)

  • Duration: 작업 소요 시간

  • Tags: 메타데이터 (service name, HTTP status, etc.)

  • Logs: 타임스탬프가 있는 이벤트

Baggage

trace 전체에 걸쳐 전달되는 키-값 쌍

OpenTelemetry 통합

OpenTelemetry는 최신 관찰성 표준으로, Istio 1.28에서 권장하는 추적 백엔드입니다.

1. OpenTelemetry Collector 설치

2. Istio에서 OpenTelemetry 활성화

MeshConfig 설정

Telemetry API로 추적 활성화

3. 네임스페이스별 추적 설정

Jaeger 통합

Jaeger는 가장 널리 사용되는 오픈소스 분산 추적 시스템입니다.

Jaeger All-in-One 배포 (개발/테스트용)

Jaeger Production 배포 (Elasticsearch 백엔드)

Istio에서 Jaeger 직접 사용

Zipkin 통합

Zipkin은 또 다른 인기 있는 분산 추적 시스템입니다.

Zipkin 배포

Istio에서 Zipkin 설정

Context Propagation

분산 추적의 핵심은 서비스 간 trace context를 올바르게 전파하는 것입니다.

필수 HTTP 헤더

애플리케이션 코드에서 다음 헤더를 반드시 전파해야 합니다:

W3C Trace Context (권장)

B3 헤더 (기존 방식)

Single Header Format (권장):

Multi Header Format:

애플리케이션별 Context Propagation

Python (Flask + OpenTelemetry)

Go (Gin + OpenTelemetry)

Java (Spring Boot + OpenTelemetry)

Node.js (Express + OpenTelemetry)

Trace Context 검증

샘플링 전략

샘플링 레벨

1. Head Sampling (초기 샘플링)

요청이 시스템에 들어오는 시점에 샘플링 결정:

전체 메시 레벨:

네임스페이스 레벨:

워크로드 레벨:

2. Tail Sampling (사후 샘플링)

trace가 완료된 후 collector에서 샘플링 결정:

적응형 샘플링 (Adaptive Sampling)

트래픽 패턴에 따라 자동으로 샘플링 비율 조정:

샘플링 전략 가이드

환경
권장 샘플링 비율
전략

개발

100%

Head sampling

스테이징

50%

Head sampling

프로덕션 (저트래픽)

100%

Head sampling

프로덕션 (고트래픽)

1-10%

Tail sampling

중요 서비스

100%

Tail sampling (에러/느린 요청 모두 보관)

Trace 분석

Jaeger UI에서 Trace 검색

검색 옵션:

  • Service: 서비스 이름

  • Operation: 작업 이름 (e.g., GET /api/products)

  • Tags: 태그 필터 (e.g., http.status_code=500)

  • Min Duration: 최소 지연시간

  • Max Duration: 최대 지연시간

  • Limit Results: 결과 수 제한

유용한 Trace 쿼리

1. 에러가 있는 trace 찾기

또는

2. 느린 요청 찾기

3. 특정 사용자 요청 추적

4. 특정 API 엔드포인트 분석

Jaeger API로 프로그래밍 방식 분석

레이턴시 병목 지점 파악

  1. Waterfall View에서 가장 긴 span 찾기

  2. Critical Path 확인: 전체 요청 시간에 가장 큰 영향을 미치는 경로

  3. 병렬 vs 순차 실행: 병렬로 실행 가능한 작업이 순차 실행되고 있는지 확인

Grafana Tempo 통합

커스텀 스팬 추가

애플리케이션 코드에 커스텀 span을 추가하여 더 상세한 추적을 제공합니다.

Python 예제

Go 예제

성능 최적화

Trace 데이터 크기 최적화

Collector 성능 튜닝

Storage 최적화

Elasticsearch Index 관리

문제 해결

Trace가 보이지 않을 때

1. Envoy가 trace를 생성하는지 확인

2. Collector가 trace를 수신하는지 확인

3. Jaeger/Zipkin에 trace가 저장되는지 확인

Trace Context가 전파되지 않을 때

샘플링 비율이 적용되지 않을 때

참고 자료

마지막 업데이트