取り込みサンプリングを使用するには、サンプラーを含む Weave サーバーバージョンが必要です。
@weave.op Call のサンプリングには、Weave Python SDK 0.53.0 以降または Weave TypeScript SDK 0.16.0 以降も必要です。エージェント スパンに SDK の要件はありません。詳細は 要件と制限 を参照してください。@weave.op デコレーターの tracing_sample_rate パラメーターは、個別のトレース対象関数が独自の Call をサンプリングできるようにしますが、サーバー側のサンプリング率のみがデプロイメント全体に適用され、個別のクライアントが変更または無視することはできません。詳細は Control sampling rate を参照してください。
取り込みサンプリングを使用する理由
デフォルトでは、Weave はアプリケーションが送信するすべてのトレースを保持します。ボリュームが大きくなると、完全な記録を維持するコストが高くなる場合があります。取り込みサンプリングは、トレースをサーバー上で保存またはスコアリングされる前に破棄するため、コストはおおよそ保持するトラフィックの割合に比例します。 取り込みサンプリング率は、0 から 1 の間の数値を設定することで定義します:
1.0はすべてのトレースを保持し、サンプリングは off です (デフォルト) 。0.1はトレースの 10% を保持し、残りを破棄します。0.0は評価を除くすべてのトレースを破棄します。
取り込みサンプリングの適用対象
取り込みサンプリングは次の 2 種類のトラフィックに適用され、設定したレートは両方に適用されます。@weave.opデコレーターからの Call。これらは Traces タブに表示されます。- エージェント トレース用エンドポイント (
/agents/otel/v1/traces) に送信されるエージェント スパン。これらは Agents タブに表示されます。詳細については、エージェントをトレースする を参照してください。
- Weave SDK からの評価。評価は意図的に行う品質測定であり、一部のデータだけでスコアを計算すると正しい値にならないため、Weave はこれらをすべて保持します。
- 独自の OpenTelemetry ツールを使用して raw OTel エンドポイント (
/otel/v1/traces) に送信されたトレース。raw OpenTelemetry トラフィックには評価を示すマーカーが含まれないため、サンプリングすると評価が気付かないうちに破棄されるおそれがあります。詳細については、OpenTelemetry トレースを Weave に送信する を参照してください。 - サポートされるバージョンより古い Weave SDK からの Call。要件と制限 を参照してください。
仕組み
サーバーはトレースの ID と deterministic hash-based sampling を使用して、どのトレースをドロップし、どのトレースを保持するかを決定します。同じtrace_id を持つ複数の Call がトレースに含まれる場合、トレースを保持するかドロップするかというサーバーの判定は、同じトレース ID を共有するネストされた Call やスパンにも適用されます。トレースは全体が保持されるか全体がドロップされるかのいずれかであり、一部だけが保存されることはありません。
取り込みサンプリングの設定
取り込みサンプリングを設定するには、トレースサーバーのデプロイメントで次の環境変数を設定します。たとえば、Helm values を通じて設定します。WEAVE_INGEST_SAMPLE_RATE を、保持したいトレースの割合に設定します。たとえば 0.1 です。
オプション: dry run でプレビュー
サンプリング率の効果を、何もドロップせずにプレビューするには dry run を使用できます。出力はサーバーのサンプリング メトリクスのみで、Datadog などのメトリクス バックエンドにカウンターとして出力されます。デプロイメントでこれらのメトリクスを収集していない場合、dry run は目に見える効果がなく、スキップして直接レートを設定できます。 メトリクスを収集している場合は、代表的なピーク トラフィックをカバーする期間 (例: 丸 1 日) にWEAVE_INGEST_SAMPLE_RATE=0.1 と WEAVE_INGEST_SAMPLE_DRY_RUN=true を指定して実行し、サーバーがどの程度のトラフィックをドロップし、サンプリング対象外のトラフィックがどの程度あるかを確認します。その後 WEAVE_INGEST_SAMPLE_DRY_RUN=false を設定してトレースのドロップを開始します。
Call とエージェント スパンは別々のカウンターを報告し、2 つのセットは異なるものをカウントするため、組み合わせるべきではありません。各カウンターにはエンドポイントを識別する route タグが付いています。Call カウンターは Call レコードをカウントし、エージェント カウンターはスパンをカウントします (トレース全体ではありません) 。したがって、セット内の比率はトレース数ではなくメッセージ量を反映します。
以下のカウンターは Call を対象としています:
以下のカウンターはエージェント スパンを対象としています:
要件と制限
取り込みサンプリングを有効にする前に、以下の要件、制限、および動作を確認してください:- SDK バージョン要件: サーバーは Weave Python SDK 0.53.0 以降または Weave TypeScript SDK 0.16.0 以降からの Call のみサンプリングします。これらのバージョンは、サーバーがトレースのメッセージをグループ化し、評価 Call を認識するために使用するシグナルを追加します。古い SDK からの Call はサンプリングされず、拒否もされないため、アプリをアップグレードするまで、レートはそのトラフィックに影響しません。エージェント スパンは OpenTelemetry プロトコルの一部としてトレース ID を保持するため、それらのサンプリングに SDK 要件はありません。
- サーバーバージョン: エージェント スパンのサポートは Call のサポートの後に追加されました。すでに
1.0未満のレートを設定している場合、エージェント スパンをサンプリングするサーバーバージョンにアップグレードすると、同じレートでエージェント トラフィックのサンプリングが開始されます。 - クライアントの組み合わせによる節約: raw OpenTelemetry などの古い SDK からのトラフィックなど、サンプリングされないトラフィックはコストを削減しません。トラフィックの多くがこれらのソースからのものである場合、節約はレートが示すよりも小さくなります。dry run はこれを最初に測定する最善の方法です。
- モニターとスコアリング: ドロップされたトレースは保存もスコアリングもされません。トラフィックの 100% をカバーするモニターに依存している場合は、サンプリングを有効にする前にこれを考慮してください。
- クライアントへのドロップシグナルなし: ドロップされたトレースは通常の成功応答を受け取ります。クライアントはトレースがドロップされたことを通知されません。