メインコンテンツへスキップ
取り込みサンプリングを使用すると、セルフマネージドの Weave インスタンス に到着するトレースのうち、保持する割合を制御し、残りを破棄できます。これにより、大量のトレースが発生するクラスターでも、指定した割合のトレースだけを保持することで、ストレージコストや処理コストの軽減に役立ちます。 このガイドでは、セルフマネージドの Weave インスタンスでこの機能を有効にする方法を説明します。
取り込みサンプリングを利用するには、サンプラーを含むバージョンの Weave サーバーが必要です。@weave.op Call のサンプリングには、Weave Python SDK 0.53.0 以降、または Weave TypeScript SDK 0.16.0 以降も必要です。エージェント スパンには SDK 要件はありません。詳細は、要件と制限事項 を参照してください。
取り込みサンプリングは、クライアント側のサンプリングとは独立しています。@weave.op デコレーターの tracing_sample_rate パラメーターでは、個々のトレース対象関数が自身の Call をサンプリングできますが、デプロイメント全体に適用されるのはサーバー側のサンプリング率のみであり、個々のクライアントがそれを変更したり無視したりすることはできません。詳細は、サンプリング率を制御する を参照してください。

取り込みサンプリングを使用する理由

デフォルトでは、Weave はアプリケーションが送信するすべてのトレースを保持します。トラフィック量が増えると、完全な記録を維持するためのコストが高くなる場合があります。取り込みサンプリングでは、トレースは保存またはスコア付けされる前にサーバー上で破棄されるため、コストは保持するトラフィックの割合にほぼ比例して増減します。 取り込みサンプリング率は、0 から 1 までの数値を設定して指定します。
  • 1.0 はすべてのトレースを保持し、サンプリングは無効です (デフォルト) 。
  • 0.1 はトレースの 10% を保持し、残りを破棄します。
  • 0.0 は、評価を除くすべてのトレースを破棄します。

取り込みサンプリングの適用対象

取り込みサンプリングは 2 種類のトラフィックに適用され、設定したレートはその両方に適用されます。
  • @weave.op デコレータからの Call。これらは Traces タブに表示されます。
  • エージェント トレース endpoint (/agents/otel/v1/traces) に送信されるエージェント スパン。これらは Agents タブに表示されます。詳細は、エージェントをトレースするを参照してください。
以下のトラフィックはサンプリングされず、常に完全な状態で保持されます。
  • Weave SDK からの評価。Weave は、これらが意図的な品質測定であり、部分的なデータで計算するとスコアが不正確になるため、保持します。
  • 生の OTel endpoint (/otel/v1/traces) に独自の OpenTelemetry ツールを使用して送信されたトレース。生の OpenTelemetry トラフィックには評価マーカーがないため、これをサンプリングすると評価が気付かないうちに除外される可能性があります。詳細は、OpenTelemetry トレースを Weave に送信するを参照してください。
  • サポートされるバージョンより前の Weave SDK バージョンからの Call。要件と制限事項を参照してください。

仕組み

サーバーは、トレースの ID と決定論的なハッシュベースのサンプリングを使用して、どのトレースを破棄し、どれを保持するかを判断します。1 つのトレースに同じ trace_id を持つ複数の Call が含まれている場合、トレースを保持するか破棄するかというサーバーの判定は、同じトレース ID を共有するネストされた Call やスパンにも及びます。トレースは全体が保持されるか、全体が破棄されるかのいずれかであり、途中まで保存されることはありません。
この判定が安定するのは、レートが固定されている間だけです。レートの変更時に処理中のトレースは、その変更をまたいで分割される可能性があります。サンプリング率は、トラフィックの少ない時間帯に変更してください。

取り込みサンプリングを設定する

取り込みサンプリングを設定するには、トレースサーバーのデプロイメントで次の環境変数を設定します。たとえば、Helm の values で設定できます。 WEAVE_INGEST_SAMPLE_RATE には、保持したいトレースの割合を設定します。たとえば 0.1 です。

任意: ドライランでプレビューする

ドライランを使用すると、実際に何かをドロップする前に、サンプリング率の効果をプレビューできます。出力されるのはサーバーのサンプリング メトリクスのみで、Datadog などのメトリクス バックエンドにカウンターとして送信されます。デプロイメントでそれらのメトリクスを収集していない場合、ドライランによる目に見える効果はないため、これをスキップしてレートを直接設定できます。 メトリクスを収集している場合は、WEAVE_INGEST_SAMPLE_RATE=0.1WEAVE_INGEST_SAMPLE_DRY_RUN=true を設定して、代表的なピーク トラフィックを含む期間 (たとえば丸 1 日) 実行してください。これにより、サーバーがどれだけのトラフィックをドロップするか、またどれだけのトラフィックがサンプリング対象外かを確認できます。続いて、WEAVE_INGEST_SAMPLE_DRY_RUN=false を設定して、トレースのドロップを開始します。 Call とエージェント スパンでは別々のカウンターが報告され、両者は異なるものをカウントしているため、合算しないでください。各カウンターには、endpoint を識別する route タグが付きます。Call カウンターは Call レコードを、エージェント カウンターはトレース全体ではなくスパンをカウントするため、各セット内の比率はトレース数ではなくメッセージ量を反映します。 以下のカウンターは Call を対象としています。 以下のカウンターはエージェント スパンを対象としています。

要件と制限事項

取り込みサンプリングを有効にする前に、次の要件、制限事項、および動作を確認してください。
  • SDK バージョン要件: サーバーがサンプリングするのは、Weave Python SDK 0.53.0 以降、または Weave TypeScript SDK 0.16.0 以降からの Call のみです。これらのバージョンでは、サーバーが trace のメッセージをグループ化し、評価 Call を認識するために使用するシグナルが追加されています。古い SDK からの Call はサンプリングされず、拒否もされないため、アプリをアップグレードするまでは、設定したレートはそれらのトラフィックに影響しません。エージェント スパンは OpenTelemetry プロトコルの一部として trace ID を持つため、そのサンプリングに SDK バージョン要件はありません。
  • サーバー バージョン: エージェント スパンのサポートは、Call のサポートより後に追加されました。すでに 1.0 未満のレートを設定している場合は、エージェント スパンをサンプリングするサーバー バージョンにアップグレードすると、同じレートでエージェント トラフィックのサンプリングも開始されます。
  • 削減効果はクライアント構成に依存します: 古い SDK や raw OpenTelemetry からのトラフィックなど、サンプリングされないトラフィックではコストは削減されません。トラフィックの多くがそれらのソースから来ている場合、削減効果はレートから想定されるほど大きくありません。まずこれを測定するには、ドライランが最適です。
  • モニターとスコアリング: ドロップされた trace は保存もスコアリングもされません。トラフィックの 100% をカバーするモニターに依存している場合は、サンプリングを有効にする前にこの点を考慮してください。
  • クライアントへのドロップ通知なし: ドロップされた trace には通常どおり成功レスポンスが返されます。クライアントには、自身の trace がドロップされたことは通知されません。