(在下面添加了更新 1,我认为它回答了这个问题)
在一个相当简单的 ASP.NET Core 2 Web 应用程序中,我在 Program
中初始化如下:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
我尚未在 appSettings.json
中配置检测 key ,因为目前我在本地运行。当我运行应用程序并强制加载主页时出现异常时,我可以看到 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);
}
}
}
}
这很大程度上遵循this guide 。 IUserService
只是一个使用 IHttpContextAccessor
获取当前ClaimsPrincipal
的服务。您可以看到我正在尝试将用户 ID 添加到自定义遥测属性中。
我已经在 Startup
中注册了这个 ITelemetryInitializer
,如下所示:
services.AddSingleton<ITelemetryInitializer, CustomTelemetryInitializer>();
当我再次运行应用程序时,我可以看到调试器通过 CustomTelemetryInitializer
运行并正确设置属性。但是,当我查看应用程序见解中记录的事件时,不包括自定义属性。它们看起来与上面的屏幕截图相同。
我尝试将应用洞察初始化从 Program
中移出,并在使用 注册
,但这没有什么区别。ITelemetryInitializer
后在 Startup
中对其进行初始化services.AddApplicationInsightsTelemetry()
有人知道我做错了什么吗?
更新1
我意识到我犯了一个错误。毕竟,我的自定义属性已包含在请求事件中。但不是异常事件。但我现在意识到这些异常事件在 Initialize
中采用了不同的 ITelemetry
实现,即 TraceTelemetry
。所以我没有意识到我将这些事件从我的自定义属性中排除。
最佳答案
很高兴你明白了。
SDK 中的所有 ITelemetry
实现都实现了 ISupportProperties
,它提供了 Properties
集合。如果您想为每个遥测数据附加属性,您可以转换为 ISupportProperties
并设置 props。
关于c# - Application Insights 不包括自定义 ITelemetryInitializer 设置的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50796925/