traceparent デコーダー — W3C Trace Context
16進数の桁を数える必要はもうありません。無料のオンライン traceparent デコーダー。ブラウザ内で動作し、何もアップロードしません。trace ID、span ID、trace-flags の8ビット全部、tracestate 検証、Datadog・X-Ray・B3 変換に対応。
- バージョン
00- Trace ID
4bf92f3577b34da6a3ce929d0e0e4736- Parent ID(span ID)
00f067aa0ba902b7- Trace flags
01
| ビット | マスク | 名前 | 状態 |
|---|---|---|---|
| 0 | 0x01 | sampled | 1 |
| 1 | 0x02 | random-trace-id | 0 |
| 2 | 0x04 | reserved | 0 |
| 3 | 0x08 | reserved | 0 |
| 4 | 0x10 | reserved | 0 |
| 5 | 0x20 | reserved | 0 |
| 6 | 0x40 | reserved | 0 |
| 7 | 0x80 | reserved | 0 |
これらはビット AND で読んでください。バイト全体を 01 と比較すると、予約ビットも持つトレースを誤って判定します。
- x-datadog-trace-id
11803532876627986230- x-datadog-tags: _dd.p.tid
4bf92f3577b34da6- x-datadog-parent-id
67667974448284343- AWS X-Ray trace ID
1-4bf92f35-77b34da6a3ce929d0e0e4736- b3 (single header)
4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-1- X-B3-TraceId
4bf92f3577b34da6a3ce929d0e0e4736- X-B3-SpanId
00f067aa0ba902b7- X-B3-Sampled
1
Datadog は trace ID の下位64ビットを10進文字列で、上位64ビットを16進のタグで運びます。128ビット全体を10進で渡すのが、ログの trace ID が UI で何も見つけられない典型的な原因です。
X-Ray の ID は32ビットのタイムスタンプを埋め込みますが、W3C の trace ID はタイムスタンプを一切持ちません。下の日付は、その識別子が本当に X-Ray 由来である場合にだけ意味を持ちます。
| # | キー | 値 | 状態 |
|---|---|---|---|
| 1 | rojo | 00f067aa0ba902b7 | OK |
| 2 | congo | t61rcWkgMzE | OK |
traceparent の形式:フィールド解剖
| フィールド | 16進の桁数 | バイト数 | 意味 | 無効な値 |
|---|---|---|---|---|
| version | 2 | 1 | 形式のバージョン。今日は常に 00 で、ff は禁止です。 | ff |
| trace-id | 32 | 16 | トレース全体を端から端まで識別します。 | オールゼロ |
| parent-id | 16 | 8 | リクエストではなく、呼び出し元の span を識別します。 | オールゼロ |
| trace-flags | 2 | 1 | 8ビットのフィールド——ブール値ではなく1ビットずつ読みます。 | — |
trace-flags の値:00・01・02・03 の意味
| 16進 | 2進 | sampled | random-trace-id | 意味 |
|---|---|---|---|---|
| 00 | 00000000 | 0 | 0 | 上流がサンプリングしないと判断——自分のサービスではなく呼び出し元を見てください。 |
| 01 | 00000001 | 1 | 0 | 通常どおり記録。ほとんどの場合に目にする値です。 |
| 02 | 00000010 | 0 | 1 | ランダムな trace ID を表明していますが、サンプリングはされていません。 |
| 03 | 00000011 | 1 | 1 | 記録済みで、trace ID が一様乱数であることも表明されています。 |
bit 0 — 呼び出し元がこのトレースを記録しました。落ちている場合は、意図して記録しないと決めたということです。
bit 1 — Level 2:trace ID の右端7バイトが一様乱数です。
bit 2-7 — 予約。受信時は無視し、送信時はクリアする必要があります。
W3C Trace Context 勧告と Level 2 の勧告候補を直接参照して実装し、仕様が挙げる有効・無効のすべての形をパーサーの単体テストでカバーしています。
traceparent ヘッダーとは?
traceparent は、分散トレースをあるサービスから次のサービスへ運ぶ HTTP ヘッダーです。標準化される前は、トレーシングのベンダーがそれぞれ独自のヘッダーでコンテキストを伝播していたため、システムをまたいだリクエストは境界で身元を失っていました。W3C Trace Context 仕様は、あえて小さく設計したひとつの形式でこれを解決しました。version-trace-id-parent-id-trace-flags——ハイフンでつないだ4つの16進フィールドで、現行バージョンでは合計55文字です。
各フィールドの役割はひとつだけです。version は今日では常に 00 で、ff は明確に禁止されています。trace-id はリクエスト全体を端から端まで識別する16バイトで、どのホップでも変わりません。parent-id は直前の呼び出し元の span を識別する8バイトなので、trace-id と違ってホップごとに変わります。混乱が集中するのは trace-flags のバイトです。01 が圧倒的に多いためブール値のように見えますが、実体は8ビットです。ビット0が sampled。ビット1は Trace Context Level 2 で追加された random-trace-id で、trace ID の右端7バイトが一様乱数であることを表明し、下流のシステムがそれを使ってサンプリングやシャーディングを行えるようにします。残る6ビットは予約領域です。だからこそこのフィールドは、等値比較ではなくビット AND で読まなければなりません。
対になるヘッダー tracestate は、ベンダー独自のキーと値の組を隣で運びます。上限は32メンバーです。この上限は、エッジでは存在していたベンダーのデータが数ホップ先では消えているという不可解な症状を説明します。リストが上限を超えた時点で、中間装置がエントリーを落とし始めるからです。このヘッダーが本当に普遍的になったのは OpenTelemetry が採用してからでした。このページはそのすべて——フィールド、ビット、tracestate のメンバー、他の伝播形式での対応する識別子——を、どこにも何も送らずに解析します。
# The header as it travels on the wire
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
tracestate: rojo=00f067aa0ba902b7,congo=t61rcWkgMzE
# Read the four fields apart
# version 00
# trace-id 4bf92f3577b34da6a3ce929d0e0e4736 (16 bytes, whole request)
# parent-id 00f067aa0ba902b7 (8 bytes, calling span)
# trace-flags 01 (bit 0 set = sampled)
# Send one yourself
$ curl -H 'traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01' \
https://example.com/api 主な機能
全フィールドを分解してコピーできる
version・trace-id・parent-id・trace-flags がそれぞれ専用の行とコピーボタンを持ちます。32文字の trace ID をクエリに持ち出すのに、慎重なドラッグではなくクリック1回で済みます。
trace-flags を8ビットとして読む
フラグのバイトを16進マスク付きで8つの位置すべてに展開します。ビット0は sampled、ビット1は Level 2 の random-trace-id フラグ、そして予約ビットも黙って捨てずに表示します。
Datadog・X-Ray・B3 への変換
下位64ビットの10進 Datadog trace ID、それと一緒に運ばれる上位64ビットのタグ、X-Ray の 1-{8}-{24} 形式、そして B3 の単一ヘッダーと複数ヘッダーの両方——すべて BigInt で計算するのでオーバーフローしません。
判定だけでなく診断まで
オールゼロの trace ID はトレーシングが初期化されなかったことだと説明し、落ちた sampled ビットは上流の判断だと説明します。目の前がどちらなのかを見分けることが、たいていデバッグ作業のすべてです。
32メンバー上限つきの tracestate
メンバーごとにキーと値を検証して一覧表示し、仕様の上限に対する件数を数えます——ベンダーのデータが数ホップ下流で消える理由になっている、あの上限です。
ブラウザの外に何も出ない
解析は依存関係もネットワーク呼び出しもない、通常の文字列処理と BigInt の計算だけです。これはビルドごとの自動契約テストで検証されています。リンクのコピーは送信されない URL フラグメントを使います。
traceparent の解析例
仕様書そのものの例を解析する
00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
version 00 · trace-id 4bf92f3577b34da6a3ce929d0e0e4736 · parent-id 00f067aa0ba902b7 · trace-flags 01 (sampled)
ハイフン区切りの4フィールドで、version 00 では合計55文字です。trace-id はリクエストが通過するすべてのサービスを貫いてリクエスト全体を識別します。parent-id ——一般に span ID と呼ばれるもの——は直前の呼び出し元だけを識別するため、trace-id と違ってホップごとに変わります。末尾の 01 はブール値ではなく1バイトです。ビット0が立っているので、呼び出し元はこのトレースを記録しました。
trace-flags 00 — 呼び出し元が記録しないと判断した
00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00
有効なヘッダー · sampled ビットは0
このヘッダーは完全に有効で、そこが重要です。sampled ビットが落ちているのは上流からの指示であって、自分のサービスの欠陥ではありません。呼び出してきた側が自分のサンプラーを評価し、記録しないことを選んだのです。ここで自分の設定を掘って欠けた span を探すと何時間も溶けます。問うべきは、どのサービスが親 span を送りながらこのトレースをサンプリングしないと決めているのか、です。
オールゼロの trace ID はトレースが始まっていない証拠
00-00000000000000000000000000000000-00f067aa0ba902b7-01
無効 — trace-id がオールゼロ
仕様はオールゼロの trace-id を無効と定め、traceparent 全体を無視するよう求めています。実務上それが何を示すかを知っておく価値があります。「まだデータのないトレース」ではなく、初期化されなかった SDK か、プレースホルダーのヘッダーを注入しているミドルウェアです。オールゼロの parent-id にも同じ規則が当てはまります。
同じ trace ID を Datadog の形式で見る
00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
x-datadog-trace-id 11803532876627986230 · _dd.p.tid 4bf92f3577b34da6
Datadog は128ビット trace ID の下位64ビットを10進文字列として運び、上位64ビットは別のタグに16進のまま入れます。128ビット全体を10進に直して渡すと、何にも一致しない数値になります——各トレーサーの issue で同じ変換の質問が繰り返し立つのはこのためです。ここでの下位半分は a3ce929d0e0e4736 で、64ビットは JavaScript の number が保持できる範囲を超えるため、このページでは BigInt で計算しています。
traceparent デコーダーの使い方
- 1
traceparent ヘッダーを貼り付ける
生のヘッダー値をそのまま入れてください。例:00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01。解析は入力に合わせて進むので、押すボタンはありません。
- 2
4つのフィールドを分けて読む
version・trace-id・parent-id・trace-flags がそれぞれ独立した行に分かれ、行ごとにコピーボタンが付きます。32文字を手で選択しなくても、trace ID だけをクエリに持ち出せます。
- 3
フラグを1ビットずつ確認する
trace-flags のバイトはマスク付きで8ビットすべてに展開されます。sampled と Level 2 の random-trace-id フラグが、2文字の値の中に埋もれず個別に見えます。
- 4
使っているバックエンドの形式へ変換する
Datadog・AWS X-Ray・B3 の2形式が下に生成されます。Datadog が期待する下位64ビットの10進 trace ID と、それに伴う上位64ビットのタグも含まれます。
- 5
tracestate を足して結果を共有する
tracestate ヘッダーを貼るとメンバーが1件ずつ検証付きで一覧化され、32メンバーの上限に対する件数も出ます。あとはリンクをコピーで、今の状態をそのまま URL にしてチケットに貼れます。
traceparent でよくある間違い
フラグのバイト全体を 01 と比較する
8ビットのフィールドを列挙値として扱っています。サンプリング済みで、かつ Level 2 の random-trace-id フラグも持つトレースは flags が 03 になり、等値比較は未サンプリングと報告します。
if (traceFlags === 0x01) { record(); } if (traceFlags & 0x01) { record(); } 128ビット全体をひとつの10進数に変換する
Datadog は下位64ビットを10進で、上位64ビットを別タグの16進で期待します。値全体をひとつの10進数として渡すと、何にも一致しない識別子になります。
x-datadog-trace-id: 100985939111033328018442752961257817910
x-datadog-trace-id: 11803532876627986230 x-datadog-tags: _dd.p.tid=4bf92f3577b34da6
00 以外のバージョンをすべて拒否する
仕様はパーサーに対し、より高いバージョンから認識できる範囲を読み、末尾のフィールドを許容するよう求めています。即座に拒否するとトレースが張り直され、境界をまたぐつながりが切れます。
if (version !== '00') throw new Error('bad traceparent'); if (version !== '00' && header.length >= 55) { /* parse the known prefix */ } 大文字の16進を出力する
文法が認めるのは小文字だけです。大文字の trace ID は値としては正しくても準拠した受信側には拒否されるため、目視では特に見つけにくいバグになります。
traceparent: 00-4BF92F3577B34DA6A3CE929D0E0E4736-00F067AA0BA902B7-01
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
traceparent デコーダーでできること
- トレースに span がない理由を突き止める
- 受け取ったヘッダーを貼って sampled ビットを読みます。落ちていれば、そのトレースはもともと記録される予定がなく、答えは自分の計装ではなく呼び出し元にあります。この切り分けだけで、自分のサンプラー設定を洗う時間が大きく浮きます。
- バックエンドで見つからないトレースを探す
- アプリのログからコピーした trace ID が Datadog で何も返さないとき、たいていは形式が原因です。ここで変換すれば、API が期待する下位64ビットの10進識別子と、それに添える必要のある上位64ビットのタグが分かります。
- ゲートウェイが注入するヘッダーを検証する
- プロキシやサービスメッシュは受信時にトレースコンテキストを生成します。実際に届いた値を貼って、長さ・小文字の16進・非ゼロの識別子を確かめてから、下流のせいだと判断してください。
- 本番のトレースを手作業で再現する
- 実リクエストのヘッダーを取り、ステージングのエンドポイントに投げ直して同じトレースを追います。リクエストは curl コマンドビルダー で組み立て、ヘッダーをそのまま貼り込めます。
- チームにトレースコンテキストを説明する
- このページのフィールド解剖表と trace-flags 表は、そのまま指し示せる静的な参照資料です。プリセットのチップを使えば、誰かがサービスを壊さなくても各異常系を実演できます。
W3C Trace Context バリデーターの仕組み
- 4フィールドの文法
- version "-" trace-id "-" parent-id "-" trace-flags で、すべて小文字の16進です。version は2桁、trace-id は32桁、parent-id は16桁、trace-flags は2桁——16進52桁とハイフン3個で、version 00 ではちょうど55文字になります。値が正しく見えても大文字の16進はヘッダーを無効にします。またオールゼロの trace-id と parent-id は、空ではなく明示的に無効です。
- trace-flags はビットフィールド
- ビット0(マスク 0x01)は sampled で、立っていれば呼び出し元がトレースデータを記録した可能性があります。ビット1(マスク 0x02)は Level 2 で導入された random-trace-id で、立っている場合は trace-id の少なくとも右端7バイトが一様分布の乱数で選ばれている必要があり、下流のシステムはそれを使ってサンプリングやシャーディングができます。ビット2から7は予約で、受信時は無視し、送信時はクリアしなければなりません。予約ビットが存在しうる以上、このフィールドはビット AND で判定する必要があります。0x01 との等値比較は、予約ビットも立っているサンプリング済みトレースを取りこぼします。
- 将来バージョンへの前方互換性
- version は今日 00 で ff は禁止ですが、それ以外をすべて拒否するパーサーは誤りです。仕様は、バージョンがより高くヘッダーが既知の形式以上の長さであれば、トレースを張り直すのではなく解析を試み、認識できるフィールドを読み、余分な末尾データを許容するよう受信側に求めています。このデコーダーもその規則に従い、将来のバージョンは解析に成功し、エラーではなく警告として示されます。
- 本番で効いてくる tracestate の制限
- リストメンバーは最大32件——これは文法上の厳格な上限で、これを超えるとヘッダー自体が無効になり、受信側はそれを破棄します。各キーは最大256文字で、小文字か数字で始まります。Level 2 以降、@ はテナント区切りではなく通常のキー文字です。各値は1〜256文字の印字可能 ASCII で、カンマと等号は含められず、空にもできません。キーの重複は無効ですが、空のリストメンバーは仕様が明示的に認めています——中間装置がエントリーを削除して残った末尾のカンマも、依然として有効なヘッダーです。これとは別に、ベンダーは結合後のヘッダーを最低512文字は伝播させるべきとされ、その予算に収めるために切り詰める際は128文字を超えるエントリーから先に落とすべきとされています——だから饒舌なベンダーのデータほど、簡潔なベンダーより先に消えるのです。
Trace Context のベストプラクティス
- フラグはビット AND で判定する
- flags == 0x01 ではなく flags & 0x01 と書いてください。8ビットのうち6ビットは将来のために予約されており、そのどれかが実運用に現れた瞬間から、等値比較はサンプリング済みトレースを誤判定し始めます。
- オールゼロの ID は壊れたパイプラインとして扱う
- 許容してよい空値ではありません。ヘッダーを拒否したうえで、トレーサーの初期化に失敗しているか、プレースホルダーを注入しているコンポーネントを探しに行ってください。
- sampled ビットが落ちていたら上流を見る
- 親ベースのサンプラーは呼び出し元の判断を伝播させます。トレースが欠けているなら、自分の設定を調べる前に、サンプリングを切った親 span を送っているサービスを特定してください。
- tracestate は短く保つ
- 32メンバーの上限は文法上の厳格な境界です——超えた時点でヘッダーは無効になります。これとは別に、結合後のヘッダーは512文字までしか伝播が保証されず、切り詰めでは128文字を超えるエントリーから先に落とされます。長い呼び出し連鎖を生き延びてほしいデータは、そもそも tracestate に置くべきではありません。
- trace ID を JavaScript の number としてログに出さない
- 128ビットの trace ID も、64ビットの Datadog 識別子でさえ、Number.MAX_SAFE_INTEGER を超えます。文字列のまま保持し、計算が必要なときだけ BigInt に変換してください。さもないと末尾の桁が静かに壊れます。
traceparent デコーダー よくある質問
traceparent ヘッダーとは何ですか?
traceparent の trace-flags 00 は何を意味しますか?
trace-flags の 01・02・03 の違いは何ですか?
trace ID がオールゼロになるのはなぜですか?
W3C の trace ID を Datadog の trace ID に変換するには?
traceparent にタイムスタンプは含まれますか?
貼り付けたヘッダーはどこかへ送信されますか?
このデコーダーはオフラインでも使えますか?
関連ツール
すべてのツールを見る →cURLコマンドジェネレーター&ビルダー
Web と API
ブラウザでcurlコマンドを作成 — メソッド・ヘッダー・認証・ボディを設定してすぐにコピーできるコマンドを生成。Bearer・POST JSON・ファイルアップロードのプリセットも搭載。無料・プライバシー保護・登録不要。
htpasswd ジェネレーター — bcrypt・Apache MD5(apr1)・Basic認証
Web と API
bcrypt・Apache MD5(apr1)・SHA-1 などで htpasswd エントリーを生成。Apache・nginx・Docker 設定をすぐに貼り付けられる形式で出力。100% ブラウザ完結・アップロード不要。
Open Graph・メタタグ ジェネレーター
Web と API
Open Graph、Twitter Card、SEO メタタグをまとめて生成。Google・Facebook・X のライブプレビュー付き。100% 無料・ブラウザ内処理・登録不要で、コードをそのままコピー&ペーストできます。
nginx location テスター — なぜそのブロックが勝つのか
Web と API
どの nginx location ブロックが選ばれ、他はなぜ負けたのかを表示。=、^~、~、~* の優先順位を検証できる無料オンラインテスター。
AES復号ツール — OpenSSL・CryptoJS互換
セキュリティツール
AESをオンラインで復号 — GCM/CBC/CTR、パスフレーズまたは生鍵に対応し、OpenSSLとCryptoJSの「U2FsdGVkX1」形式を自動検出します。処理は100%ブラウザ内で完結し、鍵がこのページから出ることはありません。
AES暗号化ツール — GCM・CBC・CTR対応
セキュリティツール
無料のAESオンライン暗号化ツール — AES-128/192/256、GCM/CBC/CTR、パスフレーズ(PBKDF2)または生鍵に対応。処理は100%ブラウザ内で完結し、外部にアップロードされません。