トレースのサンプリング

このドキュメントでは、サンプリングのコンセプトについて説明します。これは、スパンのデータが Cloud Trace に送信されるかどうかを参照します。スパンのデータが Cloud Trace に送信されると、そのスパンがサンプリングされます。トレース内のすべてのスパンのデータが記録されると、トレースは完了します。ただし、分散トレース システムの計測されたコンポーネントごとに、処理中のスパンを記録するかどうかが個別に決定されるため、トレースで欠落するスパンがあることがよくあります。

処理中のスパンをサンプリングするかどうかは各コンポーネントで決まりますが、その決定は親のサンプリングの決定の影響を受ける可能性があります。たとえば、「親スパンをサンプリングする場合は、現在のスパンをサンプリングし、それ以外の場合はスパンの 50% をサンプリングする」というルールがすべてのコンポーネントにあるとします。このシナリオでは、次のことが当てはまります。

  • ルートスパンによって、トレース内のすべてのスパンがサンプリングされるかどうかが決まります。
  • ルートスパンがサンプリングされると、トレース内のすべてのスパンがサンプリングされます。したがって、トレースは完了します。

コンポーネントは、コンテキストを使用してサンプリングの決定を子に渡すことができます。たとえば、World Wide Web Consortium(W3C)の traceparent ヘッダーでは、sampled フラグに親のサンプリング決定が格納されます。

サンプリングとコンテキストの伝播を混同しないでください。サンプリングとは、コンポーネントがスパンに関するデータを記録するかどうかを指します。コンテキストの伝播とは、スパン ID など、スパンに関する情報が子コンポーネントに渡されるかどうかを指します。

サンプリング戦略

サンプリングの決定は、ヘッドベースとテールベースのいずれかです。ヘッドベースのサンプリングでは、スパンを処理するコンポーネントがリクエストを受信したときにサンプリングが決定されます。テールベースのサンプリングでは、トレース全体が使用可能になるまでサンプリングの決定が遅れます。

分散トレース システムのドキュメントで「100% サンプリング」というフレーズが出現する場合があります。このフレーズは、トレースまたはコンポーネントに対して適用します。トレースに適用した場合、すべてのスパンがサンプリングされた、または同等に、トレースが完了したことを意味します。コンポーネントに適用した場合、コンポーネントは、処理するすべてのスパンにサンプリングすることを意味します。

ヘッドベースのサンプリング

ヘッドベースのサンプラーは通常、常にスパンをサンプリングするか、確率的サンプリング戦略を用いるように構成されています。

  • 常にサンプリングの構成では、スパンを提供し、トレースデータを書き込めるすべてのコンポーネントが、処理するスパンをサンプリングします。理想的には、すべてのトレースが完了しているため、障害のトラブルシューティングに必要な情報があります。このタイプの構成では、割り当てまたはストレージ費用の上限を超える場合があります。

  • 確率的サンプリングでは、すべてのスパンがサンプリングされるわけではありません。このアプローチの実際の動作は、コンポーネントの実装によって異なります。一部の実装では、すべてのスパンのサンプリングされる確率は同じです。それ以外では、親のサンプリング決定が、スパンがサンプリングされるかどうかに影響します。

トレースにすべてのスパンが含まれない場合があります。これは、確率的サンプリングの使用のために予想される場合もあれば、割り当てまたは、リクエストを処理するがスパンをサンプリングしないコンポーネントが原因である場合もあります。

テールベースのサンプリング

Cloud Trace はテールベースのサンプリングをサポートしていません。サンプリングの決定は、Cloud Trace にデータを送信するコンポーネントで行う必要があります。

テールベースのサンプリングを使用する場合、サンプリングの決定後にデータを Cloud Trace にリレーするトレース情報を受信する中間サーバーを使用できます。たとえば、OpenTelemetry CollectorTail Sampling Processor と使用することで、遅延サンプリングの決定を行うことができます。

テール サンプリングを使用する場合は、次の点を考慮してください。

  • サンプリングの決定を行う前に、すべてのスパンをトレースに保存する必要があります。そのため、大量の一時ストレージが必要になる、または他のオーバーヘッドが発生する場合があります。
  • 一般に、トレースのスパンを生成できるすべてのコンポーネントは調整する必要があります。通常、OpenTelemetry を使用するデベロッパーは、同じトレース ID のすべてのスパンを同じコレクタにルーティングします。

サンプリングと Google Cloud サービス

各 Google Cloud サービスは独自のサンプリング決定を行います。すべての Google Cloud サービスがサンプリングするわけではありません。つまり、サービスが Cloud Trace にデータを決して送信しない場合があります。

Google Cloud サービスでサンプリングがサポートされている場合、そのサービスでは通常、以下を実装します。

  • デフォルトのサンプルレート。
  • 親のサンプリング決定を、スパンをサンプリングするかどうかのヒントとして使用するメカニズム。
  • 最大サンプリング レート。

Google Cloud サービスでサンプリングのサポートを追加するには、Google Issue Tracker を使用します。

次のステップ