【ぶんさんとれーしんぐ】

分散トレーシング とは?

最終更新:
💡 マイクロサービスの「荷物追跡」

複数のサービスにまたがって処理される1つのリクエストの経路と所要時間を、共通のIDでつないで追跡・可視化する技術。マイクロサービスで遅い箇所やエラーの発生箇所を探すのに使う。

📌 このページのポイント
分散トレーシング Trace ID: abc-123 リクエスト Service A Service B Service C ウォーターフォール表示 0ms 100ms 200ms Service A 200ms Service B 150ms Service C 80ms Trace IDで各サービスのSpanを紐付けて可視化
分散トレーシングのイメージ
ひよこ ひよこ
なぜ普通のログだけじゃダメなの?
ペンギン先生 ペンギン先生
マイクロサービスでは、1つのリクエストがAPI Gateway→認証→商品→在庫→決済のように複数のサービスを通ることがあるよね。ログは各サービスに散らばっていて、どれが同じリクエストのものか、どこで遅くなったかを突き合わせるのが大変なんだ。分散トレーシングは共通のIDでそれらをつないで、1つの流れとして見せてくれるよ
ひよこ ひよこ
トレースIDとスパンIDの違いは?
ペンギン先生 ペンギン先生
トレースIDはリクエスト全体を表すID、スパンIDは各サービスの処理など1つの作業単位を表すIDだよ。スパンは「親スパン」のIDを持つから、1つのトレースの下にスパンがツリー状につながるんだ。時間軸に並べたウォーターフォール図で見ると、どのスパンに時間がかかっているかがわかりやすいね
ひよこ ひよこ
次のサービスにはどうやってIDを渡すの?
ペンギン先生 ペンギン先生
HTTPならリクエストヘッダーに入れて渡すよ。標準はW3C Trace Contextのtraceparentヘッダーで、トレースIDと呼び出し元のスパンIDなどを載せるんだ。これを「コンテキスト伝搬」と呼んで、途中のサービスが受け渡しに対応していないと、トレースがそこで途切れてしまうよ
ひよこ ひよこ
OpenTelemetryって何?
ペンギン先生 ペンギン先生
トレース、メトリクス、ログを作って集めて送るための、ベンダー中立なオープンソースの仕組みだよ。OpenTracingとOpenCensusが統合してできたんだ。データの保存や表示はしないから、JaegerやZipkin、商用サービスなど好きなバックエンドと組み合わせて使うよ
ひよこ ひよこ
導入のコツは?
ペンギン先生 ペンギン先生
まずはコード変更なしで入れられる自動計装(ゼロコード計装)で、HTTPやDB呼び出しなどライブラリの出入りを記録するのが手軽だよ。ただアプリ内部の細かい処理までは記録されないから、必要な箇所は手動で計装するんだ。量が多いならサンプリングで記録する割合を減らしてコストを抑えよう
もっと詳しく知りたい人へ

サンプリングするとエラーのトレースを見逃さない?

見逃すことがあるよ。リクエストの最初に記録するかを決める「ヘッドサンプリング」は簡単で軽い反面、あとでエラーになったトレースを必ず残せるとは限らない。トレースが終わってから判断する「テールサンプリング」なら「エラーを含むトレースは必ず残す」といった条件にできるけど、途中のデータを保持する分、実装と運用が難しくなるんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「分散トレーシング」って出てきたら「サービスをまたぐリクエストの経路と時間を、共通IDで追跡する技術」と思えればだいたいOK!
📖 おまけ:英語の意味
「Distributed Tracing」 = 分散追跡
💬 Trace(追跡する)。宅配便の追跡番号のように、リクエストが「どこを通って、どこで時間がかかったか」がわかるよ

参考資料

← 用語集にもどる