Application Insightsで取得したメトリックにカスタムプロパティを追加したい各リクエストに対してアプリの。たとえば、Azureポータルでメトリックをセグメント化/グループ化できるなど、ユーザーログインとテナントコードを追加する必要があります。
関連するドキュメントページは次のようになります。 デフォルトのプロパティ値を設定
ただし、例はイベント(つまり、gameTelemetry.TrackEvent("WinGame");
)であり、HTTP要求ではありません。
var context = new TelemetryContext();
context.Properties["Game"] = currentGame.Name;
var gameTelemetry = new TelemetryClient(context);
gameTelemetry.TrackEvent("WinGame");
私の質問:
TelemetryContext
を作成するだけで十分ですか? TelemetryClient
も作成する必要がありますか?作成する場合は、現在のリクエストにリンクする必要がありますか?どうやって ?Application_BeginRequest
のglobal.asax
メソッドで大丈夫ですか?here のように、ITelemetryInitializerを使用して、既存のリクエストに新しいプロパティを追加できるようです。
以下のサンプルクラスを作成し、「LoggedInUser」という新しいプロパティを追加して、テレメトリを要求しました。
public class CustomTelemetry : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
var requestTelemetry = telemetry as RequestTelemetry;
if (requestTelemetry == null) return;
requestTelemetry.Properties.Add("LoggedInUserName", "DummyUser");
}
}
アプリケーション開始イベントでこのクラスを登録します。以下の例は、私が作成したサンプルMVCアプリケーションから作成されたものです
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
TelemetryConfiguration.Active.TelemetryInitializers
.Add(new CustomTelemetry());
}
}
これで、カスタムプロパティ「LoggedInUserName」がリクエストプロパティのカスタムグループの下に表示されます。 (下の画面を参照してください)
最初の質問「カスタムイベントをリクエストに追加する方法/リクエストに関連するコードは何か」に関連して、ここでの主な混乱はネーミングに関連していると思います。
最初に指摘する必要があるのは、Application Insightsでキャプチャできるさまざまな種類の情報があることです。
これがわかれば、TrackRequestはリクエストに関連しているため、TrackEventは「カスタムイベント」に関連していると言えます。
リクエストを保存する場合、必要なことは次のとおりです。
var request = new RequestTelemetry();
var client = new TelemetryClient();
request.Name = "My Request";
client.TrackRequest(request);
それでは、ユーザーログインとテナントコードの両方が文字列であることを想像してみましょう。次のコードを使用して、この情報を記録するためだけに新しいリクエストを作成できます。
public void LogUserNameAndTenant(string userName, string tenantCode)
{
var request = new RequestTelemetry();
request.Name = "My Request";
request.Context.Properties["User Name"] = userName;
request.Context.Properties["Tenant Code"] = tenantCode;
var client = new TelemetryClient();
client.TrackRequest(request);
}
TelemetryContextを実行するだけでは十分ではありません。情報を送信する方法が必要なためです。これがTelemetryClientの場所です。
役に立てば幸いです。
Alanが述べたように、IContextInitializer
インターフェイスを実装して、Application Insightsによって送信されるすべてのテレメトリにカスタムプロパティを追加できます。ただし、ITelemtryInitializer
インターフェイスを確認することもお勧めします。コンテキスト初期化子に非常に似ていますが、テレメトリクライアントの作成時だけでなく、送信されるテレメトリのすべての部分に対して呼び出されます。これは、あなたが言及したように、ユーザーやテナントに関連する情報など、アプリの存続期間にわたって変化する可能性のあるプロパティ値をログに記録するために、私にとってより便利だと思われます。
それがあなたのお役に立てば幸いです。 ITelemetryInitializer
の使用例を含む ブログ投稿 を次に示します。
そのドキュメントで、IContextInitializerの実装の作成について説明している場所まで数行下にスクロールします。テレメトリがローリングを開始する前に呼び出されるメソッドで呼び出すことができます。
カスタムプロパティは、すべてのイベント、例外、メトリック、リクエスト、すべてに追加されます。
静的HttpContext.Current
のItems
辞書を短期(ステートレスに近い)ストレージスペースとして使用して、カスタムITelemetryInitializer
を使用してカスタムプロパティ値をデフォルトのテレメトリハンドラーに配信できます。
ハンドラーを実装する
class AppInsightCustomProps : ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
var requestTelemetry = telemetry as RequestTelemetry;
// Is this a TrackRequest() ?
if (requestTelemetry == null) return;
var httpCtx = HttpContext.Current;
if (httpCtx != null)
{
var customPropVal = (string)httpCtx.Items["PerRequestMyCustomProp"];
if (!string.IsNullOrWhiteSpace(customPropVal))
{
requestTelemetry.Properties["MyCustomProp"] = customPropVal;
}
}
}
}
フックします。これをApplication_Start
in global.asax.cs
の中に入れます
TelemetryConfiguration.Active.TelemetryInitializers.Add(new AppInsightCustomProps());
リクエストパイプラインのどこにでも、必要なカスタムプロパティをプログラムします。
if (HttpContext.Current != null)
{
HttpContext.Current.Items["PerRequestMyCustomProp"] = myCustomPropValue;
}