トレースコンテキスト レベル 2

W3C 候補勧告草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2024/CRD-trace-context-2-20240328/
最新公開バージョン:
https://www.w3.org/TR/trace-context-2/
最新編集者草案:
https://w3c.github.io/trace-context/
履歴:
https://www.w3.org/standards/history/trace-context-2/
コミット履歴
実装報告:
https://w3c.github.io/trace-context/implementations
編集者:
Sergey Kanzhelev (Google)
Daniel Dyla (Dynatrace)
Yuri Shkuro (Meta)
J. Kalyana Sundaram (Microsoft)
Bastian Krol (IBM)
元編集者:
Nik Molnar
Alois Reitbauer
Morgan McLean
Bogdan Drutu
Daniel Khan
フィードバック:
GitHub w3c/trace-context (プルリクエスト, 新しい課題, 未解決の課題)
public-trace-context@w3.org に件名行 trace-context を付けて送信 (アーカイブ)
議論
Slack に参加しています。

概要

この仕様は、分散トレーシングのシナリオを可能にするコンテキスト情報を伝播するための、 標準 HTTP ヘッダーおよび値の形式を定義する。この仕様は、サービス間でコンテキスト情報がどのように送信および 変更されるかを標準化する。コンテキスト情報は、分散システム内の個々のリクエストを一意に識別し、 プロバイダー固有のコンテキスト情報を追加および伝播する手段も定義する。

この文書のステータス

この節は、この 文書の公開時点におけるステータスを説明する。現在の W3C 公開物の一覧およびこの技術報告書の最新版は、 https://www.w3.org/TR/ にある W3C 技術 報告書インデックスで確認できる。

この新しいバージョンでは、trace-id および span-id フィールドの生成に関する考慮事項を追加し、ランダムトレース ID フラグを追加する。

終了基準として、ワーキンググループは、テストスイートを用いて、この 仕様を採用し利用する少なくとも 2 つの実装を実証することを意図している。

この文書は、分散 トレーシングワーキンググループにより、 勧告トラックを用いた 候補勧告草案として公開された。

候補勧告としての公開は、 W3C およびそのメンバーによる承認を 意味しない。候補勧告草案は、ワーキンググループが後続の候補勧告スナップショットに 含めることを意図している、以前の候補勧告からの変更を統合する。

これは草案文書であり、いつでも他の文書により更新、置換、または廃止される可能性がある。 この文書を、作業中のもの以外として引用することは不適切である。

この文書は、 W3C 特許 ポリシーの下で活動するグループにより作成された。 W3C は、グループの成果物に関連して行われた あらゆる特許 開示の公開リストを管理している。 そのページには、特許を開示するための 手順も含まれている。ある個人が、その個人の信じるところとして 必須クレーム を含む特許について実際の 知識を有する場合、その個人は W3C 特許ポリシー第 6 節に従って情報を開示しなければならない。

この文書は、 2023年11月03日 W3C プロセス文書により管理される。

1. 適合性

非規範的とマークされた節に加え、この仕様におけるすべての作成ガイドライン、図、例、および注記は 非規範的である。この仕様におけるそれ以外のすべては規範的である。

この文書におけるキーワード MAYMUSTMUST NOTSHOULD、および SHOULD NOT は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されるとおりに解釈される。

2. 概要

2.1 問題の記述

分散トレーシングは、複数のソフトウェアコンポーネントにまたがる トランザクションを追跡、分析、デバッグするために、トレーシングツールによって実装される方法論である。 通常、分散トレースは 複数のコンポーネントを通過するため、参加するすべての システムにわたって一意に識別可能である必要がある。トレースコンテキストの伝播は、この一意の識別を渡す。現在、トレースコンテキストの 伝播は、各トレーシングベンダーによって個別に実装されている。マルチベンダー環境では、これは 次のような相互運用性の問題を引き起こす:

過去には、ほとんどのアプリケーションが単一のトレーシングベンダーによって監視され、 単一のプラットフォームプロバイダーの境界内に留まっていたため、これらの問題は大きな影響を持たなかった。現在では、 ますます多くのアプリケーションが高度に分散され、複数のミドルウェアサービスおよび クラウドプラットフォームを活用している。

現代のアプリケーションにおけるこの変化は、分散トレーシングコンテキスト伝播標準を必要としている。

2.2 解決策

トレースコンテキスト仕様は、トレース コンテキスト伝播データの交換のための、普遍的に合意された形式を定義する。このデータは trace context と呼ばれる。 トレースコンテキストは、上記で説明した問題を次のように解決する

トレースデータを伝播するための統一されたアプローチは、分散 アプリケーションの挙動への可視性を高め、問題およびパフォーマンス分析を容易にする。トレース コンテキストが提供する相互運用性は、現代のマイクロサービスベースのアプリケーションを管理するための前提条件である。

Trace Context 仕様の現行バージョンは、ブラウザー内で実行される Web アプリケーションを含む、 アプリケーションおよびサービスによる実装を対象としている。Web ブラウザーまたはユーザーエージェントは、 現時点では対象実装の範囲外である。

2.3 設計概要

トレースコンテキストは、相互運用性と ベンダー固有の拡張性をサポートする 2 つの個別の伝播フィールドに分割される:

トレーシングツールは、トレースコンテキストと相互作用する適合挙動として、2 つのレベルを提供できる:

トレーシングツールは、監視対象のコンポーネントへの個々のリクエストごとに、この挙動を変更することを選択できる。

3. Trace Context HTTP リクエスト ヘッダー形式

この節では、分散トレースコンテキストの、traceparent および tracestate HTTP ヘッダーへのバインディングを記述する。

3.1 ヘッダー間の 関係

traceparent リクエストヘッダーは、トレーシングシステム内の入力リクエストを、 すべてのベンダーが理解する共通形式で表す。次に traceparent ヘッダーの例を示す。

traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01

tracestate リクエストヘッダーは、場合によりベンダー固有の形式で parent を含む:

tracestate: congo=t61rcWkgMzE

たとえば、あるシステムのクライアントとサーバーが、Congo と Rojo という異なるトレーシングベンダーを使用しているとする。Congo システムで トレースされるクライアントは、送信 HTTP リクエストに次のヘッダーを追加する。

traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
tracestate: congo=t61rcWkgMzE

注記: この場合、tracestatet61rcWkgMzE は parent ID (b7ad6b7169203331) を Base64 エンコードした結果である。ただし、そのような操作は 必須ではない。

Rojo トレーシングシステムでトレースされる受信サーバーは、受信した tracestate を 引き継ぎ、新しいエントリーを左側に追加する。

traceparent: 00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01
tracestate: rojo=00f067aa0ba902b7,congo=t61rcWkgMzE

Rojo システムが、その traceparent の値を tracestate 内の自分のエントリーに再利用していることに気付くはずである。これは、汎用トレーシングシステムであることを意味する (独自情報は渡されていない)。それ以外の場合、tracestate エントリーは 不透明であり、ベンダー固有であり得る。

次の受信サーバーが Congo を使用する場合、そのサーバーは Rojo からの tracestate を引き継ぎ、 前のエントリーの左側に parent 用の新しいエントリーを追加する。

traceparent: 00-0af7651916cd43dd8448eb211c80319c-b9c7c989f97918e1-01
tracestate: congo=ucfJifl5GOE,rojo=00f067aa0ba902b7

注記: ucfJifl5GOE は、parent ID b9c7c989f97918e1 を Base64 エンコードしたものである。

Congo がその traceparent エントリーを書き込んだとき、それはエンコードされておらず、 これは相関付けを行う者にとって一貫性に役立つ。ただし、その tracestate エントリーの値はエンコードされ、 traceparent とは異なる。これは問題ない。

最後に、tracestate が Rojo のエントリーを元のまま保持し、右側に押し出されていることがわかる。 最左位置は、次のサーバーに対して、どのトレーシングシステムが traceparent に対応するかを知らせる。この場合、Congo が traceparent を書き込んだため、その tracestate エントリーは最左であるべきである。

3.2 Traceparent ヘッダー

traceparent HTTP ヘッダーフィールドは、トレーシングシステム内の入力リクエストを識別する。これは 4 つのフィールドを持つ:

3.2.1 ヘッダー名

ヘッダー名: traceparent

ヘッダー名は ASCII 大文字小文字不区別である。つまり、TRACEPARENTTraceParent、および traceparent は同じヘッダーとみなされる。ヘッダー名は単一の単語であり、ハイフンなどの 区切り文字を含まない。

複数のプロトコル間での相互運用性を高め、成功する統合を促進するため、 トレーシングシステムは、ヘッダー名を ASCII 小文字としてエンコードすべきである (SHOULD)。

3.2.2 traceparent ヘッダー フィールド値

この節では、[RFC5234] の Augmented Backus-Naur Form (ABNF) 記法を使用する。 これには、その文書の DIGIT ルールが含まれる。DIGIT ルールは、単一の数字文字 0-9 を定義する。

HEXDIGLC = DIGIT / "a" / "b" / "c" / "d" / "e" / "f" ; lowercase hex character
value           = version "-" version-format

ダッシュ (-) 文字は、フィールド間の区切り文字として使用される。

3.2.2.1 version
version         = 2HEXDIGLC   ; this document assumes version 00. Version ff is forbidden

Version (version) は、2 文字の ASCII 文字列としてシリアライズされる 8 ビット符号なし整数値である。 Version 255 ("ff") は無効である。この文書は、 traceparent ヘッダーの version 0 ("00") を指定する。

3.2.2.2 version-format

次の version-format 定義は、version 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.
3.2.2.3 trace-id

これはトレースフォレスト全体の ID であり、システムを通じて 分散トレース を一意に識別するために使用される。 これは 16 バイト配列として表され、たとえば 4bf92f3577b34da6a3ce929d0e0e4736 である。 すべてのバイトがゼロ (00000000000000000000000000000000) であるものは無効な 値とみなされる。

trace-id の値は、グローバルに一意であるべきである (SHOULD)。 グローバルな一意性を保証し、いくつかのプライバシーおよび セキュリティ上の考慮事項に十分な確実性で対処するための推奨方法の 1 つは、 trace-id をランダムに (または擬似ランダムに) 生成することである。 実装者は、ID の右端 7 バイト以上を ランダムに (または擬似ランダムに) 生成する trace-id 生成方法を使用すべきである (SHOULD)。 右端 7 バイトがランダムに (または擬似ランダムに) 生成される場合、対応する random trace id flag を 設定すべきである (SHOULD)。 詳細については、trace-id フィールド生成に関する 考慮事項を参照。

trace-id 値が無効である場合 (たとえば許可されていない文字を含む場合 またはすべてゼロの場合)、ベンダーは traceparent を無視しなければならない (MUST)。

3.2.2.4 parent-id

これは、呼び出し元が認識しているこのリクエストの ID である (一部のトレーシングシステムでは、これは span-id と呼ばれ、span はクライアントリクエストの実行である)。これは 8 バイト配列として表され、たとえば 00f067aa0ba902b7 である。すべてのバイトがゼロ (0000000000000000) であるものは無効な値とみなされる。

parent-id が無効である場合 (たとえば、小文字でない 16 進文字を含む場合)、 ベンダーは traceparent を無視しなければならない (MUST)。

3.2.2.5 trace-flags

これは、サンプリング、トレースレベルなどのトレーシングフラグを制御する 8 ビットフィールドである。 これらのフラグは、厳密に従うべき規則ではなく、呼び出し元から与えられる推奨である。その理由は 3 つある:

  1. 信頼されていない呼び出し元が、これらのフラグを悪意を持って設定することでトレーシングシステムを 悪用できる可能性がある。
  2. 呼び出し元にバグがあり、それがトレーシングシステムに問題を引き起こす可能性がある。
  3. 呼び出し元サービスと呼び出し先サービスの負荷の違いにより、呼び出し先がダウンサンプリングを強いられる可能性がある。

詳細は、この仕様の セキュリティに関する考慮事項 の節で確認できる。

他のフィールドと同様に、trace-flags は 16 進エンコードされる。たとえば、すべての 8 フラグが 設定されている場合は ff であり、フラグが設定されていない場合は 00 である。

これはビットフィールドであるため、フラグは単純な等価比較で解釈することはできない。 たとえば、01 (00000001) と 03 (00000011) はどちらも、sampled フラグ (00000001) が設定されているためトレースがサンプリングされたことを表し、0302 (00000010) はどちらも、 random ビット (00000010) が設定されているため trace-id の少なくとも右端 7 バイトが ランダムに (または擬似ランダムに) 生成されたことを表す。 ビットフィールドを解釈する際の一般的な誤りは、単一ビットを解釈するのではなく、 数値全体を比較することである。

次に、trace flags を適切に処理する例を示す:

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;
3.2.2.5.1 Sampled フラグ

設定されている場合、最下位ビット (右端) は、呼び出し元が トレースデータを記録した可能性があることを示す。設定されていない場合、呼び出し元は帯域外でトレースデータを記録しなかった。

分散トレーシングを分断する可能性がある記録シナリオはいくつか存在する:

  • リクエストの一部のみを記録すると、トレースが分断される。
  • すべての入力および出力リクエストに関する情報を記録することは、負荷時には非常に 高コストになる。
  • ランダムまたはコンポーネント固有のデータ収集判断を行うと、すべてのトレースにおいて断片化されたデータに つながる。

これらの問題のため、トレーシングベンダーは独自の記録判断を行っており、この目的に最適なアルゴリズムについての 合意はない。

さまざまな技法には次が含まれる:

  • 確率的サンプリング (コインを投げて 100 個の 分散トレースのうち 1 個をサンプリングする)
  • 遅延判断 (リクエストの継続時間または結果に基づいて収集判断を行う)
  • 委譲サンプリング (このリクエストに関する情報を収集する必要があるかどうかを呼び出し先に判断させる)

これらの技法がどのように実装されるかは、トレーシングベンダー固有またはアプリケーション定義であり得る。

tracestate フィールドは、特定のベンダーに固有の 記録判断 (またはその他の特定情報) を行うための多様な技法を扱うように設計されている。 sampled フラグは、ベンダー間の相互運用性を高める。これは ベンダーが記録判断を伝達し、顧客により良い体験を提供できるようにする。

たとえば、SaaS サービスが 分散トレースに参加する場合、このサービスは 呼び出し元が使用するトレーシングベンダーを知らない。このサービスは、監視またはトラブルシューティング目的で 入力リクエストの記録を生成する可能性がある。sampled フラグは、 呼び出し元によって記録対象としてマークされたリクエストに関する情報が、下流の SaaS サービスによっても記録されることを保証するために使用でき、 これにより呼び出し元は記録された各リクエストの挙動をトラブルシューティングできる。

sampled フラグには、parent-id が更新される場合にのみ 変更できることを除き、その変更に関する制限はない。

以下は、ベンダー間の相互運用性を高めるためにベンダーが使用すべき (SHOULD) 提案のセットである。

  • コンポーネントが確定的な記録判断を行った場合、この判断は sampled フラグに反映されるべきである (SHOULD)。
  • コンポーネントが記録判断を行う必要がある場合、それは sampled フラグ値を 尊重すべきである (SHOULD)。 このフラグの乱用または悪意ある使用から保護するため、 セキュリティに関する考慮事項を適用すべきである (SHOULD)。
  • コンポーネントが判断を委譲または遅延し、テレメトリーの一部のみが 記録される場合、sampled フラグは変更せずに伝播すべきである。このコンポーネントによってトレースが開始される場合、 デフォルトオプションとして 0 に設定すべきである。

ベンダーが従ってもよい (MAY) 追加のオプションが 2 つある:

  • 委譲または遅延された記録判断を行うコンポーネントは、 リクエストのサブセットについて sampled フラグを 1 に設定することで、記録の 優先度を伝達してもよい。
  • コンポーネントは、確率的サンプリングにフォールバックし、リクエストのサブセットについて sampled フラグを 1 に設定してもよい。
3.2.2.5.2 Random Trace ID フラグ

trace-flags フィールドの第 2 最下位ビットは、 random-trace-id フラグを示す。

トレースを開始または再開始する場合 (つまり、参加者が新しい trace-id を生成する場合)、次の規則が適用される:

  • そのフラグが設定されている場合、trace-id の少なくとも右端 7 バイトは、 区間 [0..2^56-1] 上の一様分布でランダムに (または擬似ランダムに) 選択されなければならない (MUST)。
  • そのフラグが設定されていない場合でも、trace-id は ランダムに (または擬似ランダムに) 生成されてもよい (MAY)。
  • 設定されていない場合、trace-idtrace 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 フィールド 生成に関する考慮事項を参照。

3.2.2.5.3 その他のフラグ

(00000100) などのその他のフラグの挙動は定義されておらず、将来の使用のために予約されている。 ベンダーはそれらをゼロに設定しなければならない (MUST)。

3.2.3 HTTP traceparent ヘッダーの例

呼び出し元がこのリクエストをサンプリングした場合の有効な 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

3.2.4 traceparent のバージョン管理

この仕様は、トレースコンテキストの将来のバージョンについて特定の見解を持つ。この仕様の現行バージョンは、 traceparent ヘッダーの将来のバージョンが現在のものに対して追加的であることを前提としている。

ベンダーは、予期しない形式のヘッダーを解析する際、次の規則に従わなければならない (MUST):

  • パススルーサービスは、バージョンを解析すべきではない。将来、ヘッダーのサイズ制限が 大きくなる可能性があることを想定し、過度に大きいヘッダーのみを許可しないようにすべきである。

  • バージョン接頭辞を解析できない場合 (2 つの 16 進文字の後にダッシュ (-) が続く形式でない場合)、実装はトレースを再開始すべきである。

  • より高いバージョンが検出された場合、実装は次を試みることにより、それを解析しようとすべきである (SHOULD):

    • ヘッダーのサイズが 55 文字より短い場合、ベンダーはその ヘッダーを解析せず、トレースを再開始すべきである。
    • trace-id を解析する (最初のダッシュから次の 32 文字まで)。 ベンダーは、その 32 文字が 16 進数であること、および その後にダッシュ (-) が続くことを確認しなければならない (MUST)。
    • parent-id を解析する (35 番目の位置にある 2 番目のダッシュから次の 16 文字まで)。ベンダーは、その 16 文字が 16 進数であり、その後にダッシュが続くことを確認しなければならない (MUST)。
    • flagssampled ビットを解析する (3 番目の ダッシュから 2 文字)。ベンダーは、その 2 文字が 文字列の末尾にあるか、またはダッシュが続くことを確認しなければならない (MUST)。

    3 つの値すべてが正常に解析された場合、ベンダーはそれらを使用すべきである。

ベンダーは、このバージョンについて未知のフィールドを解析したり、何かを仮定したりしてはならない (MUST NOT)。 ベンダーは、実装が知っている仕様の最上位バージョン (この仕様では 00) に従って新しい traceparent フィールドを構築するために、これらのフィールドを使用しなければならない (MUST)。

3.3 Tracestate ヘッダー

tracestate HTTP ヘッダーの主な目的は、異なる分散トレーシングシステム間で 追加のベンダー固有トレース識別情報を提供することであり、traceparent フィールドの 付随ヘッダーである。また、複数の分散トレーシンググラフ内におけるリクエストの位置に関する情報も伝達する。

ベンダーが traceparent の解析に失敗した場合、tracestate の解析を試みてはならない (MUST NOT)。 逆は真ではないことに注意する: tracestate の解析失敗は、 traceparent の解析に影響してはならない (MUST NOT)。

tracestate HTTP ヘッダーは、トレーシングシステムによって定義されていないプロパティに使用してはならない (MUST NOT)。 [BAGGAGE] は、 そのようなアプリケーションレベルのプロパティを定義および伝播するために使用してもよい (MAY)。

3.3.1 ヘッダー名

ヘッダー名: tracestate

ヘッダー名は ASCII 大文字小文字不区別である。つまり、TRACESTATETraceState、および tracestate は同じヘッダーとみなされる。ヘッダー名は単一の単語であり、ハイフンなどの 区切り文字を含まない。

複数のプロトコル間での相互運用性を高め、成功する統合を促進するため、 トレーシングシステムは、ヘッダー名を ASCII 小文字としてエンコードすべきである (SHOULD)。

3.3.2 tracestate ヘッダー フィールド値

tracestate フィールドは、いずれのキーにも任意の 不透明値を含んでもよい。 Tracestate は、複数のヘッダーフィールドとして送信または受信されてもよい (MAY)。 複数の tracestate ヘッダーフィールドは、 RFC9110 Section 5.3 Field Order で指定されるとおりに扱わなければならない (MUST)。 tracestate ヘッダーは、可能な場合は単一フィールドとして送信すべきである (SHOULD) が、 複数のヘッダーフィールドに分割してもよい (MAY)。 tracestate を複数のヘッダーフィールドとして送信する場合、それは RFC9110 に従って 分割されなければならない (MUST)。 複数の tracestate ヘッダーフィールドを受信する場合、それらは RFC9110 に従って単一のヘッダーに 結合されなければならない (MUST)。

この節では、[RFC5234] の Augmented Backus-Naur Form (ABNF) 記法を使用する。 これには、RFC5234 の appendix B.1 にある DIGIT ルールが含まれる。また、 RFC9110 section 5.6.3OWS ルールも含まれる。

DIGIT ルールは、数字 0-9 を定義する。

OWS ルールは、任意の空白文字を定義する。読みやすさを向上させるため、 0 個以上の空白文字が現れる可能性がある箇所で使用される。

呼び出し元は、任意の空白を単一のスペースとして生成すべきである (SHOULD)。 そうでない場合、呼び出し元は任意の空白を生成すべきではない (SHOULD NOT)。詳細は 対応する RFC を参照。

tracestate フィールド値は、コンマ (,) で区切られた list-memberslist である。list-member は、等号 (=) で区切られたキー/値ペアである。 list-member の周囲のスペースおよび水平タブは無視される。 list 内には最大 32 個の list-member を含めることができる。エントリーを追加することで tracestate リストが 32 個を超える list-members を含むことになる場合、右端の list-member をリストから削除すべきである。

空および空白のみの list member は許可される。ベンダーは空の tracestate ヘッダーを受け入れなければならない (MUST) が、それらの送信は避けるべきである (SHOULD)。 空の list member は、複数の tracestate ヘッダーが送信される場合に、ベンダーが空値を 認識することが難しいため、tracestate で許可される。空白文字も同様の理由で許可される。 一部のベンダーは、空のヘッダーの場合であっても、コンマ区切りの後に空白を自動的に注入するためである。

3.3.2.1 list

2 つの list-member を持つ list の簡単な例は、次のようになる: vendorname1=opaqueValue1,vendorname2=opaqueValue2.

list  = list-member 0*31( OWS "," OWS list-member )
list-member = (key "=" value) / OWS

list の識別子は、短い (最大 256 文字の) テキスト識別子である。

3.3.2.2 list-members

list-member は、キー/値ペアを含む。

3.3.2.2.1 Key

key は、ベンダーを記述する識別子である。

key = ( lcalpha / DIGIT ) 0*255 ( keychar )
keychar    = lcalpha / DIGIT / "_" / "-"/ "*" / "/" / "@"
lcalpha    = %x61-7A ; a-z

key は、小文字または数字で始まらなければならず (MUST)、 小文字 (a-z)、数字 (0-9)、 アンダースコア (_)、ダッシュ (-)、アスタリスク (*)、スラッシュ (/)、およびアット記号 (@) を含む最大 256 文字を含む。

3.3.2.2.2 Value

value は、最大 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

3.3.3 結合されたヘッダー値

tracestate 値は、トレースグラフのキー/値ペアの連結である。

例: vendorname1=opaqueValue1,vendorname2=opaqueValue2

キーごとに 1 つのエントリーのみが許可される。たとえば、ベンダー名が Congo であり、その システムでトレースが開始され、その後 Rojo というシステムを通過し、後で Congo に戻った場合、 tracestate 値は次のようにはならない:

congo=congosFirstPosition,rojo=rojosFirstPosition,congo=congosSecondPosition

代わりに、エントリーは最新の位置のみを含むように書き換えられる: congo=congosSecondPosition,rojo=rojosFirstPosition

詳細は tracestate フィールドの変更を参照。

3.3.3.1 tracestate の制限:

ベンダーは、結合されたヘッダーの少なくとも 512 文字を伝播すべきである (SHOULD)。 この長さには、リスト項目を区切るために必要なコンマおよび任意の空白 (OWS) 文字が含まれる。

tracestate の 512 文字を伝播することが 高コストとなるシステムが存在する。この場合、伝播される tracestate ヘッダーの最大サイズは 文書化および説明されるべきである (SHOULD)。tracestate の伝播コストは、エンドユーザー向けに 有効化される監視シナリオの価値と比較して評価すべきである (SHOULD)。

ヘッダー値の合計サイズにより tracestate が切り詰められる状況では、 ベンダーはエントリー全体を切り詰めなければならない (MUST)。長さが 128 文字を超えるエントリーを最初に削除すべきである (SHOULD)。その後、 tracestate の末尾からエントリーを削除すべきである (SHOULD)。 safe list entries、blocked list entries、またはサイズベースの切り詰めなど、その他の切り詰め戦略を 使用すべきではない (SHOULD NOT)。

3.3.4 tracestate HTTP ヘッダーの例

単一のトレーシングシステム (汎用形式):

tracestate: rojo=00f067aa0ba902b7

複数のトレーシングシステム (異なる形式を含む):

tracestate: rojo=00f067aa0ba902b7,congo=t61rcWkgMzE

3.3.5 tracestate のバージョン管理

tracestate のバージョンは、traceparent ヘッダーのバージョン接頭辞によって定義される。より高いバージョンが検出された場合、ベンダーは 可能な限り tracestate の解析を試みる必要がある。部分的に解析された tracestate キー/値ペアを使用するかどうかは、ベンダーの判断である。

3.4 traceparent フィールドの変更

traceparent ヘッダーを持たないリクエストを受信したベンダーは、送信リクエスト用に traceparent ヘッダーを生成し、実質的に新しいトレースを開始すべきである (SHOULD)。 これを行わない理由として考えられるのは、ベンダーがリクエストをサンプリングしないと判断するパフォーマンスに敏感なシナリオである。 ほとんどのシナリオでは、サンプリングしない場合でも、下流にサンプリング判断を伝播するために、ベンダーはヘッダーを生成することが期待されることに注意する。

traceparent リクエストヘッダーを受信したベンダーは、それを 送信リクエストに送信しなければならない (MUST)。送信リクエストに渡す前に、このヘッダーの値を 変更してもよい (MAY)。

伝播前に traceparent フィールドの値が変更されなかった場合、 tracestate も変更してはならない (MUST NOT)。未変更のヘッダー 伝播は、通常、プロキシなどのパススルーサービスで実装される。この挙動は、現在 分散トレーシング情報を収集しないサービスでも実装される可能性がある。

許可される変更の一覧は次のとおりである:

ベンダーは、traceparent ヘッダーに対してその他の変更を行ってはならない (MUST NOT)。

3.5 tracestate フィールドの変更

tracestate リクエストヘッダーを受信したベンダーは、それを 送信リクエストに送信しなければならない (MUST)。送信リクエストに渡す前に、このヘッダーの値を 変更してもよい (MAY)。tracestate を変更する場合、変更されていないキー/値ペアの順序は 保持されなければならない (MUST)。変更されたキーは、リストの先頭 (左側) に移動されなければならない (MUST)。

許可される変更は次のとおりである:

4. 処理モデル

この節は非規範的である。

この節は、トレーシングベンダーがトレースコンテキスト ヘッダーを持つリクエストを受信し、そのリクエストを処理し、場合によりそれを転送する場合の段階的な例を提供する。この記述は、 trace context 適合のトレーシングシステム、ミドルウェア (プロキシやメッセージング バスなど)、またはクラウドサービスを実装する際の参照として使用できる。

4.1 Trace Context リクエストヘッダーを扱うための処理モデル

この処理モデルは、トレースコンテキスト ヘッダーを変更および転送するベンダーの挙動を記述する。このモデルがどのように機能するかは、 traceparent ヘッダーを受信したかどうかに依存する。

4.1.1 traceparent を受信しない場合

traceparent ヘッダーを受信しない場合:

  1. ベンダーは、入力リクエストについて traceparent および tracestate ヘッダーを確認する。
  2. traceparent ヘッダーが受信されないため、ベンダーは現在のリクエストを表す新しい trace-id および parent-id を作成する。(注記: ベンダーが このリクエストをサンプリングせず、そのサンプリング判断を sampled フラグを介して下流に伝達したい場合、 ベンダーは実際のトレースデータに関連付けられていない trace-id および parent-id を作成してもよい (MAY)。 ベンダーは、サンプリング判断を下流に伝達しないことを決定してもよい (MAY)。)
  3. traceparent ヘッダーを伴わずに tracestate ヘッダーを受信した場合、 それは無効であり、破棄されなければならない (MUST)。
  4. ベンダーは新しい tracestate ヘッダーを作成し、新しい キー/値ペアを追加すべきである (SHOULD)。
  5. ベンダーは、送信 リクエストのために traceparent および tracestate ヘッダーを設定する。

4.1.2 traceparent を受信する場合

traceparent ヘッダーを受信する場合:

  1. ベンダーは、入力リクエストについて traceparent および tracestate ヘッダーを確認する。
  2. traceparent ヘッダーが存在するため、ベンダーは traceparent ヘッダーの version の解析を試みる。
    1. version を解析できない場合、ベンダーは新しい traceparent ヘッダーを作成し、tracestate を削除する。
    2. version 番号が tracer がサポートするものより高い場合、ベンダーは この仕様 (00) で定義される形式を使用して trace-id および parent-id を解析する。 ベンダーは、この仕様のこのバージョンでサポートされる trace-flags 値のみを解析し、 その他のすべての値を無視する。解析に失敗した場合、ベンダーは 新しい traceparent ヘッダーを作成し、tracestate を削除する。ベンダーは、 解析されなかった / 未知のすべての trace-flags を送信リクエスト上で 0 に設定する。
    3. ベンダーが version 番号をサポートする場合、trace-id および parent-id を検証する。trace-idparent-id、または trace-flags のいずれかが無効な場合、ベンダーは新しい traceparent ヘッダーを作成し、tracestate を削除する。
  3. ベンダーは tracestate ヘッダーを検証してもよい (MAY)。 tracestate ヘッダーを解析できない場合、ベンダーはヘッダー全体を破棄してもよい (MAY)。 無効な tracestate エントリーも破棄してもよい (MAY)。
  4. 各送信リクエストについて、ベンダーは次の手順を実行する:
    1. ベンダーは traceparent ヘッダーを変更しなければならない (MUST):

      • parent-id を更新する: プロパティ parent-id の値は、現在の操作の ID を表す値に 設定されなければならない (MUST)。
      • sampled を更新する: sampled の値は、 呼び出し元の記録挙動を反映する。トレースデータが記録される可能性が高い場合、 trace-flagssampled フラグの値は 1 に設定されてもよく (MAY)、そうでない場合は 0 に設定されてもよい。 フラグを設定してもトレースが記録される保証はないが、エンドツーエンドで記録されたトレースの 可能性を高める。
    2. ベンダーは tracestate ヘッダーを変更してもよい (MAY):

      • キー値を更新する: 任意のキーの値を更新できる。 変更されたキーは、リストの先頭 (左側) に移動されなければならない (MUST)。
      • 新しいキー/値ペアを追加する: 新しいキー/値ペアは リストの先頭 (左側) に追加されなければならない (MUST)。
      • キー/値ペアを削除する: 任意のキー/値ペアを 削除してもよい (MAY)。ベンダーは、自身が生成していないキーを削除 すべきではない (SHOULD NOT)。任意のキー/値ペアの削除は、他のシステムにおける相関付けを 壊す可能性がある (MAY)。
    3. ベンダーは、送信リクエストのために traceparent および tracestate ヘッダーを 設定する。

4.1.3 代替処理

上記の処理モデルは、トレースコンテキストヘッダーを処理するための完全な手順セットを記述している。 ただし、ベンダーが上記で説明された手順のサブセットのみをサポートする状況もある。 プロキシまたはメッセージングミドルウェアは、traceparent ヘッダーを変更せず、 無効なヘッダーを削除したり、 tracestate に追加情報を追加したりすることを決定してもよい (MAY)。

5. その他の通信プロトコル

トレースコンテキストは HTTP 向けに定義されているが、著者らは、それが他の通信 プロトコルにも関連することを認めている。この仕様の拡張、および外部組織によって作成された仕様は、 他のプロトコル向けのトレースコンテキストのシリアライズおよびデシリアライズの形式を定義する。これらの 拡張は、この仕様とは異なる成熟度レベルにある可能性があることに注意する。

他のプロトコル向けのトレースコンテキスト実装の詳細については、 [trace-context-protocols-registry] を参照。

6. プライバシーに関する考慮事項

下流サービスにヘッダーを伝播する要件、およびこれらのヘッダーの値を保存することは、 潜在的なプライバシー上の懸念を生じさせる。トレーシングベンダーは、個人識別可能情報またはその他の機微情報に traceparent および tracestate フィールドを使用してはならない (MUST NOT)。 これらのフィールドの唯一の目的は、トレース相関を可能にすることである。

ベンダーは、ヘッダー悪用のリスクを評価しなければならない (MUST)。この節は、 これらのヘッダーの保存および伝播に関連するリスクについて、いくつかの 考慮事項および初期評価を提供する。トレーシングベンダーは、トレーシングシステムがこれらのフィールドを潜在的に伝播または保存できるコードを実行することを 許可する前に、フィールドから機微情報を検査および削除することを選択できる。ただし、すべての変更は、 この仕様で定義される変更の一覧に適合すべきである。

6.1 traceparent フィールドのプライバシー

traceparent フィールドは、いかなる個人識別可能情報も 含んではならない (MUST NOT)。これを達成する 1 つの方法は、 個人識別可能情報を公開しない乱数 生成器を用いてすべての trace ID をランダムに生成することである。trace ID の生成に使用される任意の乱数生成器は、 入力または seed state として、潜在的に個人識別可能な情報に依存してはならない (MUST NOT)。

traceparent フィールドのもう 1 つのプライバシーリスクは、単一トランザクションの一部として行われるリクエストを 相関付ける能力である。下流サービスは、単一トランザクション内で行われる 2 つ以上のリクエストを追跡および相関付け、 あるリクエストから得られた情報に基づいて、別のリクエストの呼び出し元の身元について 推測する可能性がある。

これらの traceparent フィールドのプライバシー上の懸念は、実用的というより理論的なものであることに注意する。 リクエストを開始または受信する一部のサービスは、これらのリスクを完全に排除するために traceparent フィールドを再開始することを選択してもよい (MAY)。ベンダーは 分散トレース の再開始回数を最小化する方法を見つけ、トレーシングベンダーの相互運用性を促進すべきである (SHOULD)。再開始の代わりに、異なる技法を 使用してもよい。たとえば、サービスは上流および下流接続の信頼境界と、 任意のリクエストがもたらし得る露出レベルを定義してもよい。たとえば、ベンダーは 外部サービスから、または外部サービスへの認証リクエストについてのみ traceparent を再開始する可能性がある。

サービスは、traceparent フィールド内の入力または 出力ランダム数のランダム性を検証するためのアルゴリズムおよび監査メカニズムを定義してもよい。このアルゴリズムは サービス固有であり、この仕様の一部ではないことに注意する。1 つの例は、 可逆ハッシュ関数を現在の時計時刻に適用する時間的アルゴリズムである。受信者は、その時刻が 合意された境界内にあることを検証できる。これは、そのランダム数が必要なアルゴリズムで生成され、実際には 個人識別可能情報を含まないことを意味する。

6.2 tracestate フィールドのプライバシー

tracestate フィールドは、いずれのキーにも任意の 不透明値を含んでもよい。このヘッダーの主な目的は、 異なる分散トレーシングシステム間で追加のベンダー固有トレース識別情報を提供することである。

ベンダーは、tracestate ヘッダーにいかなる個人識別可能情報も 含めてはならない (MUST NOT)。

個人情報の露出に極めて敏感なベンダーは、未知のキーに対応する値の 選択的削除を実装してもよい (MAY)。ベンダーは tracestate フィールドを変更すべきではない (SHOULD NOT)。それは複数のトレーシングシステムが協調できるようにする目的を損なうためである。

6.3 その他のリスク

ベンダーがレスポンスに traceparent および tracestate ヘッダーを含める場合、これらの 値は意図せずクロスオリジン呼び出し元に渡される可能性がある。ベンダーは、トレースに参加したシステムに応答する場合にのみ、 これらのレスポンスヘッダーを含めるようにすべきである。

7. セキュリティに関する考慮事項

この仕様に関連する潜在的なセキュリティリスクには、情報露出と ベンダーに対するサービス拒否攻撃の 2 種類がある。

traceparent および tracestate ヘッダーに依存するベンダーは、 ヘッダー長およびヘッダー値の内容の確認を含む、潜在的に悪意のあるヘッダーを解析するためのすべてのベスト プラクティスにも従うべきである。これらのプラクティスは、バッファオーバーフローおよび HTML インジェクション攻撃を避けるのに役立つ。

7.1 情報露出

プライバシーの節で述べたように、traceparent および tracestate ヘッダー内の情報は、機微とみなされ得る情報を運ぶ可能性がある。たとえば、 traceparent は、あるリクエストを別のリクエストで送信されたデータと相関付けることを可能にする可能性があり、 また tracestate ヘッダーは、呼び出し元が使用する監視ソフトウェアのバージョンを示唆する可能性がある。 この情報は、より大きな攻撃を作成するために使用される可能性がある。

アプリケーション所有者は、独自情報または機密情報が tracestate に保存されていないことを保証するか、または外部システムへのリクエストに tracestate が存在しないことを保証すべきである。

7.2 サービス拒否

公開 API を持つサービスで分散トレーシングが有効化されており、 sampled フラグが設定された任意のトレースを単純に継続する場合、悪意のある攻撃者は トレーシングオーバーヘッドでアプリケーションを圧倒したり、監視データを使用不能にする trace-id 衝突を偽造したり、SaaS トレーシングベンダーへの 請求額を増大させたりする可能性がある。

トレーシングベンダーおよびプラットフォームは、これらの状況を考慮し、悪意あるまたは不適切に作成された呼び出し元による 監視拒否から保護するための抑制と均衡が整っていることを確認すべきである。

そのような保護の例の 1 つは、認証済みリクエストと未認証リクエストで異なる トレーシング挙動をとることであり得る。データ記録のためのさまざまなレートリミッターも実装できる。

7.3 その他のリスク

アプリケーション所有者は、 traceparent および tracestate ヘッダーの送信に至るすべてのコードパスをテストするようにしなければならない。たとえば、 シングルページブラウザーアプリケーションでは、クロスオリジンリクエストを行うことが一般的である。これらのコードパスの 1 つが、 Access-Control-Allow-Headers [FETCH] を使用して制限されるクロスオリジン呼び出しによって traceparent および tracestate ヘッダーが送信されることにつながる場合、 失敗する可能性がある。

8. trace-id フィールド生成に関する考慮事項

この節は非規範的である。

この節は、プラットフォームまたはトレーシング ベンダーが trace-id 生成および伝播アルゴリズムを実装する際に考慮すべきいくつかのベストプラクティスを提案する。 これらのプラクティスは、異なるシステム間のより良い相互運用性を保証する。

8.1 trace-id の一意性

trace-id の値はグローバルに一意であるべきである (SHOULD)。このフィールドは 通常、 分散トレースの一意な識別に使用される。 分散トレースが、たとえば クラウドサービスを含むさまざまなコンポーネントにまたがることは一般的である。 クラウドサービスは多様なクライアントにサービスを提供する傾向があり、リクエストのスループットが非常に 高い。したがって、ローカルな一意性が良い解決策に見える場合であっても、 trace-id のグローバルな一意性は重要である。

8.2 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 内で可能な限り右側にあることが重要である。

8.3 より短い内部識別子を持つ適合プラットフォームにおける trace-id の扱い

16 バイトより短い trace-id を使用するトレーシングシステムで、 それでもこの仕様を採用する意思のあるものが存在する。

そのようなシステムが、内部目的のためにより短い非適合識別子を依然として必要としながらも、 完全に適合する trace-id を伝播できる場合、 そのシステムは、追加の内部識別子を伝播するために tracestate ヘッダーを利用することが推奨される。ただし、システムが代わりに 内部識別子を完全に適合する trace-id の基礎として使用することを望む場合、それは trace-id の右端部分として組み込まれるべきである (SHOULD)。たとえば、トレーシング システムは 234a5bcd543ef3fa53ce929d0e0e4736trace-id として受信する可能性があるが、 内部的には 53ce929d0e0e4736 を識別子として使用する。

8.4 より短い識別子を使用する既存システムとの相互運用

trace-id の 16 バイト全体を伝播できない トレーシングシステムが存在する。これらの既存システムと完全適合 システムとの相互運用性を高めるため、次のプラクティスが推奨される:

  1. システムが送信メッセージを作成し、より短い識別子から完全に 適合する 16 バイトの trace-id を生成する必要がある場合、元の識別子をゼロで左埋め すべきである (SHOULD)。たとえば、識別子 53ce929d0e0e4736 は、trace-id000000000000000053ce929d0e0e4736 に変換されるべきである (SHOULD)。 結果として得られる trace-id 値が random-trace-id フラグの制約を満たさない場合、フラグは 0 に設定されなければならない (MUST)。
  2. システムが入力メッセージを受信し、16 バイトの trace-id をより短い識別子に変換する必要がある場合、trace-id の右端部分を この識別子として使用すべきである (SHOULD)。たとえば、入力リクエスト上の trace-id の値が 234a5bcd543ef3fa53ce929d0e0e4736 であった場合、トレーシングシステムは 53ce929d0e0e4736 の値を持つ識別子を使用すべきである (SHOULD)。

トレーシングシステムが他の 分散トレースコンテキスト伝播形式を W3C Trace Context に変換する場合にも、同様の変換が期待される。より短い 識別子は、16 バイトの trace-id に変換される際にゼロで左埋めされるべきであり (SHOULD)、 trace-id の右端部分は、より短い 識別子として使用されるべきである (SHOULD)。

注記: trace-id 全体を伝播できない多くの既存システムは、 tracestate ヘッダーも伝播しない。しかし、そのようなシステムでも 自身が知っている追加データを伝播するために tracestate ヘッダーを使用できる。 たとえば、一部のシステムは、分散トレースを記録する必要があるかどうかを示す 2 つのフラグを使用する。 この場合、1 つのフラグは traceparent ヘッダーの sampled フラグとして送信でき、tracestate は 追加のフラグを送信および受信するために使用できる。適合システムは、このフラグを 他のすべてのキー/値ペアとともに伝播する。 tracestate 伝播ができない既存システムは、 tracestate からすべての追加値を切り詰め、そのフラグのみを渡す。

9. span-id フィールド生成に関する考慮事項

この節は非規範的である。

この節は、異なるシステム間の相互運用性を保証するために span-id 生成アルゴリズムを実装する際に考慮すべきいくつかのプラクティスを提案する。

9.1 span-id の一意性

span-id の値は、分散トレース内で一意であるべきである (SHOULD)。 span-id の値が分散トレース内で一意でない場合、 分散トレース内の span 間の親子関係が 曖昧になる可能性がある。

9.2 span-id のランダム性

span-id の値はランダムに生成されるべきである (SHOULD)。 span-id のランダム性は、 望ましくない情報の露出に関する一部の セキュリティおよび プライバシー 上の懸念に対処する。 ランダム性はまた、保証ではないものの、高い確率で 分散トレース内の一意性を確保する。

A. 謝辞

この作業への貢献について、Adrian Cole、Christoph Neumüller、Daniel Khan、Erika Arnold、Fabian Lange、Matthew Wear、Philippe Le Hegaret、Reiley Yang、Ted Young、Tyler Benson、および Victor Soares に感謝する。

B. 用語集

この節は非規範的である。

分散トレース
分散トレースは、単一の論理操作の結果としてトリガーされ、 アプリケーションのさまざまなコンポーネントにわたって 統合されたイベントのセットである。分散トレースは、 プロセス、ネットワーク、およびセキュリティ境界を越える イベントを含む。分散トレースは、誰かが Web サイト上で アクションを開始するボタンを押したときに開始される可能性がある。この例では、 トレースは、このボタンが押されたことによって開始されたリクエストの連鎖を処理した下流サービス間で行われた 呼び出しを表す。
不透明な値
不透明な値とは、この値を生成した 分散トレース参加者によってのみ理解または何らかの方法で処理できる値を指す。 その他の参加者は、それをバイト列の blob として扱わなければならない。

C. 参考文献

C.1 規範的参考文献

[BAGGAGE]
分散コンテキストの伝播形式: Baggage. Sergey Kanzhelev; Yuri Shkuro; Daniel Dyla; J. Kalyana Sundaram. W3C. 28 February 2024. W3C Working Draft. URL: https://www.w3.org/TR/baggage/
[BIT-FIELD]
8 ビットフィールド. Wikipedia. URL: https://en.wikipedia.org/wiki/Bit_field
[FETCH]
Fetch 標準. Anne van Kesteren. WHATWG. Living Standard. URL: https://fetch.spec.whatwg.org/
[RFC0020]
ネットワーク交換のための ASCII 形式. V.G. Cerf. IETF. October 1969. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc20
[RFC2119]
RFC において要求レベルを示すために使用される キーワード. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC5234]
構文仕様のための Augmented BNF: ABNF. D. Crocker, Ed.; P. Overell. IETF. January 2008. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc5234
[RFC8174]
RFC 2119 キーワードにおける大文字と小文字の曖昧性. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC9110]
HTTP Semantics. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. IETF. June 2022. Internet Standard. URL: https://httpwg.org/specs/rfc9110.html
[trace-context-protocols-registry]
Trace Context Protocols Registry. Sergey Kanzhelev; Philippe Le Hegaret. W3C. 19 November 2019. W3C Working Group Note. URL: https://www.w3.org/TR/trace-context-protocols-registry/