Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ALB ログから Trace を気合で繋げる技術

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

ALB ログから Trace を気合で繋げる技術

Japan Datadog User Group Meetup #21 で発表した資料です。
Datadog Logs に投げた ALB のログから trace を繋げるテクニックを紹介しました。

Avatar for Hayato Kawai

Hayato Kawai

August 26, 2026

More Decks by Hayato Kawai

Other Decks in Programming

Transcript

  1. ログから Trace を 気合で繋げる技術 Japan Datadog User Group Meetup #21

    ALB Aug.26 2026 - Hayato Kawai (@fohte) © 2026 Wantedly, Inc.
  2. 自己紹介 名前 ふぉーて) 川井 颯人 (Hayato Kawai) Fohte ( 所属

    • ウォンテッドリー株式会社 / Infra Squad • Japan Datadog User Group アカウント •  @fohte •  @fohte © 2026 Wantedly, Inc.
  3. この発表はサマーインターンの成果です 卒向け 就業型サマーインターンを 実施しました • 28 実運用環境の課題に 2 週間で取り組んでもらう ◦

    今年は Kubernetes、Terraform、Istio、Datadog APM といったテーマで募集しました ◦ 清水健吾さん (@ciesle) • 「ALB のアクセスログから APM trace に飛べるように する」という課題に 2 週間取り組んでもらいました ◦ 今日話すのはその成果です ◦ © 2026 Wantedly, Inc.
  4. trace はヘッダの受け渡しで繋がっている service A を始める traceparent trace trace id =

    abc123 span id = 001 trace id ▶ service B 引き継ぐ trace id = abc123 span id = 002 traceparent ▶ service C 引き継ぐ trace id = abc123 span id = 003 は 3 つとも同じ。span id だけがサービスごとに新しく作られる © 2026 Wantedly, Inc.
  5. ヘッダが無ければ別々の trace になる ヘッダを渡す場合は trace が繋がる 渡さなかった場合は別の trace になってしまう span

    001 service A span 001 service A span 002 service B span 003 service C © 2026 Wantedly, Inc. span 002 service B span 003 service C
  6. ログと trace は trace_id 属性で繋がっている アプリのログ trace_id = abc123 tracer

    が自動で入れている © 2026 Wantedly, Inc. 同じ id ◀―――▶ 飛べる APM trace trace_id = abc123 tracer が作った span
  7. ALB のログには trace_id 属性が無い ALB access log trace_id 属性が無い に

    Datadog の tracer は いないので入れてくれない ALB © 2026 Wantedly, Inc. 紐づく id が無い ✕ 飛べない APM trace trace_id = abc123 tracer が作った span
  8. Datadog の tracer は X-Ray 形式を読まない 形式 W3C ヘッダ traceparent:

    00-abc123def4567890abc123def4567890-abc123de f4567890-01 Datadog x-datadog-trace-id: 1622050852406617073 X-Ray X-Amzn-Trace-Id: Root=1-abc123de-f4567890abc123def4567890 © 2026 Wantedly, Inc. Datadog の tracer 読む 読む 読まない
  9. X-Ray の Root は W3C の trace id に変換できる X-Amzn-Trace-Id

    (X-Ray 形式) Root=1-abc123de-f4567890abc123def4567890 ↓ 赤い部分を落とす 残る 8 hex + 24 hex = 32 hex。W3C の trace id と同じ長さ traceparent (W3C 形式) 00 バージョン 固定値 abc123def4567890abc123def4567890 trace id 32 hex 変換で得た © 2026 Wantedly, Inc. abc123def4567890 span id 新しく作る 01 フラグ 固定値
  10. 繋ぐには両側の id を揃える必要がある ALB access log trace_id = abc123 ログに

    trace_id 属性を作る © 2026 Wantedly, Inc. 同じ id ◀―――▶ 飛べる APM trace trace_id = abc123 span を ALB 由来の trace に乗せる
  11. ログ側は Datadog の Log Pipeline で組める X-Amzn-Trace-Id: Root=1-abc123de-f4567890abc123def4567890 ↓ ①

    Grok Parser 文字列を分解する processor。 abc123de Root=1-… から 8 hex と 24 hex を切り出す と f4567890abc123def4567890 ↓ ② String Builder 属性を組み立てる processor。切り出した 2 つを連結して 32 hex にする abc123def4567890abc123def4567890 ↓ ③ Trace ID Remapper 予約属性 を指定する processor。属性名を trace_id に するだけでは紐付かない trace_id trace_id = abc123def4567890abc123def4567890 © 2026 Wantedly, Inc.
  12. ログ側はできた。まだ trace 側が残っている ALB access log trace_id = abc123 Log

    Pipeline で ALB の id から作った trace © 2026 Wantedly, Inc. この id を持つ trace が無い ✕ 飛べない APM trace trace_id = zzz999 tracer が ALB とは無関係に作った id 側を ALB の id で始めさせないと、繋ぐ相手がいない
  13. 最初に span を作るのは istio-proxy ALB X-Amzn-Trace-Id app を付ける ▶ istio-proxy

    最初に span を作る X-Amzn-Trace-Id は 読まない ▶ app の trace id を 引き継ぐ istio-proxy 側で trace を作り直しても、istio-proxy の span が別の trace に取り残される © 2026 Wantedly, Inc.
  14. istio-proxy istio-proxy に介入できる場所は 3 つしかない がリクエストを受信 app へ転送 ① span

    が生まれる前に ② span を生成する処理に ③ span が生まれた後に traceparent を書き込む 介入する traceparent を書き換える ◯ istio-proxy はその ✕ trace id は生成時に確定し、 ✕ span はもう別の trace id。 traceparent の trace id で 後から変える API が無い 出口で tracer に上書きされる span を作る istio-proxy の span 自体を ALB の trace に乗せたいので、残るのは ① だけ © 2026 Wantedly, Inc.
  15. span より前に走れるのは early_header_mutation だけ ✕ HTTP filter Envoy のリクエスト処理に差し込む plugin

    ✕ dynamic module Envoy ✕ に読ませる自前の共有ライブラリ 独自の C++ filter Envoy 本体に組み込む拡張 で書ける。ただし span 生成より後に走るので、 書いても出口で上書きされる Lua / Wasm これも span 生成より後。加えて Istio 1.31 以降でしか使えない istio-proxy 自体のビルドと差し替えが必要になる ◯ early_header_mutation ヘッダを受け取った直後、span 生成を含む Envoy 本体のどの HCM (Envoy が HTTP を捌く本体) の拡張点 処理よりも前に走る ⚠ 公式ドキュメントに「本番での稼働実績が十分でない」と 明記されている拡張。使うなら注意 © 2026 Wantedly, Inc.
  16. 繋がった ALB access log © 2026 Wantedly, Inc. の 1

    行から APM trace へジャンプできるようになった