37

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

相关的文档页面似乎是这个:设置默认属性值

但是这个例子是针对事件(即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方法可以global.asax吗?
4

5 回答 5

24

看起来可以使用此处提到的 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

于 2016-10-03T22:46:02.717 回答
17

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

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

  1. 自定义事件
  2. 要求
  3. 例外
  4. 痕迹
  5. 页面预览
  6. 依赖

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

当我们要保存一个请求时,我们需要做的是:

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

我希望它有所帮助。

于 2015-06-25T16:37:41.603 回答
4

您可以将 staticHttpContext.CurrentItems字典用作短期(接近无状态)存储空间,以将您的自定义属性值传递到具有自定义的默认遥测处理程序中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_Startglobal.asax.cs

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

编程所需的自定义属性,在您的请求管道中的任何地方都有类似的东西

if (HttpContext.Current != null)
{
    HttpContext.Current.Items["PerRequestMyCustomProp"] = myCustomPropValue;
}
于 2019-02-14T22:04:50.283 回答
2

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

我希望这可以帮助你。这是一篇博客文章,其中包含使用ITelemetryInitializer.

于 2015-05-22T18:54:45.217 回答
0

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

您的自定义属性将添加到所有事件、异常、指标、请求等所有内容中。

于 2015-03-18T18:49:22.070 回答