.NET と .NET Core を使用して Application Insights カスタム メトリックをキャプチャする
この記事では、.NET と .NET Core のアプリで Application Insights を使用してカスタム メトリックをキャプチャする方法について説明します。
アプリケーションに数行のコードを挿入して、ユーザーの行動を調べたり、問題の診断に役立つ情報を取得したりすることができます。 デバイスとデスクトップ アプリケーション、Web クライアント、Web サーバーからテレメトリを送信できます。 Application Insights コア テレメトリ API を使用すると、カスタムのイベントやメトリック、独自バージョンの標準テレメトリを送信できます。 この API は、Application Insights の標準のデータ コレクターで使用される API と同じものです。
ASP.NET Core アプリケーション
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Visual Studio 2022
- 次の Visual Studio ワークロード:
- ASP.NET と Web 開発
- データ ストレージとデータ処理
- Azure の開発
- .NET 6.0
- Azure サブスクリプションとユーザー アカウント (リソースの作成と削除が可能)
- デプロイ済みの完成したサンプル アプリケーション、または、Application Insights for ASP.NET Core の NuGet パッケージがインストールされ、サーバー側のテレメトリを収集するように構成された、既存の ASP.NET Core アプリケーション。
カスタム メトリックの概要
Application Insights の .NET と .NET Core の SDK には、カスタム メトリックを収集する 2 つの異なるメソッド (TrackMetric()
と GetMetric()
) があります。 これら 2 つのメソッドの主な違いは、ローカル集計です。 TrackMetric()
には事前集計はありませんが、GetMetric()
には事前集計があります。 推奨されるアプローチは、集計を使用することです。 そのため、TrackMetric()
は、カスタム メトリックを収集するための推奨メソッドではなくなりました。 この記事では、GetMetric() メソッドの使用方法と、そのしくみの背後にある論理的根拠についていくつか説明します。
事前集計 API と非事前集計 API
TrackMetric()
を使用して、メトリックを示す未加工のテレメトリを送信します。 TrackMetric()
は、値ごとに単一のテレメトリ項目を送信するため、非効率です。 また、すべての TrackMetric(item)
がテレメトリ初期化子とプロセッサの完全な SDK パイプラインを通過するため、TrackMetric()
はパフォーマンスの点でも非効率的です。
TrackMetric()
とは異なり、GetMetric()
ではローカル事前集計が自動的に処理され、1 分の一定間隔で集計されたサマリー メトリックのみが送信されます。 一部のカスタム メトリックを秒またはミリ秒単位で厳密に監視する必要がある場合は、GetMetric()
を使用してそれを行うことができ、その際、1 分ごとに監視するだけのストレージおよびネットワーク トラフィックのコストのみが発生します。 また、この動作により、集計されたメトリックに対して送信する必要があるテレメトリ項目の合計数が大幅に減少するため、調整が発生するリスクが大幅に軽減されます。
Application Insights では、TrackMetric()
と GetMetric()
を介して収集されたカスタム メトリックはサンプリングの対象にはなりません。 重要なメトリックをサンプリングすると、これらのメトリックに基づいて作成した可能性のあるアラートの信頼性が低下しかねないシナリオにつながることがあります。 カスタム メトリックをサンプリングしないようにすることで、一般に、アラートのしきい値違反が発生した場合にアラートが起動するという確信を得ることができます。 カスタム メトリックはサンプリングされないため、次に説明するいくつかの潜在的な懸念事項があります。
メトリックでの傾向追跡を 1 秒ごとに、またはさらに細かい間隔で行うと、次のような結果になることがあります。
- データ ストレージのコストが増加する。 Azure Monitor に送信するデータの量に関連したコストが発生します (送信するデータの量が多いほど、監視の全体的なコストが高くなります)。
- ネットワーク トラフィックやパフォーマンスのオーバーヘッドが増加する (一部のシナリオでは、このオーバーヘッドにより、金銭的にもアプリケーション パフォーマンスの面でもコストがかかる可能性があります)。
- インジェスト調整のリスク (アプリで短期間に高いレートのテレメトリを送信すると、Azure Monitor サービスによってデータ ポイントが削除 ("調整") されます)。
調整が懸念事項になるのは、それによってアラートが起動しなくなる場合があるためです。 アラートをトリガーする条件がローカルで発生し、送信されるデータが多すぎるためにインジェスト エンドポイントで削除される可能性があります。 独自のローカル集計ロジックを実装していない限り、.NET および .NET Core では TrackMetric()
を使用しないことをお勧めします。 すべてのインスタンスを追跡しようとしたときに、特定の期間にわたってイベントが発生した場合は、TrackEvent()
の方が適していることがわかります。 カスタム メトリックとは異なり、カスタム イベントはサンプリングの対象となることに注意してください。 独自のローカル事前集計を記述しなくても TrackMetric()
を引き続き使用することはできますが、その場合は落とし穴に注意してください。
つまり、GetMetric()
は、事前集計を行い、すべての Track() 呼び出しからの値を蓄積し、1 分ごとにサマリーや集計を送信するため、推奨される方法です。 GetMetric()
により、すべての関連情報を引き続き収集しながら、送信するデータ ポイントを少なくすることによって、コストとパフォーマンスのオーバーヘッドを大幅に削減できます。
TelemetryClient インスタンスの取得
HomeController.cs の依存関係挿入コンテナーから TelemetryClient
のインスタンスを取得します。
//... additional code removed for brevity
using Microsoft.ApplicationInsights;
namespace AzureCafe.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private AzureCafeContext _cafeContext;
private BlobContainerClient _blobContainerClient;
private TextAnalyticsClient _textAnalyticsClient;
private TelemetryClient _telemetryClient;
public HomeController(ILogger<HomeController> logger, AzureCafeContext context, BlobContainerClient blobContainerClient, TextAnalyticsClient textAnalyticsClient, TelemetryClient telemetryClient)
{
_logger = logger;
_cafeContext = context;
_blobContainerClient = blobContainerClient;
_textAnalyticsClient = textAnalyticsClient;
_telemetryClient = telemetryClient;
}
//... additional code removed for brevity
}
}
TelemetryClient
はスレッド セーフです。
TrackMetric
Application Insights では、特定のイベントにアタッチされていないメトリックをグラフ化できます。 たとえば、一定の間隔でキューの長さを監視できます。 メトリックでは、個々の測定値は変化と傾向よりも関心が薄いため、統計グラフが役に立ちます。
Application Insights にメトリックを送信するには、TrackMetric(..)
API を使用します。
集計
集計は、メトリックを送信するための推奨される方法です。
メトリックを使用する場合、個々の測定値はあまり重要ではありません。 代わりに、特定の期間に発生したことの概要が重要です。 このような概要は 集計 と呼ばれます。
たとえば、その期間の集計メトリックの合計は 1
で、メトリック値のカウントは 2
となります。 集計アプローチを使用する場合、期間ごとに TrackMetric
を 1 回だけ呼び出し、集計値を送信します。 すべての関連情報を収集しながら、Application Insights に送信するデータ ポイントを少なくすることによって、コストとパフォーマンスのオーバーヘッドを大幅に削減できるため、この方法をお勧めします。
TrackMetric の例
Visual Studio ソリューション エクスプローラーから、HomeController.cs ファイルを見つけて開きます。
CreateReview
メソッドと次のコードを見つけます。if (model.Comments != null) { var response = _textAnalyticsClient.AnalyzeSentiment(model.Comments); review.CommentsSentiment = response.Value.Sentiment.ToString(); }
カスタム メトリックを追加するために、前のコードの直後に次のコードを挿入します。
_telemetryClient.TrackMetric("ReviewPerformed", model.Rating);
ソリューション エクスプローラーで AzureCafe プロジェクトを右クリックし、コンテキスト メニューから [発行] を選択します。
新しいコードを Azure App Service に昇格するために、[発行] を選択します。
Azure Cafe Web アプリケーションが正常に公開されると、新しいブラウザー ウィンドウが開いて Azure Cafe Web アプリケーションが表示されます。
テレメトリを生成するために、Web アプリケーションで次の手順に従ってレビューを追加します。
Application Insights でメトリックを表示する
Azure portal で Application Insights のリソースを選択します。
Application Insights リソースの左側のメニューで、[監視] セクションの下から [ログ] を選択します。
[テーブル] ペインで、[Application Insights] ツリーの下にある [customMetrics] テーブルをダブルクリックします。
[ReviewPerformed] というカスタムの名前付きメトリックについて、メトリックを取得するために次のようにクエリを変更します。
customMetrics | where name == "ReviewPerformed"
[実行] を選択して結果をフィルター処理します。
レビューに存在する評価値が結果に表示されます。
GetMetric
前述したように、GetMetric(..)
はメトリックを送信するための推奨メソッドです。 このメソッドを使用するために、TrackMetric の例の既存コードにいくつかの変更を加えます。
サンプル コードを実行すると、アプリケーションからのテレメトリの送信がすぐには行われていないことが確認できます。 単一のテレメトリ項目は約 60 秒のマークで送信されます。
Note
GetMetric では、最後の値 ("gauge") またはヒストグラムや分布の追跡はサポートされていません。
GetMetric の例
Visual Studio ソリューション エクスプローラーから、HomeController.cs ファイルを見つけて開きます。
前の TrackMetric の例で追加した
CreateReview
メソッドとコードを見つけます。前の TrackMetric の例で挿入したコードを次のコードに置き換えます。
var metric = _telemetryClient.GetMetric("ReviewPerformed"); metric.TrackValue(model.Rating);
ソリューション エクスプローラーで [AzureCafe] プロジェクトを右クリックし、コンテキスト メニューから [公開] を選択します。
新しいコードを Azure App Service に昇格するために、[発行] を選択します。
Azure Cafe Web アプリケーションが正常に公開されると、新しいブラウザー ウィンドウが開いて Azure Cafe Web アプリケーションが表示されます。
テレメトリを生成するために、Web アプリケーションで次の手順に従ってレビューを追加します。
Application Insights でメトリックを表示する
Azure portal で Application Insights のリソースを選択します。
Application Insights リソースの左側のメニューで、[監視] セクションの下から [ログ] を選択します。
[テーブル] ペインで、[Application Insights] ツリーの下にある [customMetrics] テーブルをダブルクリックします。
[ReviewPerformed] というカスタムの名前付きメトリックについて、メトリックを取得するために次のようにクエリを変更します。
customMetrics | where name == "ReviewPerformed"
[実行] を選択して結果をフィルター処理します。
レビューに存在する評価値が結果に表示されます。
多次元メトリック
前のセクションの例は、0 次元メトリックを示しています。 メトリックは多次元でもかまいません。 現在、最大で 10 個のディメンションがサポートされています。
既定では、メトリック エクスプローラー エクスペリエンス内の多次元メトリックは、Application Insights リソースで有効になっていません。
Note
これはプレビュー機能であり、今後追加の課金が適用される可能性があります。
多次元メトリックを有効にする
このセクションでは、Application Insights リソースの多次元メトリックを有効にする方法について説明します。
- Azure portal で Application Insights のリソースを選択します。
- 使用量と推定コストの選択。
- [カスタム メトリック] を選択します。
- [Send custom metrics to Azure Metric Store (With dimensions)] (カスタム メトリックを Azure Metric Store に送信する (ディメンションあり)) を選択します。
- [OK] を選択します。
Application Insights リソースに対して多次元メトリックを有効にし、新しい多次元テレメトリを送信したら、ディメンションごとにメトリックを分割できます。
Note
ポータルで機能をオンにした後に送信されたメトリックにのみ、ディメンションが格納されます。
多次元メトリックスの例
Visual Studio ソリューション エクスプローラーから、HomeController.cs ファイルを見つけて開きます。
前の GetMetric の例で追加した
CreateReview
メソッドとコードを見つけます。前の GetMetric の例で挿入したコードを次のコードに置き換えます。
var metric = _telemetryClient.GetMetric("ReviewPerformed", "IncludesPhoto");
CreateReview
メソッド内で、以下のコードに一致するようにコードに変更を加えます。[HttpPost] [ValidateAntiForgeryToken] public ActionResult CreateReview(int id, CreateReviewModel model) { //... additional code removed for brevity var metric = _telemetryClient.GetMetric("ReviewPerformed", "IncludesPhoto"); if ( model.ReviewPhoto != null ) { using (Stream stream = model.ReviewPhoto.OpenReadStream()) { //... additional code removed for brevity } metric.TrackValue(model.Rating, bool.TrueString); } else { metric.TrackValue(model.Rating, bool.FalseString); } //... additional code removed for brevity }
ソリューション エクスプローラーで [AzureCafe] プロジェクトを右クリックし、コンテキスト メニューから [発行] を選択します。
新しいコードを Azure App Service に昇格するために、[発行] を選択します。
Azure Cafe Web アプリケーションが正常に公開されると、新しいブラウザー ウィンドウが開いて Azure Cafe Web アプリケーションが表示されます。
テレメトリを生成するために、Web アプリケーションで次の手順に従ってレビューを追加します。
Application Insights のログの表示
Azure portal で Application Insights のリソースを選択します。
Application Insights リソースの左側のメニューで、[監視] セクションの下から [ログ] を選択します。
[テーブル] ペインで、[Application Insights] ツリーの下にある [customMetrics] テーブルをダブルクリックします。
[ReviewPerformed] というカスタムの名前付きメトリックについて、メトリックを取得するために次のようにクエリを変更します。
customMetrics | where name == "ReviewPerformed"
[実行] を選択して結果をフィルター処理します。
レビューに存在する評価値と集計値が結果に表示されます。
ディメンションをより詳しく確認するために、IncludesPhoto ディメンションを別の変数 (列) に抽出するには、次のクエリを使用します。
customMetrics | extend IncludesPhoto = tobool(customDimensions.IncludesPhoto) | where name == "ReviewPerformed"
以前と同じカスタム メトリック名を再利用したので、カスタム ディメンションの有無にかかわらず結果が表示されます。
カスタム ディメンションがある結果のみを表示するには、次のクエリに一致するようにクエリを更新します。
customMetrics | extend IncludesPhoto = tobool(customDimensions.IncludesPhoto) | where name == "ReviewPerformed" and isnotnull(IncludesPhoto)
Application Insights でメトリックを表示する
Azure portal で Application Insights のリソースを選択します。
Application Insights リソースの左側のメニューで、[監視] セクションの下から [メトリック] を選択します。
[メトリックの名前空間] ドロップダウン メニューで、[azure.applicationinsights] を選択します。
[メトリック] ドロップダウン メニューで、[ReviewPerformed] を選択します。
新しいカスタム ディメンションでメトリックを分割したり、メトリック ビューでカスタム ディメンションを表示したりできないことがわかります。
ディメンション別にメトリックを分割するには、[分割を適用する] を選択します。
カスタム ディメンションを表示するには、[値] ドロップダウン メニューで [IncludesPhoto] を選択します。
次のステップ
- メトリックス エクスプローラー
- ASP.NET Core アプリケーション用の Application Insights を有効にする方法