(добавлено ОБНОВЛЕНИЕ 1 ниже которого, я думаю, дан ответ на этот вопрос)
В довольно простом веб-приложении ASP.NET Core 2, которое я инициализировал в 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);
}
}
}
}
Это в значительной степени соответствует этому руководству .IUserService
- это просто служба, которая использует IHttpContextAccessor
для получения текущего ClaimsPrincipal
.Вы можете видеть, что я пытаюсь добавить идентификатор пользователя в пользовательские свойства телеметрии.
Я зарегистрировал это ITelemetryInitializer
в Startup
следующим образом:
services.AddSingleton<ITelemetryInitializer, CustomTelemetryInitializer>();
Когда яснова запустите мое приложение, я вижу, что отладчик работает через CustomTelemetryInitializer
и правильно устанавливает свойство.Однако при просмотре событий, зарегистрированных в приложении, пользовательское свойство не включается.Они выглядят так же, как на скриншоте выше.
Я попытался переместить инициализацию озарений приложения из Program
и вместо этого инициализировать ее в Startup
после регистрации ITelemetryInitializer
с помощью services.AddApplicationInsightsTelemetry()
, но это делаетбез разницы.
Кто-нибудь знает, что я делаю не так?
ОБНОВЛЕНИЕ 1
Я понял, что сделал ошибку.Мои пользовательские свойства включают в себя для событий запроса.Но не исключение событий.Но теперь я понял, что эти события исключений имеют различную реализацию ITelemetry
в Initialize
, то есть TraceTelemetry
.Поэтому я не осознавал, что исключаю эти события из своих пользовательских свойств.