Copyright © 2024 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 명세는 분산 추적 시나리오를 가능하게 하는 컨텍스트 정보를 전파하기 위한 표준 HTTP 헤더와 값 형식을 정의한다. 이 명세는 서비스 간에 컨텍스트 정보가 전송되고 수정되는 방식을 표준화한다. 컨텍스트 정보는 분산 시스템에서 개별 요청을 고유하게 식별하며, 제공자별 컨텍스트 정보를 추가하고 전파하는 수단도 정의한다.
이 절은 이 문서가 발행된 시점의 상태를 설명한다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 https://www.w3.org/TR/의 W3C 기술 보고서 색인에서 확인할 수 있다.
이 새 버전은 trace-id와 span-id
필드 생성에 대한 고려 사항을 추가하고, 무작위 trace ID 플래그를 추가한다.
종료 기준으로, 워킹 그룹은 테스트 스위트를 사용하여 이 명세를 채택하고 활용하는 최소 2개의 구현을 입증하려 한다.
이 문서는 분산 추적 워킹 그룹이 권고안 트랙을 사용하여 후보 권고안 초안으로 발행했다.
후보 권고안으로 발행되었다고 해서 W3C와 그 회원들의 승인을 의미하지는 않는다. 후보 권고안 초안은 워킹 그룹이 후속 후보 권고안 스냅샷에 포함하려는 이전 후보 권고안의 변경 사항을 통합한다.
이는 초안 문서이며 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절하다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성했다. W3C는 이 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지하며, 해당 페이지에는 특허 공개 지침도 포함되어 있다. 개인이 그 개인이 필수 청구항을 포함한다고 믿는 특허에 대해 실제로 알고 있는 경우, 그 개인은 W3C 특허 정책 제6절에 따라 해당 정보를 공개해야 한다.
이 문서는 2023년 11월 3일 W3C 프로세스 문서의 적용을 받는다.
비규범으로 표시된 절뿐 아니라, 이 명세의 모든 작성 지침, 도표, 예제, 참고는 비규범이다. 이 명세의 그 밖의 모든 내용은 규범이다.
이 문서에서 핵심어 MAY, MUST, MUST NOT, SHOULD, SHOULD NOT는 여기 표시된 것처럼 모두 대문자로 나타나는 경우에, 그리고 오직 그 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 한다.
분산 추적은 추적 도구가 여러 소프트웨어 구성 요소에 걸친 트랜잭션을 따라가고, 분석하며, 디버깅하기 위해 구현하는 방법론이다. 일반적으로 분산 추적은 둘 이상의 구성 요소를 통과하므로, 참여하는 모든 시스템에서 고유하게 식별될 수 있어야 한다. 추적 컨텍스트 전파는 이러한 고유 식별 정보를 함께 전달한다. 오늘날 추적 컨텍스트 전파는 각 추적 벤더가 개별적으로 구현한다. 다중 벤더 환경에서는 이로 인해 다음과 같은 상호 운용성 문제가 발생한다.
과거에는 대부분의 애플리케이션이 단일 추적 벤더에 의해 모니터링되고 단일 플랫폼 제공자의 경계 안에 머물렀기 때문에 이러한 문제는 큰 영향을 미치지 않았다. 오늘날에는 점점 더 많은 애플리케이션이 고도로 분산되고, 여러 미들웨어 서비스와 클라우드 플랫폼을 활용한다.
이러한 현대 애플리케이션의 변화는 분산 추적 컨텍스트 전파 표준을 필요로 한다.
추적 컨텍스트 명세는 추적 컨텍스트 전파 데이터의 교환을 위해 보편적으로 합의된 형식을 정의하며, 이를 추적 컨텍스트라고 부른다. 추적 컨텍스트는 위에서 설명한 문제를 다음과 같이 해결한다.
추적 데이터를 전파하기 위한 통합된 접근 방식은 분산 애플리케이션의 동작에 대한 가시성을 향상시켜 문제 및 성능 분석을 쉽게 한다. 추적 컨텍스트가 제공하는 상호 운용성은 현대의 마이크로서비스 기반 애플리케이션을 관리하기 위한 전제 조건이다.
현재 버전의 Trace Context 명세는 브라우저 안에서 실행되는 웹 애플리케이션을 포함하여 애플리케이션과 서비스에 의한 구현을 대상으로 한다. 웹 브라우저 또는 사용자 에이전트는 현재 대상 구현 범위에 포함되지 않는다.
추적 컨텍스트는 상호 운용성과 벤더별 확장성을 지원하는 두 개의 개별 전파 필드로 나뉜다.
traceparent는 들어오는 요청의 추적 그래프상 위치를
이식 가능한 고정 길이 형식으로 설명한다. 그 설계는 빠른 파싱에 초점을 둔다. 모든 추적 도구는
tracestate의 벤더별 정보에만 의존하는 경우에도 traceparent를
올바르게 설정해야 MUST 한다.
tracestate는 이름/값 쌍의 집합으로 표현되는 벤더별 데이터로
traceparent를 확장한다. tracestate에 정보를 저장하는 것은 선택 사항이다.
추적 도구는 추적 컨텍스트와 상호 작용할 때 두 가지 수준의 준수 동작을 제공할 수 있다.
traceparent와
tracestate 헤더를 전파하고 추적이 끊어지지 않도록 보장해야
MUST 한다. 이 동작은 추적을 전달한다고도 한다.
traceparent 헤더와
독점 정보를 포함하는 tracestate 헤더의 관련 부분을 수정하여
추적에 참여하도록 선택할 수도 MAY 있다. 이것도 추적에 참여한다고 한다.
추적 도구는 자신이 모니터링하는 구성 요소에 대한 각 개별 요청마다 이 동작을 변경하도록 선택할 수 있다.
이 절은 분산 추적 컨텍스트를
traceparent와
tracestate HTTP 헤더에 바인딩하는 방법을 설명한다.
traceparent 요청 헤더는 모든 벤더가 이해하는 공통 형식으로,
추적 시스템 안의 들어오는 요청을 나타낸다. 다음은 traceparent 헤더의 예이다.
traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
tracestate 요청 헤더는 잠재적으로 벤더별 형식으로 부모를 포함한다.
tracestate: congo=t61rcWkgMzE
예를 들어, 한 시스템의 클라이언트와 서버가 서로 다른 추적 벤더인 Congo와 Rojo를 사용한다고 하자. Congo 시스템에서 추적되는 클라이언트는 나가는 HTTP 요청에 다음 헤더를 추가한다.
traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
tracestate: congo=t61rcWkgMzE
참고: 이 경우 tracestate 값 t61rcWkgMzE는
부모 ID(b7ad6b7169203331)를 Base64로 인코딩한 결과이지만, 이러한 조작이
필수인 것은 아니다.
Rojo 추적 시스템에서 추적되는 수신 서버는 자신이 받은 tracestate를
이어받고 왼쪽에 새 항목을 추가한다.
traceparent: 00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01
tracestate: rojo=00f067aa0ba902b7,congo=t61rcWkgMzE
Rojo 시스템이 자신의 tracestate 항목에
traceparent의 값을 재사용한다는 점을 알 수 있다. 이는 해당 시스템이 일반 추적 시스템임을
의미한다(독점 정보가 전달되지 않는다). 그 밖의 경우 tracestate 항목은
불투명하며 벤더별일 수 있다.
다음 수신 서버가 Congo를 사용한다면, Rojo로부터의 tracestate를 이어받고
이전 항목의 왼쪽에 부모에 대한 새 항목을 추가한다.
traceparent: 00-0af7651916cd43dd8448eb211c80319c-b9c7c989f97918e1-01
tracestate: congo=ucfJifl5GOE,rojo=00f067aa0ba902b7
참고: ucfJifl5GOE는 부모 ID
b9c7c989f97918e1를 Base64로 인코딩한 것이다.
Congo가 자신의 traceparent 항목을 쓸 때 그것은 인코딩되지 않았으며,
이는 상관관계를 수행하는 사람들에게 일관성을 제공하는 데 도움이 된다. 그러나 그 tracestate
항목의 값은 인코딩되어 있으며 traceparent와 다르다. 이는 괜찮다.
마지막으로, tracestate는 오른쪽으로 밀린 것을 제외하면 Rojo에 대한 항목을
정확히 그대로 유지한다. 가장 왼쪽 위치는 다음 서버가 어떤 추적 시스템이
traceparent에 대응하는지 알 수 있게 한다. 이 경우 Congo가
traceparent를 썼으므로, 그 tracestate 항목은 가장 왼쪽에 있어야 한다.
traceparent HTTP 헤더 필드는 추적 시스템 안의 들어오는 요청을 식별한다.
이는 네 개의 필드를 가진다.
versiontrace-idparent-idtrace-flags헤더 이름: traceparent
헤더 이름은 ASCII
대소문자를 구분하지 않는다. 즉, TRACEPARENT, TraceParent,
traceparent는 같은 헤더로 간주된다. 헤더 이름은 하나의 단어이며, 하이픈 같은
구분자를 포함하지 않는다.
여러 프로토콜 간 상호 운용성을 높이고 성공적인 통합을 장려하기 위해, 추적 시스템은 헤더 이름을 ASCII 소문자로 인코딩해야 SHOULD 한다.
이 절은 [RFC5234]의 확장
배커스-나우어 형식(ABNF) 표기법을 사용하며, 해당 문서의
DIGIT 규칙을 포함한다. DIGIT 규칙은 단일 숫자 문자
0-9를 정의한다.
HEXDIGLC = DIGIT / "a" / "b" / "c" / "d" / "e" / "f" ; lowercase hex character
value = version "-" version-format
대시(-) 문자는 필드 사이의 구분자로 사용된다.
version = 2HEXDIGLC ; this document assumes version 00. Version ff is forbidden
버전(version)은 8비트 부호 없는 정수 값이며, 두 문자로 된 ASCII 문자열로
직렬화된다. 버전 255("ff")는 유효하지 않다. 이 문서는
traceparent 헤더의 버전 0("00")을 지정한다.
다음 version-format 정의는 버전 00에 사용된다.
version-format = trace-id "-" parent-id "-" trace-flags
trace-id = 32HEXDIGLC ; 16 bytes array identifier. All zeroes forbidden
parent-id = 16HEXDIGLC ; 8 bytes array identifier. All zeroes forbidden
trace-flags = 2HEXDIGLC ; 8 bit flags.
이는 전체 추적 포리스트의 ID이며, 시스템을 통과하는 분산 추적을
고유하게 식별하는 데 사용된다.
이는 예를 들어
4bf92f3577b34da6a3ce929d0e0e4736처럼 16바이트 배열로 표현된다.
모든 바이트가 0인 값(00000000000000000000000000000000)은 유효하지 않은
값으로 간주된다.
trace-id의 값은 전역적으로 고유해야 SHOULD 한다.
전역 고유성을 보장하고, 일부 개인정보 보호 및 보안 고려 사항을
충분히 확실한 수준으로 다루기 위한 권장 방법 중 하나는 trace-id를
무작위(또는 의사 무작위)로 생성하는 것이다.
구현자는 ID의 가장 오른쪽 7바이트 이상을 무작위(또는 의사 무작위)로 생성하는
trace-id 생성 방법을 사용해야 SHOULD 한다.
가장 오른쪽 7바이트가 무작위(또는 의사 무작위)로 생성되는 경우, 대응하는
무작위 trace id 플래그를 설정해야
SHOULD 한다.
자세한 내용은 trace-id 필드 생성에
대한 고려 사항을 참조하라.
trace-id 값이 유효하지 않은 경우(예: 허용되지 않는 문자를 포함하거나
모두 0인 경우), 벤더는 traceparent를 무시해야 MUST 한다.
이는 호출자가 알고 있는 이 요청의 ID이다(일부 추적 시스템에서는 이를
span-id라고 하며, 여기서 span은 클라이언트 요청의 실행이다).
이는 예를 들어 00f067aa0ba902b7처럼 8바이트 배열로 표현된다. 모든 바이트가
0인 값(0000000000000000)은 유효하지 않은 값으로 간주된다.
parent-id가 유효하지 않은 경우(예: 소문자 16진수 문자가 아닌 문자를 포함하는 경우),
벤더는 traceparent를 무시해야 MUST 한다.
이는 샘플링, 추적 수준 등과 같은 추적 플래그를 제어하는 8비트 필드이다. 이러한 플래그는 다음 세 가지 이유로 엄격히 따라야 하는 규칙이 아니라 호출자가 제공하는 권장 사항이다.
자세한 내용은 이 명세의 보안 고려 사항 절에서 확인할 수 있다.
다른 필드와 마찬가지로 trace-flags는 16진수로 인코딩된다. 예를 들어
모든 8개 플래그가 설정되면 ff이고, 아무 플래그도 설정되지 않으면
00이다.
이것은 비트 필드이므로 플래그는 단순한 동등 비교로 해석할 수 없다.
예를 들어 01(00000001)과 03
(00000011)은 모두 샘플링 플래그(00000001)가 설정되어 있기 때문에
추적이 샘플링되었음을 나타내며, 03과 02(00000010)는
모두 random 비트(00000010)가 설정되어 있기 때문에 trace-id의
가장 오른쪽 7바이트 이상이 무작위(또는 의사 무작위)로 생성되었음을 나타낸다.
비트 필드를 해석할 때 흔한 실수는 단일 비트를 해석하는 대신 전체 숫자를 비교하는 것이다.
다음은 추적 플래그를 올바르게 처리하는 예이다.
static final byte FLAG_SAMPLED = 1; // 00000001
static final byte FLAG_RANDOM = 2; // 00000010
...
boolean sampled = (traceFlags & FLAG_SAMPLED) == FLAG_SAMPLED;
boolean random = (traceFlags & FLAG_RANDOM) == FLAG_RANDOM;
설정된 경우, 최하위 비트(가장 오른쪽)는 호출자가 추적 데이터를 기록했을 수 있음을 나타낸다. 설정되지 않은 경우, 호출자는 대역 외로 추적 데이터를 기록하지 않았다.
분산 추적을 깨뜨릴 수 있는 기록 시나리오가 여러 가지 있다.
이러한 문제 때문에 추적 벤더는 자체 기록 결정을 내리며, 이 작업에 가장 적합한 알고리즘이 무엇인지에 대한 합의는 없다.
여러 기법은 다음을 포함한다.
이러한 기법이 구현되는 방식은 추적 벤더별이거나 애플리케이션 정의일 수 있다.
tracestate 필드는 특정 벤더에 대해 기록 결정(또는 기타 특정 정보)을
내리는 다양한 기법을 처리하도록 설계되었다. sampled 플래그는
벤더 간 더 나은 상호 운용성을 제공한다. 이는 벤더가 기록 결정을 전달하고
고객에게 더 나은 경험을 제공할 수 있게 한다.
예를 들어 SaaS 서비스가 분산 추적에 참여할 때, 이 서비스는
호출자가 사용하는 추적 벤더를 알지 못한다. 이 서비스는 모니터링 또는 문제 해결을 위해
수신 요청 기록을 생성할 수 있다. sampled 플래그는 호출자가 기록 대상으로
표시한 요청에 대한 정보가 하위 SaaS 서비스에서도 기록되도록 보장하는 데 사용할 수 있으며,
이를 통해 호출자는 기록된 모든 요청의 동작을 문제 해결할 수 있다.
sampled 플래그는 parent-id가 갱신될 때에만
변경될 수 있다는 점을 제외하면, 그 변경에 대한 제한이 없다.
다음은 벤더 간 상호 운용성을 높이기 위해 벤더가 사용해야 SHOULD 하는 제안 집합이다.
sampled 플래그에 반영되어야 SHOULD 한다.
sampled 플래그 값을
존중해야 SHOULD 한다.
이 플래그의 남용 또는 악의적 사용으로부터 보호하기 위해
보안 고려 사항을 적용해야
SHOULD 한다.
sampled 플래그는 변경되지 않은 채 전파되어야 한다. 추적이 이 구성 요소에 의해 시작되는 경우,
기본 옵션으로 0으로 설정되어야 한다.
벤더가 따를 수 있는 두 가지 추가 옵션이 있다 MAY.
sampled 플래그를 1로 설정하여 기록의 우선순위를 전달할 수 있다.
sampled 플래그를 1로 설정할 수도 있다.
trace-flags 필드의 두 번째 최하위 비트는
random-trace-id 플래그를 나타낸다.
추적을 시작하거나 다시 시작할 때(즉, 참여자가 새
trace-id를 생성할 때), 다음 규칙이 적용된다.
trace-id의 가장 오른쪽 7바이트 이상은
[0..2^56-1] 구간에서 균등 분포로 무작위(또는 의사 무작위) 선택되어야
MUST 한다.
trace-id는 여전히
무작위(또는 의사 무작위)로 생성될 수 MAY 있다.trace-id는
trace ID 형식의 요구 사항을 만족하는 어떤 방식으로든 생성될 수
MAY 있다.
trace-id의 가장 오른쪽 7바이트 이상이 무작위(또는
의사 무작위)로 생성되는 경우, random-trace-id 플래그는
1로 설정되어야 SHOULD 한다.
추적을 계속할 때(즉, 들어오는 HTTP 요청에 traceparent
헤더가 있고 참여자가 나가는 요청의
traceparent 헤더에서 같은 trace-id를 사용하는 경우), 다음 규칙이 적용된다.
traceparent 헤더에서 플래그가 설정된 경우, 같은
trace-id를 사용하는 모든 나가는 traceparent
헤더에서도 설정되어야 MUST 한다.
traceparent 헤더에서 플래그가 설정되지 않은 경우, 같은
trace-id를 사용하는 모든 나가는 traceparent
헤더에서도 설정되지 않아야 MUST 한다.
이를 통해 하위 소비자는 이러한 바이트를 기반으로 추적 샘플링이나 데이터베이스 샤딩 같은 기능을 구현할 수 있다. 추가 정보는 trace-id 필드 생성에 대한 고려 사항을 참조하라.
(00000100)과 같은 기타 플래그의 동작은 정의되어 있지 않으며,
향후 사용을 위해 예약되어 있다. 벤더는 이를 0으로 설정해야 MUST 한다.
호출자가 이 요청을 샘플링했을 때의 유효한 traceparent:
Value = 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
base16(version) = 00
base16(trace-id) = 4bf92f3577b34da6a3ce929d0e0e4736
base16(parent-id) = 00f067aa0ba902b7
base16(trace-flags) = 01 // sampled
호출자가 이 요청을 샘플링하지 않았을 때의 유효한 traceparent:
Value = 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00
base16(version) = 00
base16(trace-id) = 4bf92f3577b34da6a3ce929d0e0e4736
base16(parent-id) = 00f067aa0ba902b7
base16(trace-flags) = 00 // not sampled
이 명세는 향후 버전의 추적 컨텍스트에 대해 명확한 입장을 가진다. 이 명세의 현재 버전은
traceparent 헤더의 향후 버전이 현재 버전에 추가적인 방식일 것이라고 가정한다.
벤더는 예상하지 못한 형식의 헤더를 파싱할 때 다음 규칙을 따라야 MUST 한다.
통과 서비스는 버전을 분석하지 않아야 한다. 향후 헤더의 크기 제한이 더 커질 수 있음을 예상하고, 지나치게 큰 헤더만 허용하지 않아야 한다.
버전 접두사를 파싱할 수 없는 경우(대시(-)가 뒤따르는 2개의 16진수 문자가
아닌 경우), 구현은 추적을 다시 시작해야 한다.
더 높은 버전이 감지된 경우, 구현은 다음을 시도하여 이를 파싱해야 SHOULD 한다.
trace-id를 파싱한다(첫 번째 대시부터 다음 32자까지).
벤더는 32자가 16진수인지, 그리고 그 뒤에 대시(-)가 오는지
확인해야 MUST 한다.parent-id를 파싱한다(35번째 위치의 두 번째 대시부터 다음
16자까지). 벤더는 16자가 16진수인지, 그리고 그 뒤에 대시가 오는지
확인해야 MUST 한다.flags의 sampled 비트를 파싱한다(세 번째
대시부터 2자). 벤더는 2자가 문자열의 끝에 있거나 그 뒤에 대시가 오는지
확인해야 MUST 한다.세 값이 모두 성공적으로 파싱되었다면, 벤더는 이를 사용해야 한다.
벤더는 이 버전에 대해 알 수 없는 필드를 파싱하거나 가정해서는 안 된다
MUST NOT. 벤더는 구현이 알고 있는 명세의 가장 높은 버전(이 명세에서는
00)에 따라 새
traceparent 필드를 구성하기 위해 이 필드들을 사용해야 MUST 한다.
tracestate HTTP 헤더의 주된 목적은 서로 다른 분산 추적 시스템 사이에서
추가적인 벤더별 추적 식별 정보를 제공하는 것이며, 이는 traceparent 필드의
동반 헤더이다. 또한 여러 분산 추적 그래프 안에서 요청의 위치에 대한 정보를 전달한다.
벤더가 traceparent를 파싱하지 못한 경우,
tracestate를 파싱하려고 시도해서는 안 된다 MUST NOT.
반대는 참이 아니라는 점에 유의하라. 즉,
tracestate 파싱 실패는
traceparent 파싱에 영향을 주어서는 안 된다 MUST NOT.
tracestate HTTP 헤더는 추적 시스템에 의해 정의되지 않은 어떠한 속성에도
사용되어서는 안 된다 MUST NOT. [BAGGAGE]는 이러한
애플리케이션 수준 속성을 정의하고 전파하는 데 사용될 수 MAY 있다.
헤더 이름: tracestate
헤더 이름은 ASCII
대소문자를 구분하지 않는다. 즉, TRACESTATE, TraceState,
tracestate는 같은 헤더로 간주된다. 헤더 이름은 하나의 단어이며,
하이픈 같은 구분자를 포함하지 않는다.
여러 프로토콜 간 상호 운용성을 높이고 성공적인 통합을 장려하기 위해, 추적 시스템은 헤더 이름을 ASCII 소문자로 인코딩해야 SHOULD 한다.
tracestate 필드는 어떤 키에서도 임의의 불투명 값을 포함할 수 있다.
Tracestate는 여러 헤더 필드로 전송되거나 수신될 수 MAY 있다.
여러 tracestate 헤더 필드는 RFC9110
Section 5.3 Field
Order에 지정된 대로 처리되어야 MUST 한다.
tracestate 헤더는 가능하면 단일 필드로 전송되어야
SHOULD 하지만, 여러 헤더 필드로 분할될 수
MAY 있다.
tracestate를 여러 헤더 필드로 전송할 때는
RFC9110에 따라 분할되어야
MUST 한다.
여러 tracestate 헤더 필드를 수신할 때, 이는 RFC9110에 따라 단일 헤더로
결합되어야 MUST 한다.
이 절은 [RFC5234]의 확장
배커스-나우어 형식(ABNF) 표기법을 사용하며,
RFC5234의 부록 B.1에 있는
DIGIT 규칙을 포함한다. 또한 RFC9110 section
5.6.3의
OWS 규칙도 포함한다.
DIGIT 규칙은 숫자 0-9를 정의한다.
OWS 규칙은 선택적 공백 문자를 정의한다. 가독성을 높이기 위해,
0개 이상의 공백 문자가 나타날 수 있는 곳에 사용된다.
호출자는 선택적 공백을 단일 공백으로 생성해야 SHOULD 하며, 그 밖의 경우 호출자는 선택적 공백을 생성해서는 안 된다 SHOULD NOT. 자세한 내용은 해당 RFC를 참조하라.
tracestate 필드 값은 쉼표(,)로 구분된
list-members의 list이다. list-member는 등호
(=)로 구분된 키/값 쌍이다.
list-member 주변의 공백과 수평 탭은 무시된다.
list에는 최대 32개의 list-member가 있을 수 있다. 항목을 추가하면
tracestate 목록에 32개를 초과하는 list-members가 포함되는 경우,
가장 오른쪽 list-member가 목록에서 제거되어야 한다.
비어 있거나 공백만 있는 목록 멤버는 허용된다. 벤더는 빈
tracestate 헤더를 받아들여야 MUST 하지만,
이를 전송하지 않도록 해야 SHOULD 한다. 여러
tracestate 헤더가 전송될 때 벤더가 빈 값을 인식하기 어렵기 때문에,
빈 목록 멤버는 tracestate에서 허용된다. 일부 벤더가 쉼표 구분자 뒤에
공백을 자동으로 삽입하기 때문에, 빈 헤더인 경우에도 비슷한 이유로 공백 문자가 허용된다.
두 개의 list-member를 가진 list의 간단한 예는 다음과 같을 수 있다.
vendorname1=opaqueValue1,vendorname2=opaqueValue2.
list = list-member 0*31( OWS "," OWS list-member )
list-member = (key "=" value) / OWS
list의 식별자는 짧은(최대 256자) 텍스트 식별자이다.
list-member는 키/값 쌍을 포함한다.
키는 벤더를 설명하는 식별자이다.
key = ( lcalpha / DIGIT ) 0*255 ( keychar )
keychar = lcalpha / DIGIT / "_" / "-"/ "*" / "/" / "@"
lcalpha = %x61-7A ; a-z
key는 소문자 또는 숫자로 시작해야 MUST 하며,
소문자(a-z), 숫자(0-9),
밑줄(_), 대시
(-), 별표(*), 슬래시(/), 앳 기호
(@)를 포함하여 최대 256자를 포함할 수 있다.
값은 최대 256개의 출력 가능한 ASCII [RFC0020] 문자(즉, 0x20부터 0x7E까지의 범위)로 이루어진 불투명 문자열이다. 단, 쉼표(,)와 (=)는 제외된다. 문자열은 공백(0x20)이 아닌 문자로 끝나야 한다. 이는 탭, 줄바꿈, 캐리지 리턴 등도 제외한다는 점에 유의하라. 모든 선행 공백은 값의 일부로 보존되어야 MUST 한다. 모든 후행 공백은 값의 일부가 아닌 선택적 공백 문자로 간주된다. 선택적 후행 공백은 헤더를 전파할 때 제외될 수 MAY 있다.
value = 0*255(chr) nblk-chr
nblk-chr = %x21-2B / %x2D-3C / %x3E-7E
chr = %x20 / nblk-chr
tracestate 값은 추적 그래프 키/값 쌍의 연결이다.
예: vendorname1=opaqueValue1,vendorname2=opaqueValue2
키당 하나의 항목만 허용된다. 예를 들어 벤더 이름이 Congo이고 해당 시스템에서 추적이 시작된 뒤
Rojo라는 시스템을 거쳐 나중에 Congo로 돌아온 경우,
tracestate 값은 다음이 될 수 없다.
congo=congosFirstPosition,rojo=rojosFirstPosition,congo=congosSecondPosition
대신 항목은 가장 최근 위치만 포함하도록 다시 작성된다.
congo=congosSecondPosition,rojo=rojosFirstPosition
자세한 내용은 tracestate 필드 변경을 참조하라.
벤더는 결합된 헤더의 최소 512자를 전파해야 SHOULD 한다.
이 길이에는 목록 항목을 구분하는 데 필요한 쉼표와 선택적 공백
(OWS) 문자가 포함된다.
tracestate의 512자를 전파하는 것이 비용이 많이 드는 시스템이 있다.
이 경우 전파되는 tracestate 헤더의 최대 크기는 문서화되고 설명되어야
SHOULD 한다. tracestate 전파 비용은
최종 사용자에게 제공되는 모니터링 시나리오의 가치와 비교하여 평가되어야
SHOULD 한다.
헤더 값의 총 크기로 인해 tracestate가 잘리는 상황에서,
벤더는 전체 항목 단위로 잘라야 MUST 한다. 길이가
128자를 초과하는 항목은 먼저 제거되어야 SHOULD 한다.
그런 다음 항목은 tracestate의 끝에서부터 제거되어야
SHOULD 한다.
안전 목록 항목, 차단 목록 항목, 크기 기반
자르기와 같은 다른 자르기 전략은 사용되어서는 안 된다
SHOULD NOT.
단일 추적 시스템(일반 형식):
tracestate: rojo=00f067aa0ba902b7
여러 추적 시스템(서로 다른 형식 포함):
tracestate: rojo=00f067aa0ba902b7,congo=t61rcWkgMzE
tracestate의 버전은 traceparent
헤더의 버전 접두사로 정의된다. 벤더는 더 높은 버전이 감지되면 가능한 한
tracestate 파싱을 시도해야 한다. 부분적으로 파싱된
tracestate 키/값 쌍을 사용할지 여부는 벤더의 결정이다.
traceparent 헤더가 없는 요청을 수신한 벤더는 발신 요청에 대해
traceparent 헤더를 생성하여 사실상 새 추적을 시작해야
SHOULD 한다. 이를 하지 않을 수 있는 가능한 이유는 벤더가 요청을
샘플링하지 않기로 결정한 성능 민감 시나리오일 수 있다. 대부분의 시나리오에서는 벤더가
샘플링하지 않는 경우에도 샘플링 결정을 하위로 전파하기 위해 헤더를 생성할 것으로 기대된다는 점에 유의하라.
traceparent 요청 헤더를 수신한 벤더는 이를 나가는 요청으로 보내야
MUST 한다. 벤더는 이를 나가는 요청으로 전달하기 전에
이 헤더의 값을 변경할 수 MAY 있다.
전파 전에 traceparent 필드의 값이 변경되지 않았다면,
tracestate도 변경되어서는 안 된다 MUST NOT.
변경되지 않은 헤더 전파는 일반적으로 프록시 같은 통과 서비스에서 구현된다. 이 동작은
현재 분산 추적 정보를 수집하지 않는 서비스에서도 구현될 수 있다.
다음은 허용되는 변경 목록이다.
parent-id 갱신: parent-id
필드의 값은 현재 작업의 ID를 나타내는 새 값으로 설정될 수 있다. 이는
가장 일반적인 변경이며 기본값으로 간주되어야 한다.sampled 갱신: sampled
필드의 값은 호출자의 기록 동작을 반영한다. 즉, 추적 데이터가 삭제되었거나
대역 외로 기록되었을 수 있음을 나타낸다. 이는 플래그를 양방향으로 토글하여 표시할 수 있다.
이 변경은 하위 벤더에게 부모의 정보가 기록되었을 가능성에 대한 정보를 제공한다.
sampled 플래그 갱신과 함께 parent-id 필드는 새 값으로 설정되어야
MUST 한다.
trace-id, parent-id,
trace-flags)이 다시 생성된다. 이 변경은 보안 네트워크로 들어가는
프런트 게이트로 정의된 서비스에서 사용되며, 잠재적인 서비스 거부 공격 표면을 제거한다. 벤더는
traceparent 재시작 시 tracestate 컬렉션을 정리해야
SHOULD 한다. 재시작 후에도 원래 tracestate
항목을 보존해야 하는 드문 경우가 있다. 이는 보통 추적 흐름의 어느 시점에서
trace-id가 다시 원래대로 되돌려질 때, 예를 들어 보안 네트워크를 떠날 때 발생한다.
그러나 이는 명시적인 결정이어야 SHOULD 하며, 기본 동작이어서는 안 된다.
00)은 더 높은 버전의
traceparent 헤더를 수신한 벤더의 동작을 정의한다. 이 경우 첫 번째 변경은 헤더의 버전을
다운그레이드하는 것이다. 다른 변경은 이 변경과 조합하여 허용된다.
벤더는 traceparent 헤더에 대해 어떠한 다른 변경도 해서는 안 된다
MUST NOT.
tracestate 요청 헤더를 수신한 벤더는 이를 나가는 요청으로 보내야
MUST 한다. 벤더는 이를 나가는 요청으로 전달하기 전에
이 헤더의 값을 변경할 수 MAY 있다. tracestate를
변경할 때, 변경되지 않은 키/값 쌍의 순서는 보존되어야 MUST 한다. 변경된 키는 목록의 시작(왼쪽)으로 이동되어야
MUST 한다.
다음은 허용되는 변경이다.
tracestate 키를 차단할 수 있다는 것이다. 두 번째 시나리오는 긴
tracestate의 자르기이다. 마지막으로, 벤더는 자신이 생성하지 않은 중복 키를
폐기할 수도 MAY 있다.
이 절은 비규범이다.
이 절은 추적 벤더가 추적 컨텍스트 헤더가 있는 요청을 수신하고, 요청을 처리한 다음 잠재적으로 이를 전달하는 단계별 예를 제공한다. 이 설명은 추적 컨텍스트를 준수하는 추적 시스템, 미들웨어(프록시나 메시징 버스 같은 것), 또는 클라우드 서비스를 구현할 때 참조로 사용할 수 있다.
이 처리 모델은 추적 컨텍스트 헤더를 수정하고 전달하는 벤더의 동작을 설명한다.
이 모델이 어떻게 동작하는지는 traceparent 헤더가 수신되는지 여부에 따라 달라진다.
traceparent 헤더가 수신되지 않은 경우:
traceparent와
tracestate 헤더를 확인한다.
traceparent 헤더가 수신되지 않았기 때문에, 벤더는 현재 요청을 나타내는 새
trace-id와 parent-id를 생성한다. (참고: 벤더가 이 요청을
샘플링하지 않으며 그 샘플링 결정을 sampled 플래그를 통해 하위로 전달하려는 경우,
벤더는 실제 추적 데이터와 연결되지 않은
trace-id와 parent-id를 생성할 수
MAY 있다. 벤더는 샘플링 결정을 하위로 전달하지 않기로
결정할 수도 MAY 있다.)
traceparent 헤더 없이 tracestate 헤더가 수신되면,
이는 유효하지 않으며 폐기되어야 MUST 한다.tracestate 헤더를 만들고 새 키/값 쌍을 추가해야
SHOULD 한다.
traceparent와 tracestate 헤더를 설정한다.traceparent 헤더가 수신된 경우:
traceparent와
tracestate 헤더를 확인한다.
traceparent 헤더가 존재하므로, 벤더는
traceparent 헤더의 버전을 파싱하려고 시도한다.traceparent 헤더를 만들고 tracestate를 삭제한다.
00)에 정의된 형식을 사용하여
trace-id와 parent-id를 파싱한다.
벤더는 이 명세의 이 버전에서 지원되는 trace-flags 값만 파싱하고
다른 모든 값은 무시한다. 파싱이 실패하면 벤더는 새
traceparent 헤더를 만들고 tracestate를 삭제한다. 벤더는
나가는 요청에서 파싱되지 않은 / 알 수 없는 모든 trace-flags를 0으로 설정한다.
trace-id와
parent-id를 검증한다. trace-id, parent-id 또는
trace-flags 중 하나라도 유효하지 않으면, 벤더는 새
traceparent 헤더를 만들고 tracestate를 삭제한다.
tracestate 헤더를 검증할 수 MAY 있다.
tracestate 헤더를 파싱할 수 없는 경우 벤더는 전체 헤더를 폐기할 수
MAY 있다. 유효하지 않은 tracestate 항목도
폐기될 수 MAY 있다.
벤더는 traceparent 헤더를 수정해야 MUST 한다.
parent-id 갱신: 속성
parent-id의 값은 현재 작업의 ID를 나타내는 값으로
설정되어야 MUST 한다.
sampled 갱신: sampled의 값은
호출자의 기록 동작을 반영한다. 추적 데이터가 기록될 가능성이 있으면
trace-flags의 sampled
플래그 값을 1로, 그렇지 않으면 0으로
설정할 수 MAY 있다. 플래그를 설정한다고 해서
추적이 기록된다는 보장은 없지만, 종단 간 기록된 추적의 가능성을 높인다.
벤더는 tracestate 헤더를 수정할 수 MAY 있다.
벤더는 나가는 요청에 대해 traceparent와 tracestate 헤더를 설정한다.
위의 처리 모델은 추적 컨텍스트 헤더를 처리하기 위한 전체 단계 집합을 설명한다.
그러나 벤더가 위에서 설명한 단계의 일부만 지원하는 상황도 있다. 프록시 또는 메시징 미들웨어는
traceparent 헤더를 수정하지 않고, 유효하지 않은 헤더를 제거하거나
tracestate에 추가 정보를 더하기로 결정할 수 MAY 있다.
추적 컨텍스트는 HTTP에 대해 정의되지만, 저자들은 이것이 다른 통신 프로토콜에도 관련이 있음을 인정한다. 이 명세의 확장뿐 아니라 외부 조직이 작성한 명세는 다른 프로토콜을 위한 추적 컨텍스트 직렬화 및 역직렬화 형식을 정의한다. 이러한 확장은 이 명세와 다른 성숙도 수준에 있을 수 있음에 유의하라.
다른 프로토콜을 위한 추적 컨텍스트 구현의 자세한 내용은 [trace-context-protocols-registry]를 참조하라.
헤더를 하위 서비스로 전파하고 이러한 헤더의 값을 저장해야 하는 요구 사항은
잠재적인 개인정보 보호 우려를 낳는다. 추적 벤더는 개인 식별 가능 정보나 그 밖의 민감한 정보에 대해
traceparent와 tracestate 필드를 사용해서는 안 된다
MUST NOT. 이들 필드의 유일한 목적은 추적 상관관계를 가능하게 하는 것이다.
벤더는 헤더 남용의 위험을 평가해야 MUST 한다. 이 절은 이러한 헤더를 저장하고 전파하는 것과 관련된 위험에 대한 몇 가지 고려 사항과 초기 평가를 제공한다. 추적 벤더는 추적 시스템이 이러한 필드를 잠재적으로 전파하거나 저장할 수 있는 코드를 실행하도록 허용하기 전에, 필드를 검사하고 민감한 정보를 제거하도록 선택할 수 있다. 그러나 모든 변경은 이 명세에 정의된 변경 목록을 준수해야 한다.
traceparent 필드는 어떠한 개인 식별 가능 정보도 포함해서는 안 된다
MUST NOT. 이를 달성하는 한 가지 방법은 개인 식별 가능 정보를 노출하지 않는
난수 생성기를 사용하여 모든 추적 ID를 무작위로 생성하는 것이다. 추적 ID를 생성하는 데 사용되는
모든 난수 생성기는 잠재적으로 개인 식별 가능할 수 있는 어떠한 정보도 입력이나 시드 상태로
의존해서는 안 된다 MUST NOT.
traceparent 필드의 또 다른 개인정보 보호 위험은 단일 트랜잭션의 일부로 수행된
요청들을 서로 연관시킬 수 있는 능력이다. 하위 서비스는 단일 트랜잭션에서 이루어진 둘 이상의 요청을
추적하고 연관시킬 수 있으며, 다른 요청의 정보를 바탕으로 요청 호출자의 신원에 대해
가정할 수 있다.
traceparent 필드의 이러한 개인정보 보호 우려는 실제적이라기보다 이론적이라는 점에 유의하라.
요청을 시작하거나 수신하는 일부 서비스는 이러한 위험을 완전히 제거하기 위해
traceparent 필드를 다시 시작하도록 선택할 수 MAY 있다.
벤더는 추적 벤더의 상호 운용성을 촉진하기 위해 분산 추적
재시작 횟수를 최소화할 방법을 찾아야 SHOULD 한다. 재시작 대신 다른 기법이 사용될 수 있다. 예를 들어
서비스는 상류 및 하류 연결의 신뢰 경계와, 어떤 요청이 가져올 수 있는 노출 수준을 정의할 수 있다.
예컨대 벤더는 외부 서비스로부터 또는 외부 서비스로 가는 인증 요청에 대해서만
traceparent를 다시 시작할 수 있다.
서비스는 traceparent 필드의 들어오는 또는 나가는 난수의 무작위성을 검증하기 위한
알고리즘과 감사 메커니즘을 정의할 수도 있다. 이 알고리즘은 서비스별이며 이 명세의 일부가 아니라는 점에
유의하라. 한 예로 현재 시계 시간에 가역 해시 함수를 적용하는 시간 기반 알고리즘이 있을 수 있다.
수신자는 시간이 합의된 경계 안에 있음을 검증할 수 있으며, 이는 난수가 요구되는 알고리즘으로 생성되었고
실제로 어떠한 개인 식별 가능 정보도 포함하지 않는다는 것을 의미한다.
tracestate 필드는 어떤 키에서도 임의의 불투명 값을 포함할 수 있다. 이 헤더의 주된 목적은
서로 다른 분산 추적 시스템 사이에서 추가적인 벤더별 추적 식별 정보를 제공하는 것이다.
벤더는 tracestate 헤더에 어떠한 개인 식별 가능 정보도 포함해서는 안 된다
MUST NOT.
개인 정보 노출에 극도로 민감한 벤더는 알 수 없는 키에 대응하는 값의 선택적 제거를 구현할 수
MAY 있다. 벤더는 여러 추적 시스템이 협력하도록 허용하는 목적을 무력화하므로
tracestate 필드를 변경해서는 안 된다 SHOULD
NOT.
벤더가 응답에 traceparent와 tracestate 헤더를 포함하면,
이러한 값이 의도치 않게 교차 출처 호출자에게 전달될 수 있다. 벤더는 추적에 참여한 시스템에
응답할 때만 이러한 응답 헤더를 포함하도록 해야 한다.
이 명세와 관련된 잠재적 보안 위험에는 정보 노출과 벤더에 대한 서비스 거부 공격, 두 가지 유형이 있다.
traceparent와 tracestate 헤더에 의존하는 벤더는
헤더 길이 및 헤더 값의 내용을 확인하는 것을 포함하여, 잠재적으로 악의적인 헤더를 파싱하기 위한 모든
모범 사례도 따라야 한다. 이러한 사례는 버퍼 오버플로와 HTML 삽입 공격을 피하는 데 도움이 된다.
개인정보 보호 절에서 언급했듯이, traceparent와
tracestate 헤더의 정보는 민감하다고 간주될 수 있는 정보를 전달할 수 있다. 예를 들어,
traceparent는 한 요청을 다른 요청과 함께 전송된 데이터와 연관시킬 수 있게 하거나,
tracestate 헤더는 호출자가 사용하는 모니터링 소프트웨어의 버전을 암시할 수 있다.
이 정보는 잠재적으로 더 큰 공격을 만드는 데 사용될 수 있다.
애플리케이션 소유자는 tracestate에 독점 정보나 기밀 정보가 저장되지 않도록
보장하거나, 외부 시스템으로 가는 요청에 tracestate가 존재하지 않도록 보장해야 한다.
공개 API를 가진 서비스에서 분산 추적이 활성화되어 있고, sampled 플래그가 설정된
모든 추적을 순진하게 계속하면, 악의적인 공격자는 추적 오버헤드로 애플리케이션을 압도하거나,
모니터링 데이터를 사용할 수 없게 만드는 trace-id 충돌을 위조하거나,
SaaS 추적 벤더에 대한 추적 비용을 증가시킬 수 있다.
추적 벤더와 플랫폼은 이러한 상황을 고려하고, 악의적이거나 잘못 작성된 호출자에 의한 모니터링 거부로부터 보호하기 위해 견제와 균형이 마련되어 있는지 확인해야 한다.
이러한 보호의 한 예로 인증된 요청과 인증되지 않은 요청에 대해 서로 다른 추적 동작을 사용하는 것이 있을 수 있다. 데이터 기록을 위한 다양한 속도 제한기도 구현될 수 있다.
애플리케이션 소유자는 traceparent와 tracestate
헤더 전송으로 이어지는 모든 코드 경로를 테스트해야 한다. 예를 들어, 단일 페이지 브라우저
애플리케이션에서는 교차 출처 요청을 보내는 것이 일반적이다. 이러한 코드 경로 중 하나가
Access-Control-Allow-Headers
[FETCH]를 사용하여 제한되는 교차 출처 호출에 의해
traceparent와 tracestate 헤더가 전송되도록 하면, 실패할 수 있다.
이 절은 비규범이다.
이 절은 플랫폼 또는 추적 벤더가 trace-id 생성 및 전파 알고리즘을 구현할 때
고려할 몇 가지 모범 사례를 제안한다. 이러한 사례는 서로 다른 시스템 간의 더 나은
상호 운용성을 보장한다.
trace-id의 값은 전역적으로 고유해야 SHOULD 한다. 이 필드는
일반적으로 분산 추적을 고유하게 식별하는 데
사용된다. 분산 추적이 예를 들어
클라우드 서비스와 같은 다양한 구성 요소에 걸쳐 확장되는 것은 일반적이다.
클라우드 서비스는 다양한 클라이언트에 서비스를 제공하는 경향이 있으며
매우 높은 요청 처리량을 가진다. 따라서 trace-id의 전역 고유성은,
로컬 고유성이 좋은 해결책처럼 보이는 경우에도 중요하다.
무작위로 생성된 trace-id 값은 전역적으로 고유한 식별자를 생성하는
다른 알고리즘보다 선호되어야 SHOULD 한다.
trace-id의 무작위성은 원치 않는 정보 노출에 대한 일부
보안 및 개인정보 보호
우려를 다룬다. 또한 무작위성은 추적 벤더가 trace-id 필드 값을 기반으로
샘플링 결정을 내리고 추가 샘플링 컨텍스트 전파를 피할 수 있게 한다.
random-trace-id 플래그가 설정된 경우,
trace-id의 가장 오른쪽 7바이트 이상은
[0..2^56-1] 구간에서 균등 분포로 무작위(또는 의사 무작위) 선택되어야
MUST 한다.
다음 절에 표시된 것처럼, trace-id의 일부가 무작위가 아닌 경우,
기존 일부 시스템과 더 나은 상호 운용성을 위해 trace-id의 무작위 부분은
가능한 한 trace-id의 오른쪽에 있는 것이 중요하다.
16바이트보다 짧은 trace-id를 사용하지만
이 명세를 채택할 의향이 있는 추적 시스템이 있다.
그러한 시스템이 완전히 준수하는 trace-id를 전파할 수 있다면,
내부 목적을 위해 더 짧은 비준수 식별자를 여전히 요구하더라도,
시스템은 추가 내부 식별자를 전파하기 위해 tracestate 헤더를
활용하는 것이 권장된다. 그러나 시스템이 내부 식별자를 완전히 준수하는
trace-id의 기반으로 사용하는 것을 선호한다면, 이는
trace-id의 가장 오른쪽 부분에 포함되어야 SHOULD 한다. 예를 들어 추적
시스템은 234a5bcd543ef3fa53ce929d0e0e4736을 trace-id로 수신할 수 있으나,
내부적으로는 53ce929d0e0e4736을 식별자로 사용할 것이다.
trace-id 전체 16바이트를 전파할 수 없는 추적 시스템이 있다.
이러한 기존 시스템과 완전히 준수하는 시스템 간의 더 나은 상호 운용성을 위해,
다음 사례가 권장된다.
trace-id를 생성해야 할 때, 원래 식별자를 0으로 왼쪽 패딩해야
SHOULD 한다. 예를 들어 식별자
53ce929d0e0e4736은 trace-id 값
000000000000000053ce929d0e0e4736으로 변환되어야
SHOULD 한다. 결과 trace-id 값이
random-trace-id 플래그의 제약 조건을 만족하지 않으면, 플래그는
0으로 설정되어야 MUST 한다.
trace-id를 더 짧은 식별자로 변환해야 할 때, trace-id의 가장 오른쪽 부분이
이 식별자로 사용되어야 SHOULD 한다. 예를 들어 들어오는 요청에서 trace-id 값이
234a5bcd543ef3fa53ce929d0e0e4736이었다면, 추적 시스템은
53ce929d0e0e4736 값을 가진 식별자를 사용해야 SHOULD 한다.
추적 시스템이 다른 분산 추적 컨텍스트 전파 형식을 W3C
Trace Context로 변환할 때도 유사한 변환이 예상된다. 더 짧은
식별자는 16바이트 trace-id로 변환될 때 0으로 왼쪽 패딩되어야
SHOULD 하며, trace-id의 가장 오른쪽 부분은 더 짧은
식별자로 사용되어야 SHOULD 한다.
trace-id 전체를 전파할 수 없는 많은 기존 시스템은
tracestate 헤더도 전파하지 않는다는 점에 유의하라. 그러나 이러한 시스템도
해당 시스템이 알고 있는 추가 데이터를 전파하기 위해 tracestate 헤더를 사용할 수 있다.
예를 들어 일부 시스템은 분산 추적을 기록해야 하는지 여부를 나타내는 두 개의 플래그를 사용한다.
이 경우 하나의 플래그는 traceparent 헤더의 sampled 플래그로
전송될 수 있으며, tracestate는 추가 플래그를 보내고
받는 데 사용될 수 있다. 준수 시스템은 이 플래그를 다른 모든 키/값 쌍과 함께 전파한다.
tracestate 전파가 불가능한 기존 시스템은 tracestate의
모든 추가 값을 잘라내고 해당 플래그만 전달할 것이다.
이 절은 비규범이다.
이 절은 서로 다른 시스템 간 상호 운용성을 보장하기 위해
span-id 생성 알고리즘을 구현할 때 고려할 몇 가지 사례를 제안한다.
span-id의 값은 분산 추적 안에서 고유해야
SHOULD 한다.
span-id 값이 분산 추적 안에서 고유하지 않으면,
분산 추적 안의 span 간 부모-자식 관계가
모호해질 수 있다.
span-id의 값은 무작위로 생성되어야 SHOULD 한다.
span-id의 무작위성은 원치 않는 정보 노출에 대한 일부
보안 및 개인정보 보호
우려를 다룬다.
또한 무작위성은 보장은 아니지만 높은 확률로 분산 추적 안에서의
고유성을 보장한다.
이 작업에 기여한 Adrian Cole, Christoph Neumüller, Daniel Khan, Erika Arnold, Fabian Lange, Matthew Wear, Philippe Le Hegaret, Reiley Yang, Ted Young, Tyler Benson, Victor Soares에게 감사한다.
이 절은 비규범이다.
Referenced in: