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

时间:2015-03-13 15:57:15

标签: c# asp.net azure-web-sites azure-application-insights

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

相关文档页面似乎就是这个:Set default property values

但是示例是针对事件(即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. 我应该把这段代码放在哪里? Application_BeginRequest的{​​{1}}方法是否正常?

5 个答案:

答案 0 :(得分:18)

使用ITelemetryInitializer可以为现有请求添加新属性,如上所述here

我创建了如下所示的示例类,并添加了名为“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 with custom property

答案 1 :(得分:13)

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

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

  1. 自定义事件
  2. 请求
  3. 异常
  4. 微量
  5. 网页浏览
  6. 依赖
  7. 一旦我们知道这一点,我们可以说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到位的地方。

    我希望它有所帮助。

答案 2 :(得分:2)

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

我希望能帮到你。这是一个blog post,其中包含使用ITelemetryInitializer

的示例

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您可以将静态HttpContext.Current的{​​{1}}字典用作短期(接近无状态)存储空间,以使用自定义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

global.asax.cs

编写所需的自定义属性,在请求管道中的任何地方都有类似的内容

TelemetryConfiguration.Active.TelemetryInitializers.Add(new AppInsightCustomProps());