Application Insights におけるサンプリング
サンプリングは Application Insights の機能です。 アプリケーション データの分析に関して統計的な正しさを保ちながら、テレメトリのトラフィック、データ コスト、およびストレージ コストを削減する方法として推奨されます。 サンプリングを使用すると、Application Insights によるテレメトリのスロットルを回避することもできます。 サンプリング フィルターによって関連のある項目が選択されるため、診断調査を行うときに項目間を移動できるようになります。
ポータルにメトリック カウントが表示される場合、それらはサンプリングを考慮するように再正規化されます。 それにより、統計への影響が最小限に抑えられます。
Note
- OpenTelemetry Distro を採用し、構成オプションをお探しの場合は、「サンプリングを有効にする」を参照してください。
Note
以下のドキュメントは、Application Insights クラシック API に関するものです。 Application Insights の長期的な計画は、OpenTelemetry を使用してデータを収集することです。 詳細については、「.NET、Node.js、Python、Java アプリケーション用の Azure Monitor OpenTelemetry を有効にする」と「Microsoft の OpenTelemetry ロードマップ」を参照してください。 移行ガイダンスは .NET 用、Node.js 用、Python 用があります。
簡単な概要
- サンプリングには、アダプティブ サンプリング、固定レート サンプリング、インジェスト サンプリングの 3 種類があります。
- アダプティブ サンプリングは、Application Insights ASP.NET および ASP.NET Core ソフトウェア開発キット (SDK) のすべての最新バージョンと Azure Functions で既定で有効になっています。
- 固定レート サンプリングは、ASP.NET、ASP.NET Core、Java (エージェントと SDK の両方)、JavaScript、および Python 用の Application Insights SDK の最近のバージョンで使用できます。
- Java では、サンプリング オーバーライドが利用できます。一部の依存関係、要求、正常性確認に異なるサンプリング レートを適用する必要があるときに便利です。 サンプリング オーバーライドを使用し、ノイズのある依存関係をチューニングします。一方で、たとえば、重要なエラーはすべて 100% で保持します。 この動作は固定サンプリングの形式であり、テレメトリを細かく制御できます。
- インジェスト サンプリングは、Application Insights サービス エンドポイントで機能します。 これは、他のサンプリングが有効になっていない場合にのみ適用されます。 SDK でテレメトリがサンプリングされると、インジェスト サンプリングは無効になります。
- Web アプリケーションの場合、カスタム イベントを記録しており、一連のイベントが確実にまとめて保持または破棄されるようにする必要がある場合は、それらのイベントに同じ
OperationId
値を割り当てる必要があります。 - Analytics クエリを作成する場合は、 サンプリングを考慮する必要があります。 具体的には、単純にレコードをカウントするのではなく、
summarize sum(itemCount)
を使用する必要があります。 - パフォーマンス メトリックやカスタム メトリックなど、一部のテレメトリの種類は、サンプリングが有効かどうかに関係なく、常に保持されます。
次の表は、各 SDK およびアプリケーションの種類で使用できるサンプリングの種類をまとめたものです。
Application Insights SDK | アダプティブ サンプリングのサポート | 固定レート サンプリングのサポート | インジェスト サンプリングのサポート |
---|---|---|---|
ASP.NET | はい (既定でオン) | はい | 他のサンプリングが有効になっていない場合のみ |
ASP.NET Core | はい (既定でオン) | はい | 他のサンプリングが有効になっていない場合のみ |
Azure Functions | はい (既定でオン) | いいえ | 他のサンプリングが有効になっていない場合のみ |
Java | いいえ | はい | 他のサンプリングが有効になっていない場合のみ |
JavaScript | いいえ | はい | 他のサンプリングが有効になっていない場合のみ |
Node.JS | いいえ | はい | 他のサンプリングが有効になっていない場合のみ |
Python | いいえ | はい | 他のサンプリングが有効になっていない場合のみ |
その他すべて | いいえ | 番号 | はい |
Note
- Java Application Agent 3.4.0 以降では、Application Insights にテレメトリを送信するときに、既定でレート制限付きサンプリングが使用されます。 詳細については、「レート制限付きサンプリング」を参照してください。
- このページのほとんどの情報は、Application Insights SDK の現在のバージョンに適用されます。 SDK の以前のバージョンについては、「以前の SDK バージョン」を参照してください。
サンプリングを使用する場合
一般に、ほとんどの中小規模アプリケーションでは、サンプリングは不要です。 最も役立つ診断情報や最も正確な統計は、すべてのユーザー アクティビティからデータを収集することで入手します。
サンプリングの主な利点:
- アプリが短期間に高いレートのテレメトリを送信すると、Application Insights サービスによってデータ ポイントがドロップ ("スロットル") される。 サンプリングによって、アプリケーションでスロットルが発生する可能性が減少する。
- データ ポイントを、価格レベルの クォータ 以内に抑える。
- テレメトリの収集によるネットワーク トラフィックを削減する。
サンプリングのしくみ
サンプリング アルゴリズムは、SDK または Application Insights サービスがサンプリングを実行するかどうかに関係なく、保持または削除するテレメトリ項目を決定します。 ルールに従って、相互に関連するすべてのデータ ポイントをそのままの状態に保ち、データが少なくても Application Insights が実用的で信頼性の高い診断エクスペリエンスを提供できるようにします。 たとえば、サンプルに失敗した要求が含まれている場合、例外やトレースなどの関連するすべてのテレメトリ項目が保持されます。 これにより、Application Insights で要求の詳細を表示すると、要求とそれに関連付けられているテレメトリが常に表示されます。
サンプリングの判定は、要求の操作 ID に基づいています。つまり、特定の操作に属するすべてのテレメトリ項目が保持されるか、または破棄されるかのどちらかです。 操作 ID が設定されていないテレメトリ項目 (HTTP コンテキストのない非同期スレッドから報告されたテレメトリ項目など) の場合、サンプリングでは単純に各種類のテレメトリ項目を一定の割合ずつ取り込みます。
テレメトリを表示する場合、Application Insights サービスは、不足しているデータ ポイントを補正するために、収集時に使用したものと同じサンプリング率でメトリックを調整します。 そのため、Application Insights でテレメトリを表示する場合、ユーザーは統計的に正しく、実際の数値に近い近似値を見ていることになります。
近似精度は、構成したサンプリング率に大きく左右されます。 また、多数のユーザーからの同じような要求を大量に処理するアプリケーションの場合は、近似精度が高くなります。 一方で、処理量が膨大ではないアプリケーションの場合、通常はクォータの範囲内ですべてのテレメトリを送信でき、スロットルによるデータの損失もないため、サンプリングは必要ありません。
サンプリングの種類
3 つの異なるサンプリング方法があります。
アダプティブ サンプリングでは、ASP.NET/ASP.NET Core アプリの SDK および Azure Functions から送信されるテレメトリの量が自動的に調整されます。 ASP.NET または ASP.NET Core SDK を使用する場合の既定のサンプリングです。 アダプティブ サンプリングは、現在、ASP.NET/ASP.NET Core サーバー側テレメトリおよび Azure Functions でのみ利用できます。
固定レート サンプリングは、ASP.NET、ASP.NET Core、または Java サーバーとユーザーのブラウザーの両方から送信されるテレメトリの量を削減します。 管理者がレートを設定します。 クライアントとサーバーはサンプリングを同期するので、検索では関連のあるページ ビューと要求の間を移動できます。
インジェスト サンプリングは、Application Insights サービス エンドポイントで動作します。 アプリケーションから受信したテレメトリの一部を、設定したサンプリング レートで破棄します。 インジェスト サンプリングはアプリから送信されるテレメトリのトラフィックを削減しませんが、トラフィックを月間のクォータ (上限) 以内で維持するのに役立ちます。 インジェスト サンプリングの主な利点は、アプリを再デプロイすることなくサンプリング レートを設定できることです。 インジェスト サンプリングは、すべてのサーバーとクライアントで一様に動作しますが、他の種類のサンプリングが動作している場合は適用されません。
重要
あるテレメトリの種類に対してアダプティブまたは固定レート サンプリング方法が有効になっている場合、そのテレメトリのインジェスト サンプリングは無効になります。 ただし、SDK レベルでサンプリングから除外されたテレメトリの種類は、引き続き、ポータルで設定されたレートでインジェスト サンプリングの対象となります。
アダプティブ サンプリング
アダプティブ サンプリングは、Web サーバー アプリから Application Insights サービス エンドポイントに送信されるテレメトリの量に適用されます。
ヒント
アダプティブ サンプリングは、ASP.NET SDK または ASP.NET Core SDK を使用する場合は既定で有効になり、Azure Functions でも既定で有効になります。
ボリュームは、MaxTelemetryItemsPerSecond
レート制限内に収まるように自動的に調整されます。 デバッグ中や使用率の低い場合など、アプリケーションで低いテレメトリが生成された場合、ボリュームが MaxTelemetryItemsPerSecond
未満である限り、項目は削除されません。 テレメトリ ボリュームが増加すると、ターゲット ボリュームにヒットするようにサンプリング レートが調整されます。 この調整は、定期的に、送信レートの移動平均に基づいて再計算されます。
目標の量を達成するため、生成されたテレメトリの一部は破棄されます。 他のサンプリング種類と同様に、このアルゴリズムは関連するテレメトリ項目を維持します。 たとえば、検索でテレメトリを調べているときは、特定の例外に関連する要求を検索できます。
要求レートや例外レートなどのメトリック カウントはサンプリング レートを補正するように調整され、メトリックス エクスプローラーには近似値が表示されます。
ASP.NET アプリケーション用のアダプティブ サンプリングの構成
Note
このセクションは、ASP.NET Core アプリケーションではなく、ASP.NET アプリケーションに適用されます。 ASP.NET Core アプリケーション用のアダプティブ サンプリングの構成については、このドキュメントで後述します。
ApplicationInsights.config
で、AdaptiveSamplingTelemetryProcessor
ノードのいくつかのパラメーターを調整できます。 次の図は既定値です。
<MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>
アダプティブ アルゴリズムが各サーバー ホストで収集しようとする論理演算の目標レート。 Web アプリが多数のホストで実行される場合は、Application Insights ポータルのトラフィックの目標レート内に収まるようにこの値を減らします。
<EvaluationInterval>00:00:15</EvaluationInterval>
テレメトリの現在のレートを再評価する間隔。 評価は移動平均として実行されます。 急変しやすいテレメトリの場合は、この間隔を短くすることもできます。
<SamplingPercentageDecreaseTimeout>00:02:00</SamplingPercentageDecreaseTimeout>
サンプリング率の値が変更されると、キャプチャするデータを減らすためにサンプリング率をどのくらい早く再び下げることができるかが決まります。
<SamplingPercentageIncreaseTimeout>00:15:00</SamplingPercentageIncreaseTimeout>
サンプリング率の値が変更されると、キャプチャするデータを増やすためにサンプリング率をどのくらい早く再び上げることができるかが決まります。
<MinSamplingPercentage>0.1</MinSamplingPercentage>
サンプリング率はさまざまであるため、設定できる最小値を指定します。
<MaxSamplingPercentage>100.0</MaxSamplingPercentage>
サンプリング率はさまざまであるため、設定できる最大値を指定します。
<MovingAverageRatio>0.25</MovingAverageRatio>
移動平均の計算で、最新値に割り当てる必要がある重みをこの値で指定します。 1 以下の値を使用します。 小さい値にすると、急変に対する反応が低いアルゴリズムになります。
<InitialSamplingPercentage>100</InitialSamplingPercentage>
アプリが起動するときにサンプリングするテレメトリの量。 デバッグ中はこの値を減らさないでください。
<ExcludedTypes>type;type</ExcludedTypes>
サンプリング対象にしない種類のセミコロン区切りのリスト。 認識される種類は、
Dependency
、Event
、Exception
、PageView
、Request
、Trace
です。 指定した種類のすべてのテレメトリが送信されます。指定されていない種類はサンプリングされます。<IncludedTypes>type;type</IncludedTypes>
サンプリング対象にしない種類のセミコロン区切りのリスト。 認識される種類は、
Dependency
、Event
、Exception
、PageView
、Request
、Trace
です。 指定した種類はサンプリングされます。他のすべての種類のテレメトリは常に送信されます。
アダプティブ サンプリングをオフにするには、ApplicationInsights.config
から AdaptiveSamplingTelemetryProcessor
ノードを削除します。
代替手段:コードでアダプティブ サンプリングを構成する
.config
ファイルでサンプリング パラメーターを設定する代わりに、プログラムでこれらの値を設定できます。
.config
ファイルからすべてのAdaptiveSamplingTelemetryProcessor
ノードを削除します。次のスニペットを使用してアダプティブ サンプリングを構成します。
using Microsoft.ApplicationInsights; using Microsoft.ApplicationInsights.Extensibility; using Microsoft.ApplicationInsights.WindowsServer.Channel.Implementation; using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel; // ... var builder = TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder; // For older versions of the Application Insights SDK, use the following line instead: // var builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder; // Enable AdaptiveSampling so as to keep overall telemetry volume to 5 items per second. builder.UseAdaptiveSampling(maxTelemetryItemsPerSecond:5); // If you have other telemetry processors: builder.Use((next) => new AnotherProcessor(next)); builder.Build();
テレメトリの種類ごとにサンプリング レートを個別に調整したり、特定の種類をまったくサンプリングされないように除外したりすることもできます。
// The following configures adaptive sampling with 5 items per second, and also excludes Dependency telemetry from being subjected to sampling.
builder.UseAdaptiveSampling(maxTelemetryItemsPerSecond:5, excludedTypes: "Dependency");
ASP.NET Core アプリケーション用のアダプティブ サンプリングの構成
ASP.NET Core アプリケーションは、コードで、または appsettings.json
ファイルを使用して構成できます。 詳細については、「ASP.NET Core の構成」を参照してください。
アダプティブ サンプリングは、すべての ASP.NET Core アプリケーションで既定で有効にされています。 サンプリング動作は無効にしたり、カスタマイズしたりできます。
アダプティブ サンプリングを無効にする
Application Insights サービスを追加するときに、既定のサンプリング機能を無効にできます。
Program.cs
ファイルの WebApplication.CreateBuilder()
メソッドの後に ApplicationInsightsServiceOptions
を追加します。
var builder = WebApplication.CreateBuilder(args);
var aiOptions = new Microsoft.ApplicationInsights.AspNetCore.Extensions.ApplicationInsightsServiceOptions();
aiOptions.EnableAdaptiveSampling = false;
builder.Services.AddApplicationInsightsTelemetry(aiOptions);
var app = builder.Build();
上記のコードによって、アダプティブ サンプリングが無効になります。 その他のカスタマイズ オプションを使用したサンプリングを追加するには、次の手順に従います。
サンプリング設定を構成する
サンプリング動作をカスタマイズするには、次の TelemetryProcessorChainBuilder
の拡張メソッドを使用します。
重要
このメソッドを使用してサンプリングを構成する場合は、AddApplicationInsightsTelemetry()
を呼び出すときに aiOptions.EnableAdaptiveSampling
プロパティを false
に設定してください。 この変更を行った後は、成立しているカスタマイズを含むアダプティブ サンプリングを再度有効にするために、次のコード ブロックの指示に厳密に従う必要があります。 そうしないと、データ インジェストが過剰になる可能性があります。 必ず、変更後のサンプリング設定をテストし、適切な日単位のデータの上限を設定して、コスト抑制に役立てます。
using Microsoft.ApplicationInsights.AspNetCore.Extensions;
using Microsoft.ApplicationInsights.Extensibility;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<TelemetryConfiguration>(telemetryConfiguration =>
{
var telemetryProcessorChainBuilder = telemetryConfiguration.DefaultTelemetrySink.TelemetryProcessorChainBuilder;
// Using adaptive sampling
telemetryProcessorChainBuilder.UseAdaptiveSampling(maxTelemetryItemsPerSecond: 5);
// Alternately, the following configures adaptive sampling with 5 items per second, and also excludes DependencyTelemetry from being subject to sampling:
// telemetryProcessorChainBuilder.UseAdaptiveSampling(maxTelemetryItemsPerSecond:5, excludedTypes: "Dependency");
telemetryProcessorChainBuilder.Build();
});
builder.Services.AddApplicationInsightsTelemetry(new ApplicationInsightsServiceOptions
{
EnableAdaptiveSampling = false,
});
var app = builder.Build();
SamplingPercentageEstimatorSettings クラスを使用して、その他のサンプリング設定をカスタマイズできます。
using Microsoft.ApplicationInsights.WindowsServer.Channel.Implementation;
telemetryProcessorChainBuilder.UseAdaptiveSampling(new SamplingPercentageEstimatorSettings
{
MinSamplingPercentage = 0.01,
MaxSamplingPercentage = 100,
MaxTelemetryItemsPerSecond = 5
}, null, excludedTypes: "Dependency");
Azure Functions 用のアダプティブ サンプリングの構成
Azure Functions で実行されているアプリに対してアダプティブ サンプリングを構成するには、こちらのページの手順に従います。
固定レート サンプリング
固定レート サンプリングは、Web サーバーおよび Web ブラウザーから送信されるトラフィックを削減します。 アダプティブ サンプリングとは異なり、管理者によって決定された固定レートでテレメトリを削減します。 固定レート サンプリングは、ASP.NET、ASP.NET Core、Java、および Python アプリケーションで使用できます。
他の手法と同様に、関連する項目も保持されます。 また、クライアントとサーバーのサンプリングが同期されて、関連する項目が維持されます。 たとえば、検索でページ ビューを見ると、それに関連するサーバー要求を見つけることができます。
メトリックス エクスプローラーでは、要求や例外の数などのレートに係数が乗算されて、サンプリング レートに対して可能な限り正確になるように補正されます。
ASP.NET アプリケーション用の固定レート サンプリングの構成
アダプティブ サンプリングを無効にする:
ApplicationInsights.config
で、AdaptiveSamplingTelemetryProcessor
ノードを削除またはコメント アウトします。<TelemetryProcessors> <!-- Disabled adaptive sampling: <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel"> <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond> </Add> -->
固定レート サンプリング モジュールを有効にします。 次のスニペットを
ApplicationInsights.config
に追加します。この例では、SamplingPercentage が 20 であるため、すべての項目の 20% がサンプリングされます。 メトリックス エクスプローラーの値は、(100/20) = 5 で乗算されて補正されます。
<TelemetryProcessors> <Add Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.SamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel"> <!-- Set a percentage close to 100/N where N is an integer. --> <!-- E.g. 50 (=100/2), 33.33 (=100/3), 25 (=100/4), 20, 1 (=100/100), 0.1 (=100/1000) --> <SamplingPercentage>20</SamplingPercentage> </Add> </TelemetryProcessors>
または、
ApplicationInsights.config
ファイルでサンプリング パラメーターを設定する代わりに、プログラムでこれらの値を設定できます。using Microsoft.ApplicationInsights.Extensibility; using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel; // ... var builder = TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder; // For older versions of the Application Insights SDK, use the following line instead: // var builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder; builder.UseSampling(10.0); // percentage // If you have other telemetry processors: builder.Use((next) => new AnotherProcessor(next)); builder.Build();
ASP.NET Core アプリケーション用の固定レート サンプリングの構成
アダプティブ サンプリングを無効にする
ApplicationInsightsServiceOptions
を使って、WebApplication.CreateBuilder()
メソッドの後に変更を行うことができます。var builder = WebApplication.CreateBuilder(args); var aiOptions = new Microsoft.ApplicationInsights.AspNetCore.Extensions.ApplicationInsightsServiceOptions(); aiOptions.EnableAdaptiveSampling = false; builder.Services.AddApplicationInsightsTelemetry(aiOptions); var app = builder.Build();
固定レート サンプリング モジュールを有効にする
WebApplication.CreateBuilder()
メソッドの後に変更を行うことができます。var builder = WebApplication.CreateBuilder(args); builder.Services.Configure<TelemetryConfiguration>(telemetryConfiguration => { var builder = telemetryConfiguration.DefaultTelemetrySink.TelemetryProcessorChainBuilder; // Using fixed rate sampling double fixedSamplingPercentage = 10; builder.UseSampling(fixedSamplingPercentage); builder.Build(); }); builder.Services.AddApplicationInsightsTelemetry(new ApplicationInsightsServiceOptions { EnableAdaptiveSampling = false, }); var app = builder.Build();
Java アプリケーションのサンプリング オーバーライドと固定レート サンプリングを構成する
既定では、Java 自動インストルメンテーションと SDK ではサンプリングは有効になりません。 現在、Java 自動インストルメンテーション、サンプリング オーバーライド、固定レート サンプリングはサポートされています。 Java では、アダプティブ サンプリングはサポートされていません。
Java 自動インストルメンテーションの構成
- 既定のサンプリング レートをオーバーライドするサンプリング オーバーライドを構成し、一部の要求と依存関係に異なるサンプリング レートを適用するには、サンプリング オーバーライド ガイドを使用します。
- すべてのテレメトリに適用される固定レート サンプリングを構成するには、固定レート サンプリング ガイドを使用します。
Note
サンプリング率には、N を整数として 100/N に近い割合を選択します。 サンプリングでは現在、その他の値はサポートされていません。
OpenCensus Python アプリケーション用の固定レート サンプリングの構成
最新の OpenCensus Azure Monitor エクスポーターを使用してアプリケーションをインストルメント化します。
Note
メトリック エクスポーターには固定レート サンプリングを利用できません。 つまり、カスタム メトリックは、サンプリングを構成できない唯一のテレメトリということになります。 メトリック エクスポーターからは、それが追跡するあらゆるテレメトリが送信されます。
追跡の固定レート サンプリング
Tracer
構成の一部として sampler
を指定できます。 明示的なサンプラーが指定されていない場合は、既定で ProbabilitySampler
が使用されます。 ProbabilitySampler
では、既定で 1/10,000 のレートが使用されます。これは、10,000 の要求のうちの 1 つが Application Insights に送信されることを意味します。 サンプリング レートを指定する場合は、次の詳細を参照してください。
サンプリング レートを指定する場合は、サンプリング レートが 0.0 から 1.0 の範囲であるサンプラーを Tracer
に指定していることを確認します。 サンプリング レート 1.0 は 100% を表します。つまり、すべての要求は Application Insights にテレメトリとして送信されます。
tracer = Tracer(
exporter=AzureExporter(
instrumentation_key='00000000-0000-0000-0000-000000000000',
),
sampler=ProbabilitySampler(1.0),
)
ログの固定レート サンプリング
オプションの引数 logging_sampling_rate
を変更することで、AzureLogHandler
の固定レート サンプリングを構成できます。 引数を指定しない場合、1.0 のサンプリング レートが使用されます。 サンプリング レート 1.0 は 100% を表します。つまり、すべての要求は Application Insights にテレメトリとして送信されます。
handler = AzureLogHandler(
instrumentation_key='00000000-0000-0000-0000-000000000000',
logging_sampling_rate=0.5,
)
JavaScript を使用した Web ページ用の固定レート サンプリングの構成
JavaScript ベースの Web ページは、Application Insights を使用するように構成できます。 テレメトリは、ユーザーのブラウザー内で実行中のクライアント アプリケーションから送信され、ページは任意のサーバーからホストできます。
Application Insights 用に JavaScript ベースの Web ページを構成する場合は、Application Insights ポータルから JavaScript スニペットを入手して、それを変更します。
ヒント
JavaScript が含まれている ASP.NET アプリでは、スニペットは通常 _Layout.cshtml
にあります。
samplingPercentage: 10,
のような行をインストルメンテーション キーの前に挿入します。
<script>
var appInsights = // ...
({
// Value must be 100/N where N is an integer.
// Valid examples: 50, 25, 20, 10, 5, 1, 0.1, ...
samplingPercentage: 10,
instrumentationKey: ...
});
window.appInsights = appInsights;
appInsights.trackPageView();
</script>
Note
インストルメンテーション キーのインジェストのサポートは、2025 年 3 月 31 日に終了します。 インストルメンテーション キーのインジェストは引き続き機能しますが、この機能の更新プログラムやサポートは提供されなくなります。 接続文字列に移行することで、新機能をご利用いただけます。
サンプリング率には、N を整数として 100/N に近い割合を選択します。 サンプリングでは現在、その他の値はサポートされていません。
サーバー側とクライアント側のサンプリングの調整
クライアント側 JavaScript SDK は、サーバー側 SDK での固定レート サンプリングに参加します。 インストルメント化されたページでは、サーバー側 SDK でサンプリング対象にすると判断したのと同じユーザーからのクライアント側テレメトリのみが送信されます。 このロジックは、クライアント側とサーバー側のアプリケーション間でユーザー セッションの整合性を維持することを目的としています。 その結果、Application Insights 内の特定のテレメトリ項目から、このユーザーまたはセッションに関するその他すべてのテレメトリ項目を見つけることができ、検索では関連のあるページ ビューと要求の間を移動できます。
クライアント側とサーバー側のテレメトリに、調整済みのサンプルが表示されない場合:
- サーバーとクライアントの両方でサンプリングを有効にしていることを確認してください。
- クライアントとサーバーの両方で同じサンプリング率を設定していることを確認してください。
- SDK のバージョンが 2.0 以降であることを確認してください。
インジェスト サンプリング
インジェスト サンプリングは、Web サーバー、ブラウザー、デバイスからのテレメトリが Application Insights サービス エンドポイントに到達した時点で動作します。 アプリから送信されるテレメトリ トラフィックを削減することはありませんが、Application Insights によって処理および維持 (そして課金) される量を削減します。
アプリが頻繁に月間クォータを超えて、SDK ベースのいずれかのサンプリング種類を使用するオプションがない場合は、この種類のサンプリングを使用します。
[使用量と推定コスト] ページで、サンプリング レートを設定します。
他のサンプリング種類と同様に、このアルゴリズムは関連するテレメトリ項目を維持します。 たとえば、検索でテレメトリを調べているときは、特定の例外に関連する要求を検索できます。 メトリックはそのような要求のレートをカウントし、例外レートを正しく維持します。
サンプリングによって特定のデータ ポイントが破棄され、連続エクスポートなどの Application Insights の機能では使用できません。
インジェスト サンプリングは、アダプティブ サンプリングまたは固定レート サンプリングと共に機能しません。 アダプティブ サンプリングは、Azure App Service の ASP.NET SDK、ASP.NET Core SDK、または Application Insights エージェントを使用して自動的にアクティブ化されます。 Application Insights サービス エンドポイントがテレメトリを受信し、サンプリング レートが 100% 未満 (アクティブなサンプリングを示す) を検出すると、設定されたインジェスト サンプリング レートは無視されます。
警告
ポータル タイルに表示される値は、インジェスト サンプリングに設定した値を示します。 いずれかの種類の SDK サンプリング (アダプティブまたは固定レート サンプリング) が動作している場合、この値は実際のサンプリング レートを表しません。
使用する必要があるサンプリングの種類
次の場合はインジェスト サンプリングを使用します。
- テレメトリの月間クォータを消費することが多い場合。
- ユーザーの Web ブラウザーから取得するテレメトリが多すぎる場合。
- サンプリングをサポートしていない SDK のバージョン (たとえば、2.0 より前の ASP.NET バージョン) を使用している場合。
次の場合は固定レート サンプリングを使用します。
- 関連するイベント間を移動するには、クライアントとサーバーの間でサンプリングを同期する必要があります。 たとえば、イベント調査中の検索でのページ ビューと HTTP 要求です。
- アプリに適したサンプリング率を確保する場合。 正確なメトリックを取得できる程度に高く、価格クォータとスロットル制限を超えないレートにする必要があります。
アダプティブ サンプリングを使用する場合。
他の形式のサンプリングを使う条件に当てはまらない場合は、アダプティブ サンプリングをお勧めします。 この設定は、ASP.NET/ASP.NET Core SDK で既定で有効になっています。 一定の最小レートに達するまでトラフィックは減らないので、使用頻度の低いサイトは一切サンプリングされない可能性があります。
サンプリングが動作しているかどうかを把握する
サンプリング レートを見つけるには、Analytics クエリを使用します。
union requests,dependencies,pageViews,browserTimings,exceptions,traces
| where timestamp > ago(1d)
| summarize RetainedPercentage = 100/avg(itemCount) by bin(timestamp, 1h), itemType
いずれかの種類の RetainedPercentage
が 100 未満である場合、その種類のテレメトリはサンプリングされています。
重要
Application Insights は、上で説明したどのサンプリング手法でも、セッション、メトリック (カスタム メトリックを含む)、またはパフォーマンス カウンターのテレメトリの種類をサンプリングしません。 これらのテレメトリの種類では精度の低下がきわめて望ましくないため、これらの種類は常にサンプリングから除外されます。
クエリの精度と高いサンプル レートをログに記録する
アプリケーションがスケールアップされると、1 秒間に数十、数百、または数千の作業項目を処理している可能性があります。 それぞれに対するイベントをログすることは、リソースにもコストにも有効ではありません。 Application Insights では、サンプリングを使用して、柔軟な方法でテレメトリ量の増加に対応し、リソースの使用状況とコストを制御します。
警告
分散操作のすべてのアプリケーションでサンプリングが有効になっている場合、分散操作の End-to-end ビューの整合性が影響を受ける可能性があります。 分散操作では、アプリケーションごとに異なるサンプリングの決定が行われるため、1 つの操作 ID のテレメトリが 1 つのアプリケーションによって保存され、他のアプリケーションによって同じ操作 ID のテレメトリがサンプリングされないようにすることができます。
サンプリング レートが高くなるとログ ベースのクエリは精度が下がり、増加します。 サンプリングが有効になっていて、サンプル レートがより高い範囲 (60% まで) である場合、これはログベースのクエリの精度にのみ影響します。 影響は、テレメトリの種類、操作ごとのテレメトリ数、その他の要因によって異なります。
SDK では、事前に集計されたメトリックを使用して、サンプリングによって発生する問題を解決します。 これらのメトリックの詳細については、「Azure Application Insights - Azure Monitor | Microsoft Docs」を参照してください。SDK は、ログに記録されたデータの関連するプロパティを識別し、サンプリングの前に統計を抽出します。 リソースの使用とコストを最小限に抑えるために、メトリックが集計されます。 このプロセスでは、数千のイベント テレメトリ項目ではなく、1 分あたり数個のメトリック テレメトリ項目が発生します。 たとえば、これらのメトリックは、送信された要求テレメトリ レコードの itemCount
が 100 で、“この Web アプリは 25 件のリクエストを処理しました” と MDM アカウントに報告する場合があります。 これらの事前集計メトリックは正確な数値を提供し、サンプリングがログ ベースのクエリ結果に影響を与える場合でも信頼性が高くなります。 これらは、Application Insights ポータルの [メトリック] ウィンドウで確認できます。
よく寄せられる質問
サンプリングはアラートの精度に影響しますか?
- はい。 アラートは、サンプリングされたデータに対してのみトリガーできます。 フィルター処理を積極的に行うと、アラートが予期したとおりに発生しない可能性があります。
Note
サンプリングはメトリックには適用されませんが、サンプリングされたデータからメトリックを取得できます。 この方法では、サンプリングがアラートの精度に間接的に影響を与える可能性があります。
ASP.NET および ASP.NET Core SDK での既定のサンプリング動作はどのようなものですか。
- 上の SDK の最新バージョンのいずれかを使用している場合は、1 秒あたり 5 つのテレメトリ項目のアダプティブ サンプリングが既定で有効になります。
既定では、システムは 2 つの
AdaptiveSamplingTelemetryProcessor
ノードを追加します。1 つはサンプリングにEvent
の種類を含み、もう 1 つは除外します。 この構成では、テレメトリを 5 つのEvent
の種類の項目と他のすべての種類の 5 つの項目に制限し、Events
が他のテレメトリの種類とは別にサンプリングされるようにします。
この既定の動作を変更するには、このページの前のセクションの例を使用します。
テレメトリを複数回サンプリングできますか
- いいえ。 ある項目が既にサンプリングされている場合、SamplingTelemetryProcessor はサンプリングの検討からその項目を無視します。 同じことがインジェスト サンプリングにも当てはまります。これにより、SDK 自体で既にサンプリングされている項目にはサンプリングが適用されません。
サンプリングを、"各テレメトリ タイプの X% を収集" という単純な方法にしないのはなぜですか。
- このサンプリング方法では、メトリックの近似精度は非常に高レベルになりますが、一方でユーザーごと、セッションごと、要求ごとに診断データを関連付けるという、診断には欠かせない機能が利用できなくなります。 そのため、"アプリ ユーザーの X% に関するすべてのテレメトリ項目を収集"、または "アプリ要求の X% に関するすべてのテレメトリを収集" のようなポリシーを使用すると、サンプリングがより適切に実行されます。要求に関連付けられていないテレメトリ項目 (バックグラウンドの非同期処理など) の場合、フォールバックは "テレメトリの種類ごとにすべての項目の X % を収集する" ことです。
サンプリング率は、時間経過に伴い変化する可能性がありますか。
- はい。アダプティブ サンプリングの場合、現在監視されているテレメトリのデータ量に基づいて、サンプリング率が徐々に変化します。
固定レート サンプリング率を使用している場合、自分のアプリに最適なサンプリング率は、どのようにして確認できますか。
1 つの方法として、アダプティブ サンプリングから始め、決定されたレートを確認したら (前の質問を参照)、そのレートを使って固定レート サンプリングに切り替えます。
それ以外では、推測するしかありません。 Application Insights での現在のテレメトリ使用状況を分析し、発生しているスロットルを観察して、収集されるテレメトリの量を見積もります。 この 3 つの情報に、選択した価格レベルを合わせて考えると、収集されるテレメトリの量をどれくらい削減すればよいかがわかります。 ただし、ユーザー数の増加やテレメトリ量の何らかの変化によって、見積りが無効になることがあります。
サンプリング率を低く構成しすぎると、どうなりますか。
- Application Insights がデータ量の減少に関してデータの視覚化を補正しようとしている場合、サンプリング率を極端に低くすると過度にアグレッシブなサンプリングが行われ、近似精度の低下につながります。 また、頻度の低い失敗や遅延要求の一部はサンプリングから除外される場合があるため、診断機能に悪影響を及ぼす可能性もあります。
サンプリング率を高く構成しすぎると、どうなりますか。
- サンプリング率を高く構成しすぎた (十分にアグレッシブでない) 場合は、収集されるテレメトリの量が十分に減少しないことになります。 スロットルに関連するテレメトリ データが失われる可能性が残り、超過料金によって Application Insights の使用コストが予定額を超える場合もあります。
IncludedTypes と ExcludedTypes の両方の設定を構成した場合はどうなりますか?
- 競合を防ぎ、テレメトリ収集の設定を明確にするために、構成で
ExcludedTypes
とIncludedTypes
の両方を設定しないことをお勧めします。 ExcludedTypes
にリストされているテレメトリの種類は、IncludedTypes
の設定でも除外されます。 ExcludedTypes は IncludedTypes よりも優先されます。
サンプリングはどのようなプラットフォームで使用できますか。
- インジェスト サンプリングは、SDK がサンプリングを実行していない場合に任意のテレメトリが特定の量を超えると、自動的に実行される場合があります。 この構成は、たとえば、ASP.NET SDK や Java SDK の古いバージョンを使用している場合に機能します。
- 最新の ASP.NET または ASP.NET Core SDK (Azure または独自のサーバーのいずれかでホストされる) を使用している場合、既定ではアダプティブ サンプリングが行われますが、前述の方法で固定レートに切り替えることができます。 固定レート サンプリングの場合、ブラウザー SDK は自動的にサンプル関連のイベントに同期します。
- 最新の Java エージェントを使用している場合は、
applicationinsights.json
を構成して (Java SDK の場合はApplicationInsights.xml
を構成する) 固定レート サンプリングを有効にできます。 サンプリングは、既定で無効になっています。 固定レート サンプリングでは、ブラウザー SDK とサーバーは自動的にサンプル関連のイベントに同期されます。
常に確認したい頻度の低いイベントがあります。 サンプリング モジュールを使わずに確認するにはどうすればよいですか。
特定のイベントを常に確認する最善の方法は、次の例に示すように、カスタムの TelemetryInitializer を書き込み、保持するテレメトリ項目の
SamplingPercentage
を 100 に設定することです。 初期化子はテレメトリ プロセッサ (サンプリングを含む) の前に実行されることが保証されるため、これにより、すべてのサンプリング手法ではサンプリングに関する考慮事項からこの項目が確実に無視されます。 ASP.NET SDK、ASP.NET Core SDK、JavaScript SDK、Java SDK では、カスタムのテレメトリ初期化子が利用できます。 たとえば、ASP.NET SDK を使用してテレメトリ初期化子を構成できます。public class MyTelemetryInitializer : ITelemetryInitializer { public void Initialize(ITelemetry telemetry) { if(somecondition) { ((ISupportSampling)telemetry).SamplingPercentage = 100; } } }
以前の SDK バージョン
アダプティブ サンプリングは ASP.NET v2.0.0-beta3 以降の Application Insights SDK、Microsoft.ApplicationInsights.AspNetCore SDK v2.2.0-beta1 以降で使用でき、既定で有効になっています。
固定レート サンプリングは、ASP.NET バージョン 2.0.0 以降および Java SDK バージョン 2.0.1 以降の SDK の機能です。
ASP.NET SDK の v2.5.0-beta2 および ASP.NET Core SDK の v2.2.0-beta3 より前は、"user" (ほとんどの Web アプリケーションなど) を定義するアプリケーションのサンプリング決定は、ユーザー ID のハッシュに依存していました。 ユーザー (Web サービスなど) を定義しないアプリケーションの場合は、要求の操作 ID に基づいて決定されます。 ASP.NET と ASP.NET Core SDK の両方の最新バージョンでは、サンプリングの決定に操作 ID が使用されるようになりました。
次のステップ
- フィルター を使用して、SDK から送信される情報についてさらに厳密に制御できます。
- Application Insights によるテレメトリの最適化に関する Developer Network の記事を読みます。