Каналы телеметрии в Application Insights

Каналы телеметрии являются неотъемлемой частью пакетов SDK Application Insights. Они управляют буферизацией и передачей данных телеметрии в службу Application Insights. Версии пакетов SDK для .NET и .NET Core имеют два встроенных канала телеметрии: InMemoryChannel и ServerTelemetryChannel. В этой статье описывается каждый канал и показано, как настроить поведение канала.

Примечание.

В следующей документации используется классический API Application Insights. Долгосрочный план Application Insights — сбор данных с помощью OpenTelemetry. Дополнительные сведения см. в статье "Включение Azure Monitor OpenTelemetry для .NET", Node.js, приложений Python и Java и нашей стратегии OpenTelemetry. Рекомендации по миграции доступны для .NET, Node.js и Python.

Что такое каналы телеметрии?

Каналы телеметрии отвечают за буферизацию элементов телеметрии и их отправку в службу Application Insights, где они хранятся для изучения и анализа. Канал телеметрии — это любой класс, реализующий интерфейс Microsoft.ApplicationInsights.ITelemetryChannel.

Метод Send(ITelemetry item) канала телеметрии вызывается после вызова всех инициализаторов телеметрии и обработчиков данных телеметрии. Таким образом, все элементы, отброшенные обработчиком данных телеметрии, не будут обращаться к каналу. Метод Send() обычно не отправляет элементы в серверную часть мгновенно. Как правило, он буферизирует их в памяти и отправляет их в пакеты для эффективной передачи.

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

Встроенные каналы телеметрии

Пакеты SDK Application Insights для .NET и .NET Core поставляются с двумя встроенными каналами.

  • InMemoryChannel: упрощенный канал, который помещает элементы в память до тех пор, пока они не будут отправлены. Элементы помещаются в буфер памяти и записываются каждые 30 секунд или каждый раз, при буферизации 500 элементов. Этот канал дает минимальные гарантии надежности, так как не осуществляет повторной отправки данных телеметрии после сбоя. Этот канал также не хранит элементы на диске. Таким образом, любые неотступные элементы теряются окончательно после завершения работы приложения, будь то грациозно или нет. Этот канал реализует метод Flush(), который можно использовать для принудительного сброса всех элементов телеметрии в памяти в синхронном режиме. Этот канал хорошо подходит для кратковременно выполняемых приложений, в которых синхронный сброс является идеальным.

    Этот канал является частью более крупного пакета NuGet Microsoft.ApplicationInsights и является каналом по умолчанию, который пакет SDK использует при отсутствии других настроек.

  • ServerTelemetryChannel: более сложный канал с политиками повтора и возможностью хранения данных на локальном диске. Этот канал повторяет передачу данных телеметрии при возникновении временных ошибок. Этот канал также использует локальное дисковое хранилище для хранения элементов на диске во время простоя сети или при больших объемах данных телеметрии. Из-за этих механизмов повторных попыток и локального дискового хранилища этот канал считается более надежным. Мы рекомендуем использовать его для всех рабочих сценариев. Этот канал используется по умолчанию для приложений ASP.NET и ASP.NET Core, которые настроены в соответствии с официальной документацией. Этот канал оптимизирован для серверных сценариев с долго выполняющимися процессами. Метод Flush(), реализуемый этим каналом, не является синхронным.

    Этот канал поставляется в качестве пакета NuGet Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel и загружается автоматически в составе пакета NuGet Microsoft.ApplicationInsights.Web или Microsoft.ApplicationInsights.AspNetCore.

Настройка канала телеметрии

Канал телеметрии настраивается с помощью настройки активной конфигурации телеметрии. Для приложений ASP.NET конфигурация включает настройку экземпляра канала телеметрии или TelemetryConfiguration.Active изменения ApplicationInsights.config. Для приложений ASP.NET Core конфигурация включает добавление канала в контейнер внедрения зависимостей.

В следующих разделах приведены примеры настройки параметра StorageFolder для канала в различных типах приложений. StorageFolder — это только один из настраиваемых параметров. Полный список параметров конфигурации см . в разделе "Настраиваемые параметры" в разделе каналов далее в этой статье.

Настройка с помощью ApplicationInsights.config для приложений ASP.NET

В следующем разделе из ApplicationInsights.config показан канал ServerTelemetryChannel, для которого папка StorageFolder настроена в произвольном расположении.

    <TelemetrySinks>
        <Add Name="default">
            <TelemetryProcessors>
                <!-- Telemetry processors omitted for brevity  -->
            </TelemetryProcessors>
            <TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel">
                <StorageFolder>d:\temp\applicationinsights</StorageFolder>
            </TelemetryChannel>
        </Add>
    </TelemetrySinks>

Код конфигурации для приложений ASP.NET

Следующий код настраивает ServerTelemetryChannel экземпляр с StorageFolder заданным пользовательским расположением. Добавьте этот код в начале приложения, как правило, в Application_Start() методе в Global.aspx.cs.

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;
protected void Application_Start()
{
    var serverTelemetryChannel = new ServerTelemetryChannel();
    serverTelemetryChannel.StorageFolder = @"d:\temp\applicationinsights";
    serverTelemetryChannel.Initialize(TelemetryConfiguration.Active);
    TelemetryConfiguration.Active.TelemetryChannel = serverTelemetryChannel;
}

Код конфигурации для приложений ASP.NET Core

Измените метод ConfigureServices класса Startup.cs, как показано ниже:

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;

public void ConfigureServices(IServiceCollection services)
{
    // This sets up ServerTelemetryChannel with StorageFolder set to a custom location.
    services.AddSingleton(typeof(ITelemetryChannel), new ServerTelemetryChannel() {StorageFolder = @"d:\temp\applicationinsights" });

    services.AddApplicationInsightsTelemetry();
}

Внимание

Настройка канала с помощью TelemetryConfiguration.Active не поддерживается для приложений ASP.NET Core.

Код конфигурации для консольных приложений .NET и .NET Core

Для консольных приложений код одинаков для .NET и .NET Core:

var serverTelemetryChannel = new ServerTelemetryChannel();
serverTelemetryChannel.StorageFolder = @"d:\temp\applicationinsights";
serverTelemetryChannel.Initialize(TelemetryConfiguration.Active);
TelemetryConfiguration.Active.TelemetryChannel = serverTelemetryChannel;

Операционные сведения ServerTelemetryChannel

ServerTelemetryChannel хранит поступающие элементы в буфере в памяти. Элементы сериализуются, сжимаются и сохраняются в экземпляре Transmission каждые 30 секунд, или когда 500 элементов были помещены в буфер. Один экземпляр Transmission содержит до 500 элементов и представляет пакет телеметрии, который отправляется через один вызов HTTPS в службу Application Insights.

По умолчанию параллельно может отправляться не более 10 экземпляров Transmission. Если данные телеметрии поступают с более высокой скоростью или скорость сети или серверной части Application Insights низка, то экземпляры Transmission сохраняются в памяти. Емкость этого буфера Transmission в памяти по умолчанию составляет 5 МБ. При превышении объема памяти экземпляры Transmission сохраняются на локальном диске до ограничения в 50 МБ.

Экземпляры Transmission сохраняются на локальном диске при возникновении проблем с сетью. В случае сбоя приложения останутся только данные, сохраненные на локальном диске. Они будут отправлены при следующем запуске приложения. Если проблемы с сетью сохраняются, ServerTelemetryChannel используйте экспоненциальную логику обратной передачи в диапазоне от 10 секунд до 1 часа до повторных попыток отправки данных телеметрии.

Настраиваемые параметры в каналах

Полный список настраиваемых параметров для каждого канала см. в:

Ниже приведены наиболее часто используемые параметры для ServerTelemetryChannel.

  • MaxTransmissionBufferCapacity: максимальный объем памяти (в байтах), используемый каналом для передачи данных в буфер памяти. При достижении этой емкости новые элементы сохранятся непосредственно на локальном диске. Значение по умолчанию — 5 МБ. Если задать более высокое значение, это приводит к меньшему использованию дискового пространства, но помните, что элементы в памяти будут потеряны при сбое приложения.
  • MaxTransmissionSenderCapacity: максимальное количество экземпляров Transmission, которые будут отправляться за раз в Application Insights. Значение по умолчанию — 10. Этот параметр можно настроить на более высокое число, которое рекомендуется при создании огромного объема телеметрии. Большой объем данных обычно возникает во время нагрузочного тестирования или при отключении выборки.
  • StorageFolder: папка, используемая каналом для хранения элементов на диске по мере необходимости. В Windows используется %LOCALAPPDATA% или %TEMP%, если никакой другой путь не указан явным образом. В средах, отличных от Windows, необходимо указать допустимое расположение или данные телеметрии не будут сохраняться на локальном диске.

Какой канал использовать?

Для большинства рабочих сценариев рекомендуется использовать ServerTelemetryChannel длительные приложения. Метод, Flush() реализованный ServerTelemetryChannel не синхронным. Он также не гарантирует отправку всех ожидающих элементов из памяти или диска.

Если этот канал используется в сценариях, когда приложение завершает работу, введите некоторую задержку после вызова Flush(). Точную продолжительность необходимой задержки предугадать невозможно. Она зависит от таких факторов, как количество элементов или экземпляров Transmission в памяти, количество объектов на диске, количество передаваемых данных в серверную часть, а также сведения о том, относится ли канал к экспоненциальным вариантам обратной передачи.

Если вам нужно выполнить синхронную очистку, используйте InMemoryChannel.

Часто задаваемые вопросы

В этом разделы приводятся ответы на часто задаваемые вопросы.

Гарантирует ли канал Application Insights доставку данных телеметрии? Если нет, каковы сценарии, в которых можно потерять данные телеметрии?

Короткий ответ заключается в том, что ни один из встроенных каналов не обеспечивает гарантию доставки данных телеметрии в серверную часть. ServerTelemetryChannel превосходит по надежности доставки канал InMemoryChannel, но он также ограничен своими возможностями по отправке телеметрии. Данные телеметрии по-прежнему могут быть потеряны в нескольких ситуациях, включая следующие распространенные сценарии:

  • При сбое приложения элементы в памяти теряются.
  • Данные телеметрии теряются в случае продолжительных сетевых неполадок. Данные телеметрии сохраняются на локальном диске во время отключения сети или при возникновении проблем с серверной частью Application Insights. Однако элементы, возраст которых превышает 48 часов, удаляются.
  • Места хранения телеметрии в Windows по умолчанию %LOCALAPPDATA% или %TEMP%. Эти расположения обычно являются локальными для компьютера. Если приложение переносится физически из одного расположения в другое, все данные телеметрии, хранящиеся в исходном расположении, теряются.
  • В веб-приложениях Azure в Windows в качестве места хранения диска по умолчанию используется каталог D:\Local\LocalAppData. Это расположение не постоянно. Она удаляется в перезапусках приложений, горизонтальном масштабировании и других таких операциях, что приводит к потере данных телеметрии, хранящихся там. Можно переопределить значение по умолчанию и указать хранилище в постоянном расположении, например D:\Home. Тем не менее, такие сохраненные расположения обслуживаются удаленным хранилищем, поэтому они могут выполняться слишком долго.

Хотя и менее вероятно, канал может вызвать повторяющиеся элементы телеметрии. Это происходит при ServerTelemetryChannel повторных попытках из-за сбоя сети или времени ожидания, когда данные телеметрии были доставлены в серверную часть, но ответ был потерян из-за проблем с сетью или время ожидания.

Работает ли ServerTelemetryChannel на системах, отличных от Windows?

Хотя имя пакета и пространства имен содержит "WindowsServer", этот канал поддерживается на системах, работающих под управлением других ОС, за исключением следующего. В системах, отличных от Windows, канал не создает папку локального хранилища по умолчанию. Необходимо создать папку локального хранилища и настроить канал для ее использования. После настройки локального хранилища канал работает одинаково во всех системах.

Примечание.

В выпуске 2.15.0-beta3 и более поздней версии локальное хранилище теперь автоматически создается для Linux, Mac и Windows. Для систем, отличных от Windows, пакет SDK автоматически создаст локальную папку хранилища на основе следующей логики:

  • ${TMPDIR}: если ${TMPDIR} задана переменная среды, используется это расположение.
  • /var/tmp: Если предыдущее расположение не существует, попробуйте /var/tmp.
  • /tmp: если оба предыдущих расположения не существуют, попробуйте tmp.
  • Если ни одно из этих расположений не существует, локальное хранилище не создается и конфигурация вручную по-прежнему требуется. Полные сведения о реализации см . в этом репозитории GitHub.

Создает ли пакет SDK временное локальное хранилище? Зашифрованы ли данные в хранилище?

Пакет SDK хранит элементы телеметрии в локальном хранилище во время сетевых неполадок или при регулировании полосы пропускания. Эти данные не шифруются в локальном хранилище.

Для систем Windows пакет SDK автоматически создает временную локальную папку в каталоге %TEMP% или %LOCALAPPDATA% и ограничивает доступ к администраторам и текущему пользователю.

Для систем, отличных от Windows, локальное хранилище не создается автоматически пакетом SDK, поэтому данные по умолчанию не хранятся локально.

Примечание.

В выпуске 2.15.0-beta3 и более поздней версии локальное хранилище теперь автоматически создается для Linux, Mac и Windows.

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

Пакет SDK с открытым исходным кодом

Как и каждый пакет SDK для Application Insights, каналы используют открытый исходный код. Чтение и участие в работе с кодом или отчетами в официальном репозитории GitHub.

Следующие шаги