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

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

Avatar for hirosi1900day hirosi1900day
July 26, 2025
83

 サービス連携の”謎解き”を可能にする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を実 装することも可能です。