Подтвердить что ты не робот

Добавление настраиваемых свойств для каждого запроса в метках Application Insights

Я хотел добавить настраиваемые свойства к метрикам, принятым Application Insights для каждого запроса моего приложения. Например, я хочу добавить логин пользователя и код арендатора, например, я могу сегментировать/группировать метрики на портале Azure.

Соответствующая страница документа выглядит следующим образом: Установить значения свойств по умолчанию

Но пример для события (т.е. gameTelemetry.TrackEvent("WinGame");), а не для HTTP-запроса:

var context = new TelemetryContext();
context.Properties["Game"] = currentGame.Name;
var gameTelemetry = new TelemetryClient(context);
gameTelemetry.TrackEvent("WinGame");

Мои вопросы:

  • Каков соответствующий код для запроса, поскольку в данный момент у меня нет специального кода (он, кажется, автоматически управляется SDK App Insights): достаточно ли создать TelemetryContext? Должен ли я создать также TelemetryClient, и если да, должен ли я связать его с текущим запросом? Как?
  • Где я должен поместить этот код? Хорошо ли в методе Application_BeginRequest global.asax?
4b9b3361

Ответ 1

Похоже, что добавление новых свойств в существующий запрос возможно с помощью ITelemetryInitializer, как упомянуто здесь.

Я создал образец класса, как указано ниже, и добавил новое свойство "LoggedInUser" для запроса телеметрии.

public class CustomTelemetry : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;
        if (requestTelemetry == null) return;
        requestTelemetry.Properties.Add("LoggedInUserName", "DummyUser");

    }
}

Зарегистрируйте этот класс при запуске приложения. Пример ниже вырезан из образца созданного мной приложения MVC.

 public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        TelemetryConfiguration.Active.TelemetryInitializers
    .Add(new CustomTelemetry());
    }
}

Теперь вы можете увидеть пользовательское свойство "LoggedInUserName" отображается в разделе "Пользовательская группа свойств запроса". (см. скриншот ниже)

Appinsight с настраиваемым свойством

Ответ 2

Относительно первого вопроса "как добавить пользовательское событие в мой запрос/какой код соответствует запросу", я думаю, что основная путаница здесь связана с именованием.

Первое, на что нам нужно обратить внимание, - это то, что есть разные виды информации, которые мы можем собирать с помощью Application Insights:

  1. Пользовательское событие
  2. Запрос
  3. Исключение
  4. Трассировка
  5. Просмотр страницы
  6. Зависимость от

Узнав об этом, мы можем сказать, что TrackEvent связан с "Пользовательскими событиями", так как TrackRequest связан с запросами.

Когда мы хотим сохранить запрос, нам нужно сделать следующее:

 var request = new RequestTelemetry();
 var client = new TelemetryClient();
 request.Name = "My Request";
 client.TrackRequest(request);

Итак, давайте представим, что ваш логин и код клиента являются строками. Мы могли бы сделать новый запрос, чтобы просто зарегистрировать эту информацию, используя следующий код:

    public void LogUserNameAndTenant(string userName, string tenantCode)
    {
        var request = new RequestTelemetry();

        request.Name = "My Request";
        request.Context.Properties["User Name"] = userName;
        request.Context.Properties["Tenant Code"] = tenantCode;

        var client = new TelemetryClient();
        client.TrackRequest(request);
    }

Простого использования TelemetryContext будет недостаточно, потому что нам нужен способ отправки информации и способ, которым TelemetryClient встает на свои места.

Я надеюсь, что это помогает.

Ответ 3

Как уже упоминалось Alan, вы можете реализовать интерфейс IContextInitializer для добавления пользовательских свойств во ВСЕ телеметрию, отправляемую Application Insights. Тем не менее, я также предложил бы изучить интерфейс ITelemtryInitializer. Он очень похож на инициализатор контекста, но он называется для каждой части телеметрии, а не только при создании телеметрического клиента. Мне кажется более полезным для регистрации значений свойств, которые могут измениться в течение всего срока действия вашего приложения, таких как информация о пользователе и арендаторах, как вы упомянули.

Я надеюсь, что это поможет вам. Вот сообщение в блоге с примером использования ITelemetryInitializer.

Ответ 4

В этом документе прокрутите несколько строк до места, где говорится о создании реализации IContextInitializer. Вы можете вызвать это в любом методе, который будет вызываться до того, как телеметрия начнет катиться.

Пользовательские свойства будут добавлены ко всем событиям, исключениям, метрикам, запросам и т.д.

Ответ 5

Вы можете использовать статический словарь HttpContext.Current Items в качестве кратковременного (почти не HttpContext.Current состояния) пространства хранения для доставки значений пользовательских свойств в обработчик телеметрии по умолчанию с помощью пользовательского ITelemetryInitializer

Реализовать обработчик

class AppInsightCustomProps : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;
        // Is this a TrackRequest() ?
        if (requestTelemetry == null) return;

        var httpCtx = HttpContext.Current;
        if (httpCtx != null)
        {
            var customPropVal = (string)httpCtx.Items["PerRequestMyCustomProp"];
            if (!string.IsNullOrWhiteSpace(customPropVal))
            {
                requestTelemetry.Properties["MyCustomProp"] = customPropVal;
            }
        }
    }
}

global.asax.cs это. Поместите это в Application_Start в global.asax.cs

TelemetryConfiguration.Active.TelemetryInitializers.Add(new AppInsightCustomProps());

Запрограммируйте желаемое свойство в любом месте вашего конвейера запросов, например

if (HttpContext.Current != null)
{
    HttpContext.Current.Items["PerRequestMyCustomProp"] = myCustomPropValue;
}