(已添加更新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
中配置一个检测密钥,因为现在我在本地运行。当我运行我的应用程序并在加载主页时强制异常时,我可以看到Visual Studio的遥测搜索Application Insights中记录的异常。
我现在想在每个记录的事件中捕获有关请求的一些细节。我已经遵循了一些指导并创建了ITelemetryInitializer
的实现:
public class CustomTelemetryInitializer : ITelemetryInitializer
{
private const string UserIdKey = "AsosUserId";
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添加到自定义遥测属性中。
我已在ITelemetryInitializer
中注册了此Startup
,如下所示:
services.AddSingleton<ITelemetryInitializer, CustomTelemetryInitializer>();
当我再次运行我的应用程序时,我可以看到调试器正在运行CustomTelemetryInitializer
并正确设置属性。但是,当我查看应用洞察中记录的事件时,不会包含自定义属性。它们看起来与上面的截图相同。
我已经尝试将应用洞察初始化从Program
移出,而是在使用Startup
注册ITelemetryInitializer
之后在services.AddApplicationInsightsTelemetry()
初始化它,但这不会差。
任何人都知道我做错了什么?
更新1
我意识到我犯了一个错误。毕竟,我的自定义属性 包含在Request事件中。但不是异常事件。但我现在意识到,这些异常事件在ITelemetry
Initialize
中采用TraceTelemetry
的不同实现,即{{1}}。所以我没有意识到我是从我的自定义属性中排除这些事件。
答案 0 :(得分:2)
ITelemetry
实现都会ISupportProperties
为其提供Properties
集合。如果要将属性附加到每个遥测,可以转换为ISupportProperties
并设置道具。