このドキュメントでは、サンプリングのコンセプトについて説明します。これは、スパンのデータが Cloud Trace に送信されるかどうかを参照します。スパンのデータが Cloud Trace に送信されると、そのスパンがサンプリングされます。トレース内のすべてのスパンのデータが記録されると、トレースが完了します。ただし、分散トレース システムの計測されたコンポーネントごとに、処理中のスパンを記録するかどうかが個別に決定されるため、トレースで欠落するスパンがあることがよくあります。
処理中のスパンをサンプリングするかどうかは各コンポーネントで決まりますが、その決定は親のサンプリングの決定の影響を受ける可能性があります。たとえば、「親スパンをサンプリングする場合は、現在のスパンをサンプリングし、それ以外の場合はスパンの 50% をサンプリングする」というルールがすべてのコンポーネントにあるとします。このシナリオでは、次のことが当てはまります。
- ルートスパンは、トレース内のすべてのスパンをサンプリングするかどうかを決定します。
- ルートスパンがサンプリングされると、トレース内のすべてのスパンがサンプリングされます。したがって、トレースが完了しています。
コンポーネントは、コンテキストを使用してサンプリングの決定を子に渡すことができます。たとえば、World Wide Web Consortium(W3C)の traceparent
ヘッダーでは、sampled
フラグに親のサンプリング決定が保存されます。
サンプリングとコンテキストの伝播を混同しないでください。サンプリングとは、コンポーネントがスパンに関するデータを記録するかどうかを指します。コンテキストの伝播とは、スパン ID など、スパンに関する情報が子コンポーネントに渡されるかどうかを指します。
サンプリング戦略
サンプリングの決定は、ヘッドベースとテールベースのいずれかです。ヘッドベースのサンプリングでは、スパンを処理するコンポーネントがリクエストを受信したときにサンプリングの決定が行われます。テールベースのサンプリングでは、トレース全体が使用可能になるまでサンプリングの決定が遅れます。
分散トレース システムのドキュメントで「100% サンプリング」というフレーズが出現する場合があります。このフレーズは、トレースまたはコンポーネントに対して適用します。トレースに適用した場合、すべてのスパンがサンプリングされた、または同等に、トレースが完了したことを意味します。コンポーネントに適用した場合、コンポーネントは、処理するすべてのスパンにサンプリングすることを意味します。
ヘッドベースのサンプリング
ヘッドベースのサンプラーは通常、常にスパンをサンプリングするか、確率的サンプリング戦略を用いるように構成されています。
常にサンプリングの構成では、スパンを提供し、トレースデータを書き込めるすべてのコンポーネントが、処理するスパンをサンプリングします。理想的には、すべてのトレースが完了しているため、障害のトラブルシューティングに必要な情報があります。このタイプの構成では、割り当てまたはストレージ費用の上限を超える場合があります。
確率的サンプリングでは、すべてのスパンがサンプリングされるわけではありません。この方法の実際の動作は、コンポーネントの実装によって異なります。一部の実装では、すべてのスパンのサンプリングされる確率は同じです。それ以外では、親のサンプリング決定が、スパンがサンプリングされるかどうかに影響します。
トレースにすべてのスパンが含まれない場合があります。これは、確率的サンプリングの使用のために予想される場合もあれば、割り当てまたは、リクエストを処理するがスパンをサンプリングしないコンポーネントが原因である場合もあります。
テールベースのサンプリング
Cloud Trace はテールベースのサンプリングをサポートしていません。サンプリングの決定は、Cloud Trace にデータを送信するコンポーネントで行う必要があります。
テールベースのサンプリングを使用する場合、サンプリング情報の決定後にデータを Cloud Trace に中継するトレース情報を受信する中間サーバーを使用できます。たとえば、OpenTelemetry Collector を Tail Sampling Processor と使用することで、遅延サンプリングの決定を行うことができます。
テール サンプリングを使用する場合は、次の点を考慮してください。
- サンプリングを行う前に、すべてのスパンをトレースに保存する必要があります。そのため、大量の一時ストレージが必要になる、または他のオーバーヘッドが発生する場合があります。
- 一般に、トレースのスパンを生成できるすべてのコンポーネントを調整する必要があります。通常、OpenTelemetry を使用するデベロッパーは、同じトレース ID のすべてのスパンを同じコレクタに転送します。
サンプリングと Google Cloud サービス
各 Google Cloud サービスは独自のサンプリング決定を行います。すべての Google Cloud サービスがサンプリングするわけではありません。つまり、サービスが Cloud Trace にデータを決して送信しない場合があります。
サンプリングが Google Cloud サービスでサポートされている場合、通常、そのサービスでは次のものを実装します。
- デフォルトのサンプリング レート。
- 親のサンプリング決定を、スパンをサンプリングするかどうかのヒントとして使用するメカニズム。
- 最大サンプリング レート。
Google Cloud サービスにサンプリングのサポートを追加をリクエストするには、Google Issue Tracker を使用します。
次のステップ
スパン名別にサンプリング戦略を選択することを可能にする方法については、Jaeger リモート サンプリングをご覧ください。
次のオープンソース ドキュメントを確認して、開発中のアプリケーションとデプロイ済みのアプリケーションに最適なサンプリング アプローチを決定することをおすすめします。
Google Cloud サービスのドキュメント: