Добавление настраиваемых свойств для каждого запроса в метках 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
?
Ответы
Ответ 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:
- Пользовательское событие
- Запрос
- Исключение
- Трассировка
- Просмотр страницы
- Зависимость от
Узнав об этом, мы можем сказать, что 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;
}