Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
サービス連携の”謎解き”を可能にするDatadogによる分散トレース導入の第一歩
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
hirosi1900day
July 26, 2025
330
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
急成長でぶつかったMySQLの罠とその向き合い方
hirosi1900day
13
7.1k
O11yによる可視化で実現する_チーム独立型パフォーマンス改善.pdf
hirosi1900day
0
450
育てたDevinは自立するのか?
hirosi1900day
4
1k
Featured
See All Featured
Writing Fast Ruby
sferik
630
63k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
Fireside Chat
paigeccino
42
4k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
390
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
190
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
720
Information Architects: The Missing Link in Design Systems
soysaucechin
0
970
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
Building Adaptive Systems
keathley
44
3.1k
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!