Slide 1

Slide 1 text

ログから Trace を 気合で繋げる技術 Japan Datadog User Group Meetup #21 ALB Aug.26 2026 - Hayato Kawai (@fohte) © 2026 Wantedly, Inc.

Slide 2

Slide 2 text

自己紹介 名前 ふぉーて) 川井 颯人 (Hayato Kawai) Fohte ( 所属 ● ウォンテッドリー株式会社 / Infra Squad ● Japan Datadog User Group アカウント ●  @fohte ●  @fohte © 2026 Wantedly, Inc.

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

この発表はサマーインターンの成果です 卒向け 就業型サマーインターンを 実施しました ● 28 実運用環境の課題に 2 週間で取り組んでもらう ○ 今年は Kubernetes、Terraform、Istio、Datadog APM といったテーマで募集しました ○ 清水健吾さん (@ciesle) ● 「ALB のアクセスログから APM trace に飛べるように する」という課題に 2 週間取り組んでもらいました ○ 今日話すのはその成果です ○ © 2026 Wantedly, Inc.

Slide 6

Slide 6 text

持ち帰ってほしいこと は APM trace に飛べる ● ALB のアクセスログから飛べるようにするには工夫が必要 ● Datadog Logs © 2026 Wantedly, Inc.

Slide 7

Slide 7 text

CONTENTS とログはどう繋がっているのか 02 ALB のログを trace と繋げたい 03 Wantedly ではどう繋いだか 01 trace © 2026 Wantedly, Inc.

Slide 8

Slide 8 text

01 trace とログはどう繋がっているのか © 2026 Wantedly, Inc.

Slide 9

Slide 9 text

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.

Slide 10

Slide 10 text

ヘッダが無ければ別々の 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

Slide 11

Slide 11 text

ヘッダを読み書きしているのは tracer ● tracer = 各言語に入れる計装ライブラリ。Datadog なら ddtrace を作り、ヘッダを読み書きする ○ ログにも自動で trace_id 属性を入れる ○ span © 2026 Wantedly, Inc.

Slide 12

Slide 12 text

ログと trace は trace_id 属性で繋がっている アプリのログ trace_id = abc123 tracer が自動で入れている © 2026 Wantedly, Inc. 同じ id ◀―――▶ 飛べる APM trace trace_id = abc123 tracer が作った span

Slide 13

Slide 13 text

02 ALB のログを trace と繋げたい © 2026 Wantedly, Inc.

Slide 14

Slide 14 text

ALB のログには trace_id 属性が無い ALB access log trace_id 属性が無い に Datadog の tracer は いないので入れてくれない ALB © 2026 Wantedly, Inc. 紐づく id が無い ✕ 飛べない APM trace trace_id = abc123 tracer が作った span

Slide 15

Slide 15 text

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 読む 読む 読まない

Slide 16

Slide 16 text

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 フラグ 固定値

Slide 17

Slide 17 text

繋ぐには両側の id を揃える必要がある ALB access log trace_id = abc123 ログに trace_id 属性を作る © 2026 Wantedly, Inc. 同じ id ◀―――▶ 飛べる APM trace trace_id = abc123 span を ALB 由来の trace に乗せる

Slide 18

Slide 18 text

ログ側は 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.

Slide 19

Slide 19 text

ログ側はできた。まだ 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 で始めさせないと、繋ぐ相手がいない

Slide 20

Slide 20 text

03 Wantedly © 2026 Wantedly, Inc. ではどう繋いだか

Slide 21

Slide 21 text

k8s 上で多数のマイクロサービスが動いている この構成にサービスメッシュとして Istio を入れているので、全 Pod に istio-proxy (Envoy) がいる 出典: Technical Overview - Wantedly Dev Docs © 2026 Wantedly, Inc.

Slide 22

Slide 22 text

最初に 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.

Slide 23

Slide 23 text

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.

Slide 24

Slide 24 text

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.

Slide 25

Slide 25 text

繋がった ALB access log © 2026 Wantedly, Inc. の 1 行から APM trace へジャンプできるようになった

Slide 26

Slide 26 text

持ち帰ってほしいこと は APM trace に飛べる ● ALB のアクセスログから飛べるようにするには工夫が必要 ● Datadog Logs © 2026 Wantedly, Inc.

Slide 27

Slide 27 text

We're hiring! を支える技術基盤をつくる インフラエンジニア / SRE 募集 Wantedly wantedly.com/projects/522096 © 2026 Wantedly, Inc.