Application Insights 不包括自定义 ITelemetryInitializer 设置的属性

get*_*ode 5 c# azure azure-application-insights asp.net-core

(在下面添加了更新 1,我认为它回答了这个问题)

在一个相当简单的 ASP.NET Core 2 Web 应用程序中,我像这样初始化了Program

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseStartup<Startup>()
        .UseApplicationInsights()
        .Build();
Run Code Online (Sandbox Code Playgroud)

我还没有配置仪器密钥,appSettings.json因为现在我在本地运行。当我运行应用程序并强制加载主页时出现异常时,我可以看到 Visual Studio 的 Application Insights 遥测搜索中记录了异常。

在此输入图像描述

我现在想要捕获有关每个记录事件中的请求的一些详细信息。我遵循了一些指导并创建了以下实现ITelemetryInitializer

public class CustomTelemetryInitializer : ITelemetryInitializer
{
    private const string UserIdKey = "UserId";

    private readonly IUserService _userService;

    public CustomTelemetryInitializer(IUserService userService)
    {
        _userService = userService;
    }

    public void Initialize(ITelemetry telemetry)
    {
        if (!(telemetry is RequestTelemetry requestTelemetry)) return;

        var props = requestTelemetry.Properties;

        if (!props.ContainsKey(UserIdKey))
        {
            var user = _userService.GetCurrentUser();

            if (user != null)
            {
                props.Add(UserIdKey, user.UserId);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这很大程度上遵循本指南IUserService只是一个用于IHttpContextAccessor获取当前ClaimsPrincipal. 您可以看到我正在尝试将用户 ID 添加到自定义遥测属性中。

我已经这样注册ITelemetryInitializer了:Startup

services.AddSingleton<ITelemetryInitializer, CustomTelemetryInitializer>();
Run Code Online (Sandbox Code Playgroud)

当我再次运行我的应用程序时,我可以看到调试器正在运行CustomTelemetryInitializer并正确设置属性。但是,当我查看应用程序见解中记录的事件时,不包括自定义属性。它们看起来与上面的屏幕截图相同。

我尝试将应用程序见解初始化移出Program,而是Startup在注册ITelemetryInitializerusing后对其进行初始化services.AddApplicationInsightsTelemetry(),但这没有什么区别。

有人知道我做错了什么吗?

更新1

我已经意识到我犯了一个错误。毕竟,我的自定义属性已包含在请求事件中。但不是异常事件。但我现在意识到这些异常事件ITelemetryInitializeie中采用不同的实现TraceTelemetry。所以我没有意识到我将这些事件从我的自定义属性中排除。

cij*_*mas 5

很高兴你想出来了。ITelemetrySDK 中的所有实现都实现了,ISupportProperties这给了它Properties集合。如果您想将属性附加到每个遥测数据,您可以投射ISupportProperties并设置道具。