728x90
반응형

- W3C Trace Context란?
현대의 마이크로서비스 아키텍처(MSA) 환경에서 하나의 사용자 요청은 수많은 서비스를 넘나듭니다. 이때 가장 큰 골칫거리 중 하나는 "이 요청이 대체 어디서 병목이 걸렸는가?"를 찾아내는 것입니다. 이러한 분산 추적 컨텍스트를 서비스 간에 끊김 없이 전파하기 위해 등장한 HTTP 및 메시징 헤더의 국제 표준, W3C Trace Context에 대해 깊이 알아보겠습니다.
쉽게 말해, 이 규약은 "A 서비스에서 B 서비스로 넘어가는 네트워크 요청이 전체 트랜잭션 중 어디에 속하는지 알려주는 범용 명함"과 같습니다. 현재 옵저버빌리티 생태계의 사실상 표준인 OpenTelemetry에서도 기본 프로토콜로 채택하고 있습니다.
1. 왜 필요해졌을까? : "헤더 파편화"의 종식
이 W3C 표준이 제정되기 전의 분산 추적 환경은 그야말로 혼돈이었습니다. 각 APM 벤더마다 트레이스 ID를 넘기는 헤더 포맷이 중구난방이었습니다.
- Zipkin: X-B3-TraceId
- Datadog: x-datadog-trace-id
- New Relic: newrelic
이러한 파편화로 인해, A 서비스(Zipkin 사용)가 B 서비스(Datadog 사용)를 호출하면 Trace ID가 서로 호환되지 않아 추적의 맥락이 뚝뚝 끊어지는 Broken Trace 현상이 빈번하게 발생했습니다. 특히 외부 파트너사 API나 이기종 시스템과 연동할 때 이 문제는 더욱 치명적이었습니다. W3C Trace Context는 이러한 혼란을 범용적으로 통합하고 규격을 통일하기 위해 탄생했습니다.
2. 핵심 구성 요소: 단 두 개의 표준 헤더
W3C Trace Context는 시스템 간 통신 시 매우 심플하게 딱 두 개의 표준 헤더만을 사용합니다.
① traceparent (핵심 식별자)
트레이스의 흐름을 잇는 가장 중요한 필수 헤더입니다. 대시(-)로 구분된 4개의 고정된 필드로 명확하게 구성되어 있습니다.
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
- Version (00): 현재 적용된 W3C 스펙의 버전입니다. (현재는 00 단일 버전)
- Trace ID (4bf92f35...): 전체 분산 트랜잭션을 관통하는 16바이트 고유 식별자입니다. Grafana Tempo나 Jaeger 같은 백엔드에서 검색의 절대적인 기준이 되는 핵심 ID입니다.
- Parent ID / Span ID (00f067aa...): 현재 요청을 직전에 호출한 서비스(Parent Span)의 8바이트 ID입니다. 이 값을 기반으로 호출의 부모-자식 관계를 트리 형태로 엮어 Waterfall 차트를 렌더링할 수 있습니다.
- Trace Flags (01): 1바이트 비트 플래그입니다. 현재는 맨 끝 1비트만 사용하며, 01은 이 트레이스 데이터를 백엔드에 샘플링(기록)하라는 지시(Sampled), 00은 샘플링을 생략하라는 지시를 의미합니다.
② tracestate (벤더 특화 데이터)
표준화된 traceparent만으로는 담을 수 없는, 각 APM 벤더들만의 고유한 메타데이터를 잃어버리지 않고 다음 홉(Hop)으로 릴레이하기 위한 선택적 헤더입니다. Key-Value 쌍으로 구성되며 쉼표(,)로 구분합니다.
tracestate: datadog=00f067aa0ba902b7,rojo=t61rcWkgMzE
3. 실무 아키텍처에서의 적용: Context Propagation (컨텍스트 전파)
실제 프로덕션 레벨에서 API Gateway -> Service A -> Kafka -> Service B 와 같은 복잡한 비즈니스 로직의 흐름을 하나의 완벽한 트레이스로 묶어내려면, 이 traceparent 값이 마이크로서비스의 네트워크 경계를 넘을 때마다 반드시 유실 없이 전파되어야 합니다.
- 동기식 통신 (HTTP/gRPC)
- OpenTelemetry SDK나 널리 쓰이는 웹 프레임워크(Spring Boot의 Micrometer Tracing, Express 등)에 내장된 인터셉터/미들웨어가 HTTP Header 또는 gRPC Metadata에 traceparent를 자동으로 주입하고 추출합니다.
- 비동기식 통신 (Kafka, RabbitMQ 등)
- 비동기 메시징 구간에서도 트레이스는 이어져야 합니다. 핵심은 비즈니스 로직이 담긴 메시지 페이로드를 오염시키지 않고, Kafka Record Header와 같은 프로토콜 레벨의 메타데이터 영역에 traceparent를 실어 보내는 것입니다. 이를 통해 컨슈머(Service B)가 메시지를 폴링할 때, 앞단의 Trace ID를 그대로 이어받아 동일한 트랜잭션 컨텍스트 내에서 Span을 기록할 수 있습니다.
💡 결론
W3C Trace Context는 단순한 헤더 규칙 그 이상입니다. 이기종 시스템과 다양한 통신 프로토콜, 그리고 수많은 APM 벤더들이 혼재된 현대의 클라우드 네이티브 생태계에서 메트릭, 트레이스, 로그를 하나의 유기적인 스토리로 꿰어내는 가장 밑바탕이 되는 식별자 릴레이 메커니즘입니다. 견고한 옵저버빌리티 플랫폼을 구축하고자 한다면, 이 표준에 대한 이해는 선택이 아닌 필수입니다.
Trace Context
This section is non-normative. This section provides a step-by-step example of a tracing vendor receiving a request with trace context headers, processing the request and then potentially forwarding it. This description can be used as a reference when impl
www.w3.org
728x90
반응형