FIG-118

分散トレーシング — どの配送センターで遅れたか、伝票番号で追う探偵ゲーム

分散システム 2026.10.02 公開 読了 約10分

「注文ボタンを押してから、画面が返ってくるまで1秒もかかる」。サービスが1つなら、そのサービスのログを見れば原因を探せます。でもマイクロサービスでは、1回の注文が注文・在庫・決済・外部のカード会社と、いくつもの配送センターを渡り歩きます。どこで遅れたのかは、どのセンターの記録を見ても一部しか分かりません。

そこで、リクエストに1枚の伝票番号(トレースID)を付け、通ったセンターすべてで「何時何分に受け取り、何時何分に送り出したか」を記録します。それを並べたのが分散トレーシングのガントチャートです。図1は探偵ゲーム。遅かった注文の記録を再生し、どこが犯人かをクリックで当ててください。

DISTRIBUTED TRACING — 1つの伝票番号で、全センターの記録をつなぐ
🚪 API Gateway trace 4bf9…
🧾 注文サービス trace 4bf9…
📦 在庫サービス trace 4bf9…
🗄 在庫DB trace 4bf9…
💳 決済サービス trace 4bf9…
🏦 カード会社(外部) trace 4bf9…
🕵️
事件 #1: 注文に時間がかかった trace_id 4bf92f3577b34da6 / 合計 —
正解した事件 0 / 0
きみの推理 —
図1 — 棒1本が1つの「スパン」。下の段は、上の段の中から呼ばれた処理。答えると、赤で「そのセンター自身が使った時間」が表示される

一番長い棒が、犯人とは限らない

ガントチャートで一番長いのは、いつも一番上の API Gateway です。でもそれは当然で、親の棒は呼び出した子の時間をすべて含んでいるからです。犯人を探すときに見るべきなのは、棒の長さではなく、子の棒で埋まっていない「すき間」。それが、そのセンター自身が使った時間(セルフタイム)です。

たとえば注文サービスの棒が長く、その下の在庫や決済の棒が短いなら、遅いのは注文サービス自身です。逆に、下の段まで長い棒が続いていれば、いちばん深いところで長い棒が犯人です。何度か事件を解いて、この見方に慣れてみてください。

伝票番号を、次のセンターへ渡し続ける

このチャートが作れるのは、すべてのセンターが同じトレースIDを記録しているからです。サービスは別のサービスを呼ぶとき、HTTPヘッダー(traceparent など)に伝票番号を書き写して渡します。1か所でも渡し忘れると、そこから先の記録は別の注文と見分けがつかなくなり、チャートが途切れます。実際には OpenTelemetry のような道具が、この受け渡しと記録を自動で行います。

用語ミニ辞書
分散トレーシング
複数のサービスをまたぐ1つのリクエストの流れを、つなげて記録・可視化すること。
トレース
1つのリクエストの、始まりから終わりまでの記録全体。トレースIDで束ねる。
スパン
トレースの中の1つの処理。開始時刻・終了時刻・親のスパンを持つ。
セルフタイム
スパンの時間から、子のスパンの時間を引いたもの。そのサービス自身が使った時間。
コンテキスト伝搬
トレースIDなどを、次に呼ぶサービスへヘッダーで渡し続けること。
OpenTelemetry
トレースやメトリクスを集めるための、共通の仕様と道具のセット。

まとめ

分散トレーシングは、1枚の伝票番号を全センターに渡し続け、それぞれの記録をつないで1本の流れにする仕組みです。ガントチャートでは、親の棒は子を含むので、長さではなく子で埋まっていないすき間を探します。どこで遅れたかを推理ではなく、記録で突き止められるようになります。