Application Insights не включает свойства, установленные пользовательским ITelemetryInitializer - PullRequest
0 голосов
/ 11 июня 2018

(добавлено ОБНОВЛЕНИЕ 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.

enter image description here

Теперь я хочу записать некоторые подробности о запросе в каждом зарегистрированном событии.Я следовал некоторым указаниям и создал реализацию 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.Поэтому я не осознавал, что исключаю эти события из своих пользовательских свойств.

1 Ответ

0 голосов
/ 11 июня 2018

Рад, что вы поняли это.Все реализации ITelemetry в SDK реализуют ISupportProperties, что дает коллекцию Properties.Если вы хотите прикрепить свойства к каждой телеметрии, вы можете привести к ISupportProperties и установить реквизиты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...