Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
サービス連携の”謎解き”を可能にするDatadogによる分散トレース導入の第一歩
Search
hirosi1900day
July 26, 2025
370
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
サービス連携の”謎解き”を可能にするDatadogによる分散トレース導入の第一歩
SRE NEXT 2025
hirosi1900day
July 26, 2025
More Decks by hirosi1900day
See All by hirosi1900day
tcpdump で追う Datastream 障害調査と Transit Gateway × VPN のリアーキテクチャ設計
hirosi1900day
1
620
急成長でぶつかったMySQLの罠とその向き合い方
hirosi1900day
13
7.6k
O11yによる可視化で実現する_チーム独立型パフォーマンス改善.pdf
hirosi1900day
0
470
育てたDevinは自立するのか?
hirosi1900day
4
1.1k
Featured
See All Featured
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
500
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
980
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The SEO Collaboration Effect
kristinabergwall1
1
550
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Paper Plane (Part 1)
katiecoart
PRO
1
11k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
270
Building AI with AI
inesmontani
PRO
1
1.2k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.8k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Transcript
徳富 博(プラットフォームエンジニアリング1G) サービス連携の”謎解き”を可能にする Datadogによる分散トレース導入の第一 歩 @yannKazu1 SRE NEXT 2025
自己紹介
自己紹介 徳富 博(@yannKazu1) - 所属: タイミー プラットフォームエンジ ニアリングチーム 1G -
好きな技術: Go, Ruby, TypeScript, AWS, … - 野菜を育ててます
分散トレーシングについて
分散トレーシングとは??
分散トレーシングは、システムをまたいだリクエストの流れをエンドツーエンドで可視化 ・追跡する技術です。
Propagator? SpanContext? Carrier? サービス間の分散トレーシングを行うとなるといろんな概念が出てきて よくわからなくなる
None
HTTP Headerはどう言う形式で送ればいい?
サービス間の分散トレース情報連携の主な方式(HTTPヘッダー、Datadogの場合) 🐶 Datadog 独自形式(datadog) • x-datadog-trace-id: <trace-id> • x-datadog-parent-id: <span-id>
• x-datadog-sampling-priority: <sampling> • Datadog APM向けのデフォルト形式 🌐 W3C Trace Context(標準規格、 tracecontext) • traceparent: <version>-<trace-id>-<span-id>- <trace-flags> • OpenTelemetryなど多くのベンダーが対 応 ⚠ B3(非推奨) 🔹 B3 Multi(b3multi) • X-B3-TraceId: <trace-id> • X-B3-SpanId: <span-id> • X-B3-ParentSpanId: <parent-span-id>(任意) • X-B3-Sampled: 0 または 1 • Zipkin互換。レガシー用途。複数ヘッダ形 式。 🔸 B3 Single(b3 single header, b3single) • b3: <trace-id>-<span-id>-<sampling> • 軽量・1ヘッダで伝播。モダンなgRPCや HTTP/2と相性が良い。
こういう実装をすれば良いのか? と思った人も多いのではないでしょうか
悪くはないがメンテナンス性はよくない • ヘッダー仕様が変わったとき毎回修正が必要 • それぞれのサービスが Datadog形式なのか、 tracecontext 形式なのかを意識して実装しないといけないのがつらい。
ddtraceには(otel sdkにもあるが省略)、トレース情報をヘッダーに埋め込 んだり取り出したりする仕組み(Inject/Extract)メソッドが用意されて いる
送信側
受信側
Inject/Extractを使えば、環境変数を変えるだけで、tracecontext 形式・datadog形式・両対応など、柔軟に伝搬形式を切り替えられ ます。 ヘッダー伝搬形式の切り替え( ddtrace) • DD_TRACE_PROPAGATION_STYLE ◦ Inject/Extract両方に適用 ◦
デフォルトは datadog,tracecontext(両対応) • DD_TRACE_PROPAGATION_STYLE_INJECT / ..._EXTRACT ◦ 各々個別に指定も可能 → Inject/Extractを使えば、簡単に複数の形式(ddtrace形式・tracecontext形 式など)に対応させることができ、形式を意識しなくてよくなる
トレース情報をヘッダーに埋め込んだり取り出したりする時 は自前実装ではなくSDKの Inject/Extractを使おう!
ところでここって何をやっているんだ?
None
None
まずはHTTPHeadersCarrier
None
• HTTPHeadersCarrierはhttp.Headerのラッパー • TextMapWirter, TextMapReaderインターフェースを満たしてい る https://github.com/DataDog/dd-trace-go/blob/cde886e584560f55306cbe0d302eb54d66b88cfc/ddtrace/tracer/textmap.go#L24-L27
• TextMapWriter Interface は Set メソッドを持っていて、トレースコンテキ ストを HTTP ヘッダーに詰めるときに使う。 •
TextMapReader Interface は ForeachKey メソッドを持っていて、HTTP ヘッダーから トレースコンテキストを取り出すときに使う。 https://github.com/DataDog/dd-trace-go/blob/0e41cff05e9ed88c9ace780284322acbcbc37574/ddtrace/tracer/propagator.go#L25-L38
今回は HTTPHeadersCarrier を使用したが... • Inject / Extract で使う Carrier(キャリア) は
TextMapWriter / TextMapReader インターフェースを満たしていれば OK • そのため、自作の構造体を使ってカスタマイズした Carrier を作ることも可能
tracer(Inject/Extract)
None
tracer.InjectはPropagator.Inejectを呼び出す https://github.com/DataDog/dd-trace-go/blob/0e41cff05e9ed88c9ace780284322acbcbc37574/ddtrace/tracer/tracer.go#L841
tracer.ExtractはPropagator.Extractを呼び出す https://github.com/DataDog/dd-trace-go/blob/0e41cff05e9ed88c9ace780284322acbcbc37574/ddtrace/tracer/tracer.go#L878
Propagator.Inejectの実装 https://github.com/DataDog/ dd-trace-go/blob/b7f198c8d bd42202c46fe191ca68b931 009ab042/ddtrace/tracer/te xtmap.go#L428-L471 TextMapWriter の Set メソッ
ドを使って、トレースコンテキ ストを HTTP ヘッダーに書き 込んでいる
Propagator.Extractの実装 https://github.com/DataDog/ dd-trace-go/blob/b7f198c8d bd42202c46fe191ca68b9310 09ab042/ddtrace/tracer/text map.go#L510-L571 TextMapReader の ForeachKey メソッドを
使って、HTTP ヘッダーか らトレースコンテキストを読 み取っている
• Tracerの Inject や Extract によるトレースコンテキストの詰め替え処理は、実 際には Propagator が担当します。 •
Propagator は、トレースコンテキストを HTTP ヘッダー(HTTP Header Carrier 使用時)に埋め込む・取り出すロジックを持ちます。 • Propagatorの処理ではCarrier の set メソッドを使って、ヘッダーにトレース情 報を書き込み、foreachKey メソッドを使って、ヘッダーからトレース情報を読 み取ります。
今回は組み込まれているPropagatorを使用してますが Propagator は インターフェースを満たしていれば何でも 指定できる。
Propagator interface の定義 https://github.com/DataDog/dd-trace-go/blob/0e41cff05e9ed88c9ace780284322acbcbc37574/ddtrace/tracer/propagator.g o#L14-L20
tracer.Start 時に WithPropagator オプションを指定することで、独自の Propagator を適用することも可能。
Propagator / Carrier を自作する場面 • Datadogが対応していないプロトコルや形式を使う場合 • トレース情報の伝搬を制御したい場合 • カスタムフォーマットが必要な場合
まとめ
まとめ • サービス間連携 ◦ トレース情報をHTTPヘッダーに手動で仕込むのではなく、各SDKが提供する Inject/Extractメソッドを使用しましょう。 ◦ これにより、環境変数(DD_TRACE_PROPAGATION_STYLE)を切り替えるだけ で、Datadog形式、tracecontext形式など柔軟にヘッダー伝搬形式に対応でき ます。
• 詳細な仕組み: PropagatorとCarrier ◦ Inject/Extractメソッドは内部でPropagatorを呼び出します。 ◦ PropagatorはSpanContextの情報をCarrier通じてHTTP Headerに 詰めたり、読み取ってSpanContextを生成する役割を担います。 ◦ Carrierは、HTTPヘッダーなどの情報伝達媒体を抽象化したラッパーであり、 TextMapWriter(書き込み用)とTextMapReader(読み取り用)インターフェース を実装します。 ◦ インターフェースを満たしていれば、カスタムのPropagatorやCarrierを実 装することも可能です。
Give distributed tracing a try!