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