分散トレーシング — どの配送センターで遅れたか、伝票番号で追う探偵ゲーム
「注文ボタンを押してから、画面が返ってくるまで1秒もかかる」。サービスが1つなら、そのサービスのログを見れば原因を探せます。でもマイクロサービスでは、1回の注文が注文・在庫・決済・外部のカード会社と、いくつもの配送センターを渡り歩きます。どこで遅れたのかは、どのセンターの記録を見ても一部しか分かりません。
そこで、リクエストに1枚の伝票番号(トレースID)を付け、通ったセンターすべてで「何時何分に受け取り、何時何分に送り出したか」を記録します。それを並べたのが分散トレーシングのガントチャートです。図1は探偵ゲーム。遅かった注文の記録を再生し、どこが犯人かをクリックで当ててください。
一番長い棒が、犯人とは限らない
ガントチャートで一番長いのは、いつも一番上の API Gateway です。でもそれは当然で、親の棒は呼び出した子の時間をすべて含んでいるからです。犯人を探すときに見るべきなのは、棒の長さではなく、子の棒で埋まっていない「すき間」。それが、そのセンター自身が使った時間(セルフタイム)です。
たとえば注文サービスの棒が長く、その下の在庫や決済の棒が短いなら、遅いのは注文サービス自身です。逆に、下の段まで長い棒が続いていれば、いちばん深いところで長い棒が犯人です。何度か事件を解いて、この見方に慣れてみてください。
伝票番号を、次のセンターへ渡し続ける
このチャートが作れるのは、すべてのセンターが同じトレースIDを記録しているからです。サービスは別のサービスを呼ぶとき、HTTPヘッダー(traceparent など)に伝票番号を書き写して渡します。1か所でも渡し忘れると、そこから先の記録は別の注文と見分けがつかなくなり、チャートが途切れます。実際には OpenTelemetry のような道具が、この受け渡しと記録を自動で行います。
- 分散トレーシング
- 複数のサービスをまたぐ1つのリクエストの流れを、つなげて記録・可視化すること。
- トレース
- 1つのリクエストの、始まりから終わりまでの記録全体。トレースIDで束ねる。
- スパン
- トレースの中の1つの処理。開始時刻・終了時刻・親のスパンを持つ。
- セルフタイム
- スパンの時間から、子のスパンの時間を引いたもの。そのサービス自身が使った時間。
- コンテキスト伝搬
- トレースIDなどを、次に呼ぶサービスへヘッダーで渡し続けること。
- OpenTelemetry
- トレースやメトリクスを集めるための、共通の仕様と道具のセット。
まとめ
分散トレーシングは、1枚の伝票番号を全センターに渡し続け、それぞれの記録をつないで1本の流れにする仕組みです。ガントチャートでは、親の棒は子を含むので、長さではなく子で埋まっていないすき間を探します。どこで遅れたかを推理ではなく、記録で突き止められるようになります。