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

サービス連携の”謎解き”を可能にするDatadogによる分散トレース導入の第一歩

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for hirosi1900day hirosi1900day
July 26, 2025
240

 サービス連携の”謎解き”を可能にするDatadogによる分散トレース導入の第一歩

SRE NEXT 2025

Avatar for hirosi1900day

hirosi1900day

July 26, 2025
Tweet

Transcript

  1. サービス間の分散トレース情報連携の主な方式(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と相性が良い。
  2. Inject/Extractを使えば、環境変数を変えるだけで、tracecontext 形式・datadog形式・両対応など、柔軟に伝搬形式を切り替えられ ます。 ヘッダー伝搬形式の切り替え( ddtrace) • DD_TRACE_PROPAGATION_STYLE ◦ Inject/Extract両方に適用 ◦

    デフォルトは datadog,tracecontext(両対応) • DD_TRACE_PROPAGATION_STYLE_INJECT / ..._EXTRACT ◦ 各々個別に指定も可能 → Inject/Extractを使えば、簡単に複数の形式(ddtrace形式・tracecontext形 式など)に対応させることができ、形式を意識しなくてよくなる
  3. • TextMapWriter Interface は Set メソッドを持っていて、トレースコンテキ ストを HTTP ヘッダーに詰めるときに使う。 •

    TextMapReader Interface は ForeachKey メソッドを持っていて、HTTP ヘッダーから トレースコンテキストを取り出すときに使う。 https://github.com/DataDog/dd-trace-go/blob/0e41cff05e9ed88c9ace780284322acbcbc37574/ddtrace/tracer/propagator.go#L25-L38
  4. 今回は HTTPHeadersCarrier を使用したが... • Inject / Extract で使う Carrier(キャリア) は

    TextMapWriter / TextMapReader インターフェースを満たしていれば OK • そのため、自作の構造体を使ってカスタマイズした Carrier を作ることも可能
  5. • Tracerの Inject や Extract によるトレースコンテキストの詰め替え処理は、実 際には Propagator が担当します。 •

    Propagator は、トレースコンテキストを HTTP ヘッダー(HTTP Header Carrier 使用時)に埋め込む・取り出すロジックを持ちます。 • Propagatorの処理ではCarrier の set メソッドを使って、ヘッダーにトレース情 報を書き込み、foreachKey メソッドを使って、ヘッダーからトレース情報を読 み取ります。
  6. まとめ • サービス間連携 ◦ トレース情報を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を実 装することも可能です。