web-dev-qa-db-ja.com

Application InsightsでTelemetryClientの静的インスタンスを使用する

ASP.NET MVC Webサイトを持っていて、Application Insightsを実装しています。現在、私は次のようにトレースイベントをログに記録します。

private static TelemetryClient _APM;
private static TelemetryClient APM
{
    get
    {
        if (_APM == null) { _APM = new TelemetryClient(); }
        return _APM;
    }
}

public static void Trace(string Message)
{
    APM.TrackTrace(Message);
}

ご覧のとおり、これにより、すべてのトレースに対してTelemetryClientの単一の静的インスタンスが維持されます。これは、クライアントを使用する方法ですか?または、ログごとにTelemetryClientの新しいインスタンスを作成することになっていますか?

18
William

ドキュメント によると、

...アプリのモジュールごとにTelemetryClientのインスタンスを使用します。たとえば、Webサービスに1つのTelemetryClientがあり、着信httpリクエストを報告し、ミドルウェアクラスにもう1つあり、ビジネスロジックイベントを報告する場合があります。

ログごとに新しいテレメトリクライアントを作成するのはおそらくコストがかかるため、アプリケーションの構造によっては、投稿で説明したシングルトンパターンを使用するのが適切です。

16
darth_phoenixx

Darth_phoenixxが参照した完全な引用は、実際には次のようになります。

TelemetryClientはスレッドセーフです。

ASP.NETおよびJava=プロジェクトの場合、着信HTTPリクエストは自動的にキャプチャされます。アプリの他のモジュール用にTelemetryClientの追加インスタンスを作成する必要がある場合があります。たとえば、1つのTelemetryClientインスタンスをビジネスロジックイベントを報告するミドルウェアクラス。UserIdやDeviceIdなどのプロパティを設定して、マシンを識別できます。この情報は、インスタンスが送信するすべてのイベントに添付されます。

TelemetryClient.Context.User.Id = "...";
TelemetryClient.Context.Device.Id = "...";

その最後のビットは非常に重要です。 UserIdが変更される可能性のあるWebアプリケーションのようなものを作成している場合は、これらの値がすべて同じになるスコープごとに(各リクエストのように)テレメトリクライアントのインスタンスを再利用する必要がありますが、静的/シングルトンとしては使用しないでください。インスタンス。

更新

ASP.NET Coreでは、Application Insightsは依存関係注入を多用し、TelemetryClientをシングルトンとして登録します!

これは、アプリケーション全体で使用したくない変数をクライアントコンテキストにavoid設定する必要があることを意味します。代わりに、テレメトリ初期化子を利用して、各テレメトリオブジェクトのユーザーIDなどを設定します。

6