分散トレーシングとは
分散トレーシングは、複数のサービスやサーバーに渡る処理のリクエストがどのように経路をたどり、どの地点でどれほどの時間を要したかを記録し追跡する手法です。特に
マイクロサービスアーキテクチャにおいて、リクエストは多くのサービスを経由して処理されます。そのため、処理結果の追跡がより複雑になりがちです。
この技術を用いることで、リクエストごとに一意の識別子を割り当て、サービス間でその識別子を渡しながら処理記録を一貫した流れに再構成します。これにより、「分散トランザクションでは何が起こったのか」を明らかにすることが可能になります。分散トレーシングは、
オブザーバビリティ(可観測性)の3本柱、すなわちログ、メトリクス、トレースの中でトレースに該当します。
仕組み
分散トレーシングの基本的な単位は「トレース」と「スパン」です。トレースは、リクエストがアプリケーション内を辿る経路全体を表し、スパンは処理の各区間を示します。スパンには、データベースへの問い合わせや他のサービス呼び出しなど、具体的な処理情報が記録されます。各スパンには、開始時刻、終了時刻、親スパンの識別子などの情報が含まれ、これによってスパン同士が親子関係を持ち、木構造が形成されます。
コンテキスト伝播
異なるサービス間でトレースを組み立てるには、ある処理がどのトレースのどのスパンに属するかを示す情報を渡す必要があります。このプロセスを「コンテキスト伝播」と呼びます。具体的には、トレースIDやスパンIDをHTTPヘッダーなどのメタデータに埋め込み、それをサービス間で転送します。この形式はW3Cによって「Trace Context」として標準化されており、traceparentとtracestateという2つの要素が含まれています。
サンプリング
すべてのリクエストのトレーシング情報を保存するのはデータ量面で負担が大きいため、実際の運用では「サンプリング」が用いられます。これは、リクエストの一部のみを記録する手法で、事前に処理の開始時点で記録の可否を判断するシンプルな方式や、処理完了後に内容を見てから決める方式もあります。
歴史
分散トレーシングの概念は2010年に
Googleが発表した論文「Dapper」に商品展開され、その後、多くのオープンソースプロジェクトが登場しました。2012年には
TwitterがDapperを基にしたZipkinを公開し、2015年には
UberがJaegerを開発しました。これらの技術は、特にクラウドネイティブコンピューティングにおいて重要な役割を果たしています。
活用法
分散トレーシングは、主に以下の3つの用途で利用されています。1つ目は障害の切り分けです。リクエスト途中の各サービスでの処理結果をトレースにまとめることで、失敗の原因を迅速に見つけることができます。2つ目はボトルネックの特定です。スパンの所要時間をもとに、処理遅延の原因を突き止めることが可能です。3つ目はサービス間の依存関係の可視化です。収集したトレースからどのサービスがどのサービスを呼び出しているかをビジュアルに表現できます。
主なツール
分散トレーシングのツールとしては、いくつかのオープンソースと商用サービスがあります。オープンソースではZipkinとJaegerが有名で、トレースデータの収集や可視化を行います。また、商用の分散トレーシングサービスとしては、
Datadog APM、
New Relic、Dynatrace、AWS X-Ray、
Google Cloud Traceなどがあります。これらは様々なシステム内でリクエストの経路を追跡し、監視を行うための強力なツールとなっています。