Зарегистрируйте имя пользователя и IP-адрес с пользовательскими свойствами в Application Insight .Net Core 2.1 - PullRequest
0 голосов
/ 17 октября 2018

Мы запускаем приложение для внутренней сети на .Net Core 2.0.Понимание приложений очень полезно для выявления исключений.Поэтому, когда пользователь обращается к нам за поддержкой, мы хотели бы найти его запрос, который вызвал проблемы в понимании приложения.Я добавил ClientIpHeaderTelemetryInitializer следующим образом:

public class CustomTelemetry : ClientIpHeaderTelemetryInitializer
    {
        private readonly IHttpContextAccessor _httpContextAccessor ;

        public CustomTelemetry(IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }

        /// <summary>
        /// Implements initialization logic.
        /// </summary>
        /// <param name="platformContext">Http context.</param>
        /// <param name="requestTelemetry">Request telemetry object associated with the current request.</param>
        /// <param name="telemetry">Telemetry item to initialize.</param>
        protected override void OnInitializeTelemetry(HttpContext platformContext, RequestTelemetry requestTelemetry, ITelemetry telemetry)
        {

            requestTelemetry.Properties.Add("UserName", _httpContextAccessor.HttpContext.User.Identity.Name);
            if (string.IsNullOrEmpty(telemetry.Context.Location.Ip))
            {
                LocationContext location = requestTelemetry.Context.Location;
                telemetry.Context.Location.Ip = location.Ip;
                requestTelemetry.Properties.Add("InternalIP", location.Ip);
            }
        }
    }

Инициализатор регистрируется при запуске следующим образом:

services.AddSingleton<ITelemetryInitializer, CustomTelemetry>();  

Когда я смотрю на запросы, пользовательские данные по-прежнему оказываются пустыми.Application Insight Custom Data
Я зарегистрировал это неправильно?Я нашел точно такую ​​же строку для добавления сервиса в Интеграционные тесты Application Insights (хотя закомментировано ...)
У кого-нибудь есть идея, что не так?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Я, наконец, получил это работает для моих целей.

public class CustomTelemetry : ClientIpHeaderTelemetryInitializer
    {
        private readonly IHttpContextAccessor _httpContextAccessor ;

        public CustomTelemetry(IHttpContextAccessor httpContextAccessor) : base(httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }

        /// <summary>
        /// Implements initialization logic.
        /// </summary>
        /// <param name="platformContext">Http context.</param>
        /// <param name="requestTelemetry">Request telemetry object associated with the current request.</param>
        /// <param name="telemetry">Telemetry item to initialize.</param>
        protected override void OnInitializeTelemetry(HttpContext platformContext, RequestTelemetry requestTelemetry, ITelemetry telemetry)
        {
            var userName = _httpContextAccessor.HttpContext?.User?.Identity?.Name; // Only set when request failed...
            var ip = _httpContextAccessor.HttpContext?.Connection?.RemoteIpAddress?.ToString();
            if (ip != null) telemetry.Context.GlobalProperties.TryAdd("InternalIP", ip);
            if(userName != null) requestTelemetry.Properties.Add("UserName", userName);
        }
     }

(Примечание. ClientIpHeaderTelemetryInitializer является частью AppInsights)

Здесь важно получить все из HttpContext , проверить его на нулевое значение и добавить пользовательские свойства.В противном случае встроенные свойства для IP могут быть перезаписаны. Migrosoft GDPR Blogpost

В Startup добавьте это в ConfigureService

services.AddSingleton<ITelemetryInitializer, CustomTelemetry>();

Обязательно добавьте ContextAccessor заранее, чтобы его можно было вставить:

services.AddHttpContextAccessor();

В Configure добавьте это в начале:

app.UseForwardedHeaders(new ForwardedHeadersOptions{ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto});

Это очень важно для получения IP-адреса при использовании обратный прокси как IIS .В противном случае вы всегда получите localhost.UseForwardedHeaders () без опций просто ничего не делает!(Также вам понадобится тестовая настройка с удаленным сервером)

Получение Имя пользователя , похоже, работает только при сбое запроса (проверено с 500 Internal Server Error).В противном случае HttpContextAccessor не заполняет объект User.Может быть 2.1, довольно раздражает, может быть, кто-то найдет способ получить его для каждого запроса.

В конце ваша информация должна поступить в ApplicationInsights и выглядеть следующим образом:
enter image description here

0 голосов
/ 18 октября 2018

Во-первых, вам нужно добавить информацию о приложении в ваш основной проект asp.net с помощью пункта меню в Visual Studio: enter image description here

Во-вторых, в вашем классе CustomTelemetry выЛучше установить точку останова, чтобы убедиться, что она может быть достигнута во время выполнения кода.

В-третьих, в вашем классе CustomTelemetry выполните некоторую логику, когда UserName и InternalIP равны нулю или пусты.Если эти значения являются нулевыми или пустыми, они не будут добавлены.

Мой тестовый код, как показано ниже:

Класс CustomTelemetry:

public class CustomTelemetry: ITelemetryInitializer
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public CustomTelemetry(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;
        if (requestTelemetry == null) return;

        if (!requestTelemetry.Context.Properties.ContainsKey("UserName"))
        {
            //if UserName is null or empty, add a default value for it
            if (string.IsNullOrEmpty(_httpContextAccessor.HttpContext.User.Identity.Name))
            {
                requestTelemetry.Context.Properties.Add("UserName", "NA");
            }
            else
            {
                requestTelemetry.Context.Properties.Add("UserName", _httpContextAccessor.HttpContext.User.Identity.Name);
            }

        }
        if (!requestTelemetry.Context.Properties.ContainsKey("InternalIP"))
        {
            //update
            if (!string.IsNullOrEmpty(requestTelemetry.Context.Location.Ip))
            {
                requestTelemetry.Context.Properties.Add("InternalIP", requestTelemetry.Context.Location.Ip);                   
            }
        }
    }
}

Затем зарегистрируйтесь в Startupкласс:

public void ConfigureServices(IServiceCollection services)
{
   services.AddMvc();
   services.AddSingleton<ITelemetryInitializer, CustomTelemetry>();
   services.AddApplicationInsightsTelemetry();
}

Результат теста:

enter image description here

Так как у меня нет вашего ClientIpHeaderTelemetryInitializer класса, просто напишитевышеуказанный тестовый код.Если вам нужна дополнительная помощь, пожалуйста, поделитесь этим классом.

...