Поделиться через


Руководство. Мониторинг и диагностика приложения Service Fabric с помощью Application Insights

Это руководство является частью пяти в серии. В нем описаны действия по настройке мониторинга и диагностика для приложения ASP.NET Core, работающего в кластере Azure Service Fabric с помощью Application Insights. Данные телеметрии собираются из приложения, разработанного в одной из серии учебников.

В этом руководстве описано следующее:

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

В серии учебников показано, как:

Необходимые компоненты

Перед началом работы с этим руководством выполните следующие действия:

Скачивание примера приложения для голосования

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

git clone https://github.com/Azure-Samples/service-fabric-dotnet-quickstart

Настройка ресурса Application Insights

Application Insights — это платформа управления производительностью приложений Azure. Мы рекомендуем использовать Application Insights для мониторинга приложений и диагностика в Service Fabric.

Чтобы создать ресурс Application Insights, перейдите к портал Azure. Выберите Создать ресурс. В меню портала выберите "Мониторинг и диагностика". В столбце популярных служб Azure в разделе Application Insights выберите "Создать".

Снимок экрана: создание нового ресурса Application Insights.

Введите или выберите значения для подписки, группы ресурсов и имени. В регионе выберите место для развертывания кластера Service Fabric в будущем. В этом руководстве мы развертываем приложение в локальном кластере, поэтому регион Azure не имеет значения. Для типа приложения оставьте ASP.NET веб-приложение.

Снимок экрана: атрибуты ресурсов Application Insights.

Когда вы ввели или выбрали необходимые сведения, нажмите кнопку "Создать ", чтобы подготовить ресурс. Ресурс развертывается примерно за одну минуту.

Добавление Application Insights в службы приложения

Откройте Visual Studio 2019 с помощью параметра "Запуск от имени администратора " (щелкните правой кнопкой мыши значок Visual Studio в меню "Пуск "). Выберите "Открыть>файл>" или "Решение" и перейдите в приложение "Голосование" (созданное в одной части руководства или клонированного из GitHub). Откройте Voting.sln. Если вам будет предложено восстановить пакеты NuGet приложения, нажмите кнопку "Да".

Чтобы настроить Application Insights для служб VotingWeb и VotingData, выполните следующие действия.

  1. Щелкните правой кнопкой мыши имя службы и выберите "Добавить>мониторинг подключенных служб>" с помощью Application Insights.

    Снимок экрана: настройка служб Application Insights.

    Примечание.

    В зависимости от типа проекта при щелчке правой кнопкой мыши имя службы может потребоваться выбрать "Добавить", а затем выбрать Application Insights Telemetry.

  2. Выберите Приступая к работе.

  3. Войдите в учетную запись, используемую для подписки Azure, и выберите подписку, в которой вы создали ресурс Application Insights. Чтобы найти ресурс, перейдите к существующему ресурсу Application Insights. Выберите Регистрация, чтобы добавить Application Insights в службу.

    Снимок экрана: регистрация Application Insights.

  4. Нажмите Готово.

Примечание.

Выполните эти действия для обеих служб в приложении, чтобы завершить настройку Application Insights для приложения. Для служб используется один и тот же ресурс Application Insights, чтобы отслеживать входящие и исходящие запросы, а также обмен данными между службами.

Добавление пакета NuGet Microsoft.ApplicationInsights.ServiceFabric.Native в службы

Application Insights содержит два пакета NuGet, зависящие от Service Fabric, которые можно использовать в зависимости от сценария. Один используется с собственными службами Service Fabric, а другой — с контейнерами и гостевыми исполняемыми файлами. В этом случае мы используем пакет NuGet Microsoft.ApplicationInsights.ServiceFabric.Native NuGet для изучения контекста службы. Дополнительные сведения о пакете SDK Application Insights и пакетах NuGet для Service Fabric см. в разделе Microsoft Application Insights для Service Fabric.

Чтобы настроить пакет NuGet, выполните следующие действия.

  1. В Обозреватель решений щелкните правой кнопкой мыши решение "Голосование" и выберите пункт "Управление пакетами NuGet для решения".

  2. В диалоговом окне "Решение NuGet" нажмите кнопку "Обзор". Установите флажок Включить предварительные выпуски.

    Примечание.

    Возможно, потребуется установить пакет Microsoft.ServiceFabric.Diagnostics.Internal таким же образом, если он не был предварительно установлен перед установкой пакета Application Insights.

  3. Найдите Microsoft.ApplicationInsights.ServiceFabric.Native и выберите пакет NuGet.

  4. В правой области установите флажок VotingWeb и флажок VotingData . Выберите Установить.

    Снимок экрана: пакет SDK Application Insights в NuGet.

  5. В диалоговом окне "Предварительные изменения" нажмите кнопку "ОК ", чтобы принять лицензию. Пакеты NuGet добавляются в службы.

  6. Затем настройте инициализатор телеметрии в двух службах. Откройте VotingWeb.cs и VotingData.cs. Выполните следующие действия в обоих файлах кода:

    1. Добавьте эти две using инструкции в верхней части каждого файла после существующих using инструкций:

      using Microsoft.ApplicationInsights.Extensibility;
      using Microsoft.ApplicationInsights.ServiceFabric;
      
    2. В обоих файлах вложенной return инструкции CreateServiceInstanceListeners() или CreateServiceReplicaListeners()в разделе ConfigureServices>servicesс другими службами одноэлементных служб, объявленных, добавьте:

      .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext))
      

      Этот код добавляется Service Context в данные телеметрии, чтобы лучше понять источник телеметрии в Application Insights. Вложенный return оператор в VotingWeb.cs теперь выглядит примерно так:

      return new WebHostBuilder()
          .UseKestrel()
          .ConfigureServices(
              services => services
                  .AddSingleton<HttpClient>(new HttpClient())
                  .AddSingleton<FabricClient>(new FabricClient())
                  .AddSingleton<StatelessServiceContext>(serviceContext)
                  .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
          .UseContentRoot(Directory.GetCurrentDirectory())
          .UseStartup<Startup>()
          .UseApplicationInsights()
          .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
          .UseUrls(url)
          .Build();
      

В VotingData.cs код теперь выглядит примерно так:

return new WebHostBuilder()
    .UseKestrel()
    .ConfigureServices(
        services => services
            .AddSingleton<StatefulServiceContext>(serviceContext)
            .AddSingleton<IReliableStateManager>(this.StateManager)
            .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext)))
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseStartup<Startup>()
    .UseApplicationInsights()
    .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
    .UseUrls(url)
    .Build();

Дважды проверьте, вызывается ли UseApplicationInsights() метод как в VotingWeb.cs, так и в VotingData.cs, как показано в примерах.

Примечание.

В этом примере приложения используется HTTP для обмена данными служб. Если вы разрабатываете приложение с помощью удаленного взаимодействия Service Fabric версии 2, добавьте следующие строки в том же расположении в коде:

ConfigureServices(services => services
    ...
    .AddSingleton<ITelemetryModule>(new ServiceRemotingDependencyTrackingTelemetryModule())
    .AddSingleton<ITelemetryModule>(new ServiceRemotingRequestTrackingTelemetryModule())
)

На этом этапе вы готовы развернуть приложение. Нажмите кнопку "Пуск" (или выберите F5). Visual Studio создает и упаковает приложение, настраивает локальный кластер и развертывает приложение в кластере.

Примечание.

Если у вас нет актуальной версии пакета SDK для .NET Core, может возникнуть ошибка сборки.

При развертывании приложения перейдите в папку localhost:8080, в которой выполняется одностраничное приложение для голосования. Проголосуйте за несколько различных элементов вашего выбора, чтобы создать некоторые примеры данных и телеметрии. Например, десерты!

Снимок экрана: пример голосования по типам десерта.

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

Просмотр данных телеметрии и карты приложений в Application Insights

Вернитесь к ресурсу Application Insights на портале Azure.

Выберите "Обзор", чтобы вернуться к области обзора ресурса. Выберите "Поиск", чтобы просмотреть трассировки, в которые будут входить. Для появления трассировок в Application Insights требуется несколько минут. Если трассировка не отображается, подождите минуту и нажмите кнопку "Обновить ".

Прокрутите вниз в окне поиска, чтобы просмотреть все входящие данные телеметрии, которые поставляется с Application Insights. Для каждого действия, которое вы приняли в приложении голосования, должен быть исходящий запрос PUT из VotingWeb (PUT Votes/Put [name]), входящий запрос PUT из VotingData (PUT VoteData /Put [имя]), а затем пара запросов GET для обновления отображаемых данных. Также будет трассировка зависимостей для HTTP, localhost так как эти запросы являются HTTP-запросами. Ниже приведен пример того, что вы видите, как добавляется один голос:

Снимок экрана: пример трассировки запроса в Application Insights.

Вы можете выбрать трассировку, чтобы просмотреть дополнительные сведения об этом. Application Insights содержит полезные сведения о запросе, включая значения времени отклика и URL-адрес запроса. Так как вы добавили NuGet для Service Fabric, вы также получаете данные о приложении в контексте кластера Service Fabric в разделе "Пользовательские данные ". Данные включают контекст службы, чтобы вы могли видеть значения PartitionID и ReplicaId источника запроса и лучше изолировать проблемы при диагностике ошибок в приложении.

Чтобы перейти на карту приложений, выберите " Карта приложения" в меню ресурсов на панели "Обзор " или значок карты приложения. На карте показаны две службы, подключенные.

Снимок экрана: карта приложения в меню ресурсов.

Карта приложений поможет лучше понять топологию приложения, особенно при начале добавления служб, которые работают вместе. Он также предоставляет базовые данные о частоте успешного выполнения запросов, и это может помочь вам диагностировать неудачный запрос, чтобы понять, где дело пошло не так. Дополнительные сведения см. в статье "Карта приложений" в Application Insights.

Добавление пользовательского инструментария для приложения

Несмотря на то что Application Insights предоставляет данные телеметрии из поля, может потребоваться добавить настраиваемое инструментирование. Возможно, у вас есть бизнес-потребности в пользовательском инструментировании или вы хотите улучшить диагностика, когда вещи идут не так в приложении. Вы можете получать пользовательские события и метрики с помощью API Application Insights.

Затем добавьте некоторые пользовательские события в VoteDataController.csVotingData>Controllers) для отслеживания добавления и удаления голосов из базовой votesDictionaryбазы:

  1. Добавьте using Microsoft.ApplicationInsights; в конце других using инструкций.

  2. Объявите новое значение в TelemetryClient начале класса при создании IReliableStateManager: private TelemetryClient telemetry = new TelemetryClient();.

  3. Put() В функции добавьте событие, которое подтверждает добавление голосования. Добавьте telemetry.TrackEvent($"Added a vote for {name}"); после завершения транзакции прямо перед оператором return OkResult .

  4. В Delete(), есть "if/else" на основе условия, содержащего votesDictionary голоса за конкретный вариант голосования.

    1. Добавьте событие, которое подтверждает удаление голосования в if заявлении после await tx.CommitAsync(): telemetry.TrackEvent($"Deleted votes for {name}");
    2. Добавьте событие, чтобы показать, что удаление не произошло в else инструкции, перед инструкцией return : telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");

Ниже приведен пример того, как выглядят ваши Put() функции и Delete() функции после добавления событий:

// PUT api/VoteData/name
[HttpPut("{name}")]
public async Task<IActionResult> Put(string name)
{
    var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        await votesDictionary.AddOrUpdateAsync(tx, name, 1, (key, oldvalue) => oldvalue + 1);
        await tx.CommitAsync();
    }

    telemetry.TrackEvent($"Added a vote for {name}");
    return new OkResult();
}

// DELETE api/VoteData/name
[HttpDelete("{name}")]
public async Task<IActionResult> Delete(string name)
{
    var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        if (await votesDictionary.ContainsKeyAsync(tx, name))
        {
            await votesDictionary.TryRemoveAsync(tx, name);
            await tx.CommitAsync();
            telemetry.TrackEvent($"Deleted votes for {name}");
            return new OkResult();
        }
        else
        {
            telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");
            return new NotFoundResult();
        }
    }
}

Завершив внесение этих изменений, нажмите кнопку "Пуск " в приложении, чтобы она создавала и развертывала последнюю версию. После завершения развертывания приложения перейдите к разделу localhost:8080. Добавьте и удалите некоторые варианты голосования. Затем вернитесь к ресурсу Application Insights, чтобы просмотреть трассировки для последнего выполнения (трассировка занимает от 1 до 2 минут, чтобы появиться в Application Insights). Для всех добавленных и удаленных голосов теперь должна появиться запись для настраиваемого события с связанной телеметрией ответа.

Снимок экрана: пользовательские события.