在Application Insights指标中为每个请求添加自定义属性

我喜欢将自定义属性添加到Application Insights 我的应用程序的每个请求采取的指标。 例如,我想添加用户登录和租户代码,例如我可以在Azure门户中对指标进行分段/分组。

相关的doc页面似乎是这样的: 设置默认属性值

但是示例是针对事件(即gameTelemetry.TrackEvent("WinGame"); ),而不是针对HTTP请求:

 var context = new TelemetryContext(); context.Properties["Game"] = currentGame.Name; var gameTelemetry = new TelemetryClient(context); gameTelemetry.TrackEvent("WinGame"); 

我的问题:

  1. 什么是请求的相关代码,因为我目前没有特定的代码(它似乎由App Insights SDK自动管理):只是创建一个TelemetryContext足够吗? 我是否应该创建TelemetryClient ,如果是,我应该将其链接到当前请求吗? 怎么样 ?
  2. 我应该把这段代码放在哪里? 在global.asaxApplication_BeginRequest方法中可以吗?

与第一个问题“如何向我的请求添加自定义事件/请求的相关代码是什么”相关,我认为这里的主要混淆与命名有关。

我们需要指出的第一件事是,我们可以使用Application Insights捕获不同类型的信息:

  1. 自定义事件
  2. 请求
  3. 例外
  4. 跟踪
  5. 页面预览
  6. 依赖

一旦我们知道这一点,我们可以说TrackEvent与“自定义事件”相关,因为TrackRequest与请求相关。

当我们想要保存请求时,我们需要做的是以下内容:

  var request = new RequestTelemetry(); var client = new TelemetryClient(); request.Name = "My Request"; client.TrackRequest(countEvent); 

因此,让我们假设您的用户登录和租户代码都是字符串。 我们可以使用以下代码创建新请求以记录此信息:

  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到位的地方。

我希望它有所帮助。

看起来像使用此处提到的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”显示在自定义请求属性组下。 (请参阅下面的屏幕抓取)

Appinsight定制属性

如Alan所述,您可以实现IContextInitializer接口,以便为Application Insights发送的所有遥测添加自定义属性。 但是,我还建议查看ITelemtryInitializer界面。 它与上下文初始化程序非常相似,但它是针对发送的每个遥测数据而不是仅在创建遥测客户端时调用的。 对于我来说,记录可能在应用程序生命周期内发生变化的属性值(例如您提到的用户和租户相关信息)对我来说似乎更有用。

我希望能帮到你。 这是一篇博客文章,其中包含使用ITelemetryInitializer的示例。

在该文档中,向下滚动几行,讨论如何创建IContextInitializer的实现。 您可以在遥测开始滚动之前调用的任何方法中调用它。

您的自定义属性将添加到所有事件,例外,指标,请求,所有内容。