APMエージェントのサンプラーは、特定のサービス内のどのトランザクションをエージェントがNew Relicに送信するかを制御します。このページでは、アダプティブやトレースID比率ベースなどのサンプラーのタイプ、アダプティブサンプリングのターゲット、およびアップストリームのサンプリング決定に基づいてサンプリングを設定する方法について説明します。
このガイドの設定例では、YAML形式を使用しています(Javaエージェント)。エージェント固有の構文および完全なパラメーターリファレンスについては、以下をご覧ください:
サンプリングの仕組み サンプリング決定のステップ サンプリングの決定は5つのステップで行われます:
リクエストがサービスに到達します。 エージェントはサンプリングコンテキストを確認します:これはルートトランザクションですか、それともアップストリームサービスがすでにサンプリングの決定を行いましたか? エージェントは、コンテキストと設定に基づいて適切なサンプラーを適用します。 エージェントはサンプリング決定を行います:サンプリングするか、しないか。 エージェントは、ディストリビューティッド(分散)トレーシングコンテキストヘッダーを介して、ダウンストリームサービスに決定を伝播します。 サンプラーのコンテキスト APMエージェントは、さまざまなトレースのシナリオを処理するために3つのサンプリングコンテキストを使用します。各コンテキストには、独自のサンプラー設定を含めることができます。
コンテクスト 適用される場合 使用事例 ルート ディストリビューティッド(分散)トレーシングは現在のサービスから開始されます このサービスから開始されるトレースのサンプリングを制御します 遠隔地の親がサンプリングされている アップストリームサービスがすでにこのトレースをサンプリングしている アップストリームサービスがサンプリングしたトレースのトレーシングを制御します 遠隔地の親がサンプリングされていない アップストリームサービスは、このトレースをサンプリングしない ことを決定しました アップストリームサービスが拒否したトレースのサンプリングの制御
ルートコンテキスト When it applies :ディストリビューティッド(分散)トレースは現在のサービスから開始されています(これがディストリビューティッド(分散)トレースの最初のサービスです)。
Example scenario :APIゲートウェイは、顧客のrequestsのエントリポイントです。これらの顧客主導のトレースの20%をキャプチャするようにルートサンプリングを設定します。
遠隔地の親がサンプリングされているコンテキスト When it applies :アップストリームサービスが、このディストリビューティッド(分散)トレーシングをサンプリングすることを決定しました(アップストリームサービスは、ディストリビューティッド(分散)トレーシングコンテキストで「sampled」というサンプリング決定を送信しました)。
Common pattern :アップストリームサービスがディストリビューティッド(分散)トレーシングをサンプリングした場合、現在のサービスでも常にサンプリングします:
Alternative pattern :アップストリームサービスによってすでにサンプリングされたトレースの一定の割合をサンプリングします:
注意 アップストリームの"サンプリング済み"の決定を上書きすると、一部のサービスのみが存在する断片化されたトレースが作成される可能性があります。アップストリームでサンプリングされたトレースを破棄する特定の必要がある場合にのみ、このパターンを使用してください。
遠隔地の親がサンプリングされていないコンテキスト When it applies :アップストリームサービスが、このディストリビューティッド(分散)トレーシングをサンプリングしない ことを決定しました(アップストリームサービスは、トレースコンテキストで「not sampled」というサンプリング決定を送信しました)。
Common pattern :アップストリームサービスがディストリビューティッド(分散)トレーシングをサンプリングしなかった 場合、現在のサービスでは絶対にサンプリングしないでください:
remote_parent_not_sampled :
Alternative pattern :アップストリームがサンプリングしないことを選択した場合でも、一部のディストリビューティッド(分散)トレーシングをサンプリングします(注意して使用してください):
remote_parent_not_sampled :
注意 アップストリームの"サンプリングされていない"決定を上書きすると、一部のサービスのみが存在する断片化されたトレースが作成される可能性があります。アップストリームがサンプリングしなかった場合でも、ダウンストリームサービスのアクティビティを確認する特定の必要がある場合にのみ、このパターンを使用してください。
サンプラーのタイプ APMエージェントは4つのサンプラーのタイプを提供しており、それぞれ異なるシナリオに適しています。
サンプラーのタイプ 使い方 最適な用途 適応型 トラフィック量に関係なく、1分あたりの固定数のトレースをターゲットにします トラフィックの急増に関係なく、一貫した数のトレース トレースID比率ベース トレースIDに基づいて、固定割合のトレースをサンプリングします。 トラフィックの割合としてのサービス間の決定論的サンプリング 常時オン すべてのトランザクションをサンプリングします 特定のコンテキストに対する完全なトレースカバレッジ 常にオフ トランザクションをサンプリングしません 特定のコンテキストのサンプリングを完全に無効にする
適応型サンプラー How it works :トラフィック量に関係なく、1分あたりのルートトレースのターゲット数をサンプリングするために、サービスのスループットに動的に適応します。アップストリームサービスによってサンプリングされたトランザクションを常にサンプリングし、それらを適応型サンプリングのターゲットにはカウントしません。
Default behavior :APMエージェントはデフォルトで適応型サンプラーを使用します。ほとんどのAPMエージェントのデフォルトの適応型サンプリングのターゲットは、1分あたり10トランザクションです。詳細については、各APMエージェントの設定ドキュメントをご覧ください。
When to use :
トラフィックの一定の割合ではなく、トラフィックの変動に関係なく、1分あたりにサンプリングされるトランザクションの数を一定にしたい場合。
毎分を通じてサンプリングの間隔を空けるために動的な調整が必要です。
アップストリームサービスによってサンプリングされたすべてのトランザクションをサンプリングし、それらを適応型サンプリングのターゲットにカウントしないようにしたい場合。
Configuration :
How it adapts :
低トラフィック(10 requests/分):ターゲットに到達するためにすべてのリクエストをサンプリングします
中程度のトラフィック(100 requests/分):ターゲットに到達するために、およそ5番目のrequestsごとにサンプリングします
高トラフィック(1,000 requests/分):ターゲットに到達するために約50番目のリクエストごとにサンプリングします
ヒント 適応型サンプラーは、アップストリームサービスによってサンプリングされたトレースを常にサンプリングします。これらのトレースは、設定された適応型サンプリングのターゲットにはカウントされません。
アダプティブサンプリングのターゲット アダプティブサンプリングのターゲットは、エージェントが1分間にキャプチャしようとするトレースの数を制御します。予測可能な動作を実現するには、グローバル ターゲットとコンテキスト単位 のターゲットの違いを理解することが重要です。
グローバルを設定 adaptive_sampling_target adaptive_sampling_targetはすべてのコンテキストで共有され、デフォルト のサンプリングターゲットになります。コンテキストは、グローバルなadaptive_sampling_targetを独自のコンテキスト固有のsampling_target で上書きする場合があります。
adaptive_sampling_targetは、1~120の任意の整数に設定できます。
Configuration :
adaptive_sampling_target : 10
Result :エージェントは、現在のサービスから発生するトランザクションを1分あたり約10件キャプチャしようとします。
コンテキストごとの設定 sampling_target 各サンプリングコンテキストは、独自のsampling_targetでグローバルターゲットを上書きできます。
sampling_targetは、1~120の任意の整数に設定できます。
Configuration :
adaptive_sampling_target : 10
Result :エージェントは、グローバルのデフォルトである10をオーバーライドして、現在のサービスから発生するトランザクションを1分間に5つキャプチャしようと試みます。
適応型サンプリングのターゲットを増やす理由 デフォルトの1分あたり10トレースは、ディストリビューティッド(分散)トレーシングではなく、トランザクショントレーシング用に設計されています。ディストリビューティッド(分散)トレーシングでは、次のような目的でより高いサンプリングが必要になることがよくあります:
Fill service map gaps :まれなエンドポイントは、1分あたり10件ではサンプリングされない可能性があります。
Improve trace diversity :より多くのトランザクションタイプとコードパスを確認します
トレースID比率ベースのサンプラー How it works :トレースIDに基づいて、トレースの一定割合をサンプリングします。サンプリングの決定はトレースIDに基づいているため、同じ比率サンプラーとAPM言語エージェントを使用するすべてのサービスで、同じトレースに対して同じ決定が行われます。
When to use :
サンプリングされるトラフィックの一貫した割合が必要です。
決定論的なサンプリング(同じAPM言語エージェントを使用するすべてのサービスで、同じディストリビューティッド(分散)トレーシングがサンプリングされること)が必要な場合。
アップストリームサービスによってサンプリングされたトランザクションが常にサンプリングされ、アダプティブサンプリングのターゲットにカウントされないという、アダプティブサンプラーの動作を回避したい場合。
すべてのtrace_id_ratio_basedサンプラーは、ratioに0.0(含まない)から1.0(含む)までの小数を指定する必要があります 。ratioは、キャプチャするトレースの割合を指定します。
重要 trace_id_ratio_basedサンプラーを使用する場合、ratioプロパティは必須です。比率が設定されていない場合は、代わりにデフォルトのアダプティブサンプラーが使用されます。
Configuration :
Important characteristic :トレースIDによって、トレースがサンプリングされるかどうかが決定されます。複数のサービスが同じ比率とLanguageエージェントを使用する場合、同じトレースに対して一貫した決定を下します。
Example :ルートのディストリビューティッド(分散)トレーシングの10%、およびアップストリームでサンプリングされたディストリビューティッド(分散)トレーシングの50%をサンプリングします:
常時有効サンプラー How it works :このコンテキストに一致するすべてのトランザクションをサンプリングします。
When to use :
常時無効サンプラー How it works :指定されたコンテキストのトランザクションを一切サンプリングしません。
When to use :
推奨される設定 選択できるサンプラーが非常に多いため、サービスに適切な設定を見つけるのは難しい場合があります。適切な設定を見つけるための最良の方法は、サービスが現在持っているトレースの分布を観察し、目的のトレースの分布に向けて少しずつ調整することです。
出発点として、この設定をお勧めします:
remote_parent_not_sampled :
この設定では、rootコンテキストからのトレースの10%、remote_parent_sampledコンテキストからのすべてのトレースをサンプリングし、remote_parent_not_sampledコンテキストからのトレースはサンプリングしません。
一部のアプリケーションでは、この設定はトレースのバランスの取れた分散のための妥当な出発点となります。他のアプリケーション(たとえば、ほとんどの トレースがアップストリームサービスから開始されるアプリケーションなど)では、この設定によりremote_parent_sampledトレースが過剰に優先され、rootトレースの優先度が低くなる可能性があります。その場合は、アップストリームでサンプリングされたトレースの一定の割合のみをキャプチャするようにremote_parent_sampled設定を変更してみてください:
remote_parent_not_sampled :
次のステップ サンプリングについて理解したところで:
ヒント サンプリングの設定は複雑になる場合があります。単一のパターンから始めて、実際のトレース量とニーズに基づいて反復してください。サポートアビリティメトリクスとトレースクエリを使用して、設定が期待どおりに機能していることを確認してください。