Использование статического экземпляра TelemetryClient с Application Insights

У меня есть веб-сайт ASP.NET MVC, и я внедряю Application Insights. Прямо сейчас я регистрирую событие трассировки следующим образом:

private static TelemetryClient _APM;
private static TelemetryClient APM
{
    get
    {
        if (_APM == null) { _APM = new TelemetryClient(); }
        return _APM;
    }
}

public static void Trace(string Message)
{
    APM.TrackTrace(Message);
}

Как видите, это будет поддерживать один статический экземпляр TelemetryClient для всех трассировок. Это то, как мы должны использовать клиента? Или мы должны создавать новый экземпляр TelemetryClient для каждого журнала?


person William    schedule 10.01.2016    source источник


Ответы (2)


Согласно документации вам следует:

... используйте экземпляр TelemetryClient для каждого модуля вашего приложения. Например, у вас может быть один TelemetryClient в веб-службе для сообщения о входящих HTTP-запросах, а другой — в классе промежуточного программного обеспечения для сообщения о событиях бизнес-логики.

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

person darth_phoenixx    schedule 10.01.2016
comment
Идеальный! Это именно то, что я искал! - person William; 10.01.2016
comment
вы можете сделать это, однако для серверного приложения или ASP.Net вы можете не использовать статический TelemetryClient. если вы используете статический синглтон, некоторые из полей контекста, которые регистрируются с помощью телеметрии (пользователь, сеанс, операция), будут установлены один раз заранее. Использование нового клиента телеметрии будет (попытаться) наследовать пользователя/сессию/и т. д. из конвейера asp.net, что может помочь вам диагностировать, что происходит, при просмотре трассировки. на портале вы сможете просмотреть все данные телеметрии в том же сеансе, в котором выполнялась трассировка. или какой запрос asp.net вызвал трассировку. - person John Gardner; 13.01.2016
comment
Добавление к комментарию @JohnGardner ... не было бы явно неправильно использовать singleton/static? Например. запрос 1, мы устанавливаем AuthenticatedUserId = "jon", и тогда он имеет jon в всех журналах, которые проходят через наш синглтон, но тут же приходит запрос 2, и мы устанавливаем AuthenticatedUserId = "matt", теперь это привязано к все следующие журналы. Разве это не произойдет/постоянно переворачивает значения вещей, которые устанавливаются для каждого запроса? - person Don Cheadle; 06.05.2019

Полная цитата, на которую ссылается darth_phoenixx, на самом деле гласит:

TelemetryClient является потокобезопасным.

Для проектов ASP.NET и Java входящие HTTP-запросы перехватываются автоматически. Возможно, вы захотите создать дополнительные экземпляры TelemetryClient для другого модуля вашего приложения. Например, у вас может быть один экземпляр TelemetryClient в классе ПО промежуточного слоя для сообщения о событиях бизнес-логики. Вы можете установить такие свойства, как UserId и DeviceId, для идентификации машины. Эта информация прикрепляется ко всем событиям, отправляемым экземпляром.

TelemetryClient.Context.User.Id = "...";
TelemetryClient.Context.Device.Id = "...";

Последний штрих чрезвычайно важен. Если вы пишете что-то вроде веб-приложения, где UserId может измениться, вам, вероятно, следует повторно использовать экземпляр клиента телеметрии для каждой области, в которой все эти значения будут одинаковыми (например, каждый запрос), но не как статический/одиночный экземпляр.

Обновлять

В ASP.NET Core Application Insights интенсивно использует внедрение зависимостей и регистрирует TelemetryClient как синглтон!

Это означает, что вам следует избегать установки переменных в контексте клиента, которые вы не хотите использовать во всем приложении, и вместо этого использовать инициализаторы телеметрии для установки таких вещей, как идентификатор пользователя, для каждого объекта телеметрии.

person StriplingWarrior    schedule 20.08.2018