Tutorial: Monitorar e diagnosticar um aplicativo do Service Fabric usando o Application Insights

Este tutorial é a quinta parte de uma série. Ele percorre as etapas para configurar o monitoramento e o diagnóstico para um aplicativo ASP.NET Core em execução em um cluster do Azure Service Fabric usando o Application Insights. Você coleta telemetria do aplicativo desenvolvido na primeira parte da série de tutoriais.

Neste tutorial, irá aprender a:

  • Configurar um recurso do Application Insights
  • Adicionar o Application Insights aos serviços da aplicação
  • Exibir telemetria e mapa de aplicativos no Application Insights
  • Adicionar instrumentação personalizada à sua aplicação

A série de tutoriais mostra como:

Pré-requisitos

Antes de começar este tutorial:

Transferir a aplicação de votação de exemplo

Se você não criou o aplicativo de exemplo de votação na parte um desta série de tutoriais, você pode baixá-lo. Em uma janela de comando ou terminal, execute o seguinte comando para clonar o repositório de aplicativo de exemplo para seu computador local:

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

Configurar um recurso do Application Insights

O Application Insights é a plataforma de gerenciamento de desempenho de aplicativos do Azure. Recomendamos que você use o Application Insights para monitoramento e diagnóstico de aplicativos no Service Fabric.

Para criar um recurso do Application Insights, vá para o portal do Azure. Selecione Criar um recurso. No menu do portal, selecione Monitoramento + Diagnóstico. Na coluna Serviços populares do Azure, em Application Insights, selecione Criar.

Captura de tela que mostra como criar um novo recurso do Application Insights.

Insira ou selecione valores para Assinatura, Grupo de recursos e Nome. Em Região, escolha onde implantar seu cluster do Service Fabric no futuro. Neste tutorial, implantamos o aplicativo em um cluster local, portanto, a região do Azure é irrelevante. Para Tipo de aplicativo, deixe como ASP.NET aplicativo Web.

Captura de tela que mostra os atributos de recursos do Application Insights.

Depois de inserir ou selecionar as informações necessárias, selecione Criar para provisionar o recurso. O recurso é implantado em cerca de um minuto.

Adicionar o Application Insights aos serviços da aplicação

Abra o Visual Studio 2019 usando a opção Executar como administrador (clique com o botão direito do mouse no ícone do Visual Studio no menu Iniciar). Selecione Abrir Projeto/Solução de Arquivo>>e vá para o aplicativo de votação (criado na primeira parte do tutorial ou clonado do GitHub). Abra Voting.sln. Se você for solicitado a restaurar os pacotes NuGet do aplicativo, selecione Sim.

Para configurar o Application Insights para os serviços VotingWeb e VotingData:

  1. Clique com o botão direito do mouse no nome do serviço e selecione Adicionar>monitoramento de serviços>conectados com o Application Insights.

    Captura de tela que mostra a configuração dos serviços do Application Insights.

    Nota

    Dependendo do tipo de projeto, ao clicar com o botão direito do mouse no nome do serviço, talvez seja necessário selecionar Adicionar e, em seguida, selecionar Telemetria do Application Insights.

  2. Selecione Introdução.

  3. Entre na conta que você usa para sua assinatura do Azure e selecione a assinatura onde você criou o recurso do Application Insights. Para localizar o recurso, em Recurso, vá para o recurso Existing Application Insights. Selecione Registrar para adicionar o Application Insights ao seu serviço.

    Captura de tela que mostra como registrar o Application Insights.

  4. Selecione Concluir.

Nota

Certifique-se de executar estas etapas para ambos os serviços no aplicativo para concluir a configuração do Application Insights para o aplicativo. O mesmo recurso do Application Insights é utilizado para ambos os serviços para ver pedidos de entrada e saída e a comunicação entre os serviços.

Adicionar o NuGet Microsoft.ApplicationInsights.ServiceFabric.Native aos serviços

O Application Insights tem dois pacotes NuGet específicos do Service Fabric que você pode usar dependendo do cenário. Um é usado com serviços nativos do Service Fabric e o outro com contêineres e executáveis convidados. Nesse caso, usamos o pacote NuGet Microsoft.ApplicationInsights.ServiceFabric.Native para saber mais sobre o contexto do serviço. Para obter mais informações sobre o SDK do Application Insights e os pacotes NuGet específicos do Service Fabric, consulte Microsoft Application Insights for Service Fabric.

Para configurar o pacote NuGet:

  1. No Gerenciador de Soluções, clique com o botão direito do mouse em Solução 'Votação' e selecione Gerenciar Pacotes NuGet para Solução.

  2. Na caixa de diálogo NuGet - Solução, selecione Procurar. Marque a caixa de seleção Incluir pré-lançamento .

    Nota

    Talvez seja necessário instalar o pacote Microsoft.ServiceFabric.Diagnostics.Internal da mesma maneira se ele não tiver sido pré-instalado antes de instalar o pacote do Application Insights.

  3. Procure Microsoft.ApplicationInsights.ServiceFabric.Native, e selecione o pacote NuGet.

  4. No painel direito, marque a caixa de seleção VotingWeb e a caixa de seleção VotingData . Selecione Instalar.

    Captura de tela que mostra o SDK do Application Insights no NuGet.

  5. Na caixa de diálogo Visualizar alterações, selecione OK para aceitar a licença. Os pacotes NuGet são adicionados aos serviços.

  6. Em seguida, configure o inicializador de telemetria nos dois serviços. Abra VotingWeb.cs e VotingData.cs. Conclua as seguintes etapas em ambos os arquivos de código:

    1. Adicione estas duas using instruções na parte superior de cada arquivo, após as instruções existentes using :

      using Microsoft.ApplicationInsights.Extensibility;
      using Microsoft.ApplicationInsights.ServiceFabric;
      
    2. Em ambos os arquivos, na instrução aninhada de ou , em>servicesConfigureServices , com os outros serviços singleton declarados, adicione:CreateServiceReplicaListeners()CreateServiceInstanceListeners() return

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

      Esse código aumenta Service Context sua telemetria, para que você possa entender melhor a origem de sua telemetria no Application Insights. Sua instrução aninhada return no VotingWeb.cs agora é semelhante a este exemplo:

      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();
      

No VotingData.cs, seu código agora é semelhante a este exemplo:

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();

Verifique se o UseApplicationInsights() método é chamado em VotingWeb.cs e VotingData.cs como mostrado nos exemplos.

Nota

Este aplicativo de exemplo usa HTTP para que os serviços se comuniquem. Se você desenvolver um aplicativo usando o Service Fabric Service Remoting V2, adicione também as seguintes linhas no mesmo local no código:

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

Neste ponto, você está pronto para implantar o aplicativo. Selecione Iniciar (ou selecione F5). O Visual Studio cria e empacota o aplicativo, configura seu cluster local e implanta o aplicativo no cluster.

Nota

Você pode receber um erro de compilação se não tiver uma versão atualizada do SDK do .NET Core instalada.

Quando o aplicativo for implantado, vá para localhost:8080, onde o aplicativo de página única Voting Sample está sendo executado. Vote em alguns itens diferentes de sua escolha para criar alguns dados de amostra e telemetria. Por exemplo, sobremesas!

Captura de tela que mostra um exemplo de votação para tipos de sobremesa.

Você também pode remover algumas das opções de votação quando terminar de adicionar alguns votos.

Exibir telemetria e mapa de aplicativos no Application Insights

No portal do Azure, vá para o recurso do Application Insights.

Selecione Visão geral para voltar ao painel de visão geral do seu recurso. Selecione Pesquisar para ver os rastreamentos que chegam. Demora alguns minutos para que os rastreios apareçam no Application Insights. Se não vir quaisquer vestígios, aguarde um minuto e, em seguida, selecione o botão Atualizar .

Captura de tela que mostra a exibição de rastreamento de exibição do Application Insights.

Role para baixo na janela de pesquisa para exibir toda a telemetria de entrada que vem com o Application Insights. Para cada ação realizada no aplicativo de votação, deve haver uma solicitação PUT de saída de VotingWeb (PUT Votes/Put [nome]), uma solicitação PUT de entrada de VotingData (PUT VoteData/Put [nome]), seguida por um par de solicitações GET para atualizar os dados exibidos. Também haverá um rastreamento de dependência para HTTP em localhost porque essas solicitações são solicitações HTTP. Aqui está um exemplo do que você vê para como um voto é adicionado:

Captura de tela que mostra um rastreamento de solicitação de exemplo no Application Insights.

Você pode selecionar um rastreamento para ver mais detalhes sobre ele. O Application Insights inclui informações úteis sobre a solicitação, incluindo valores para Tempo de resposta e URL da solicitação. Como você adicionou o NuGet específico do Service Fabric, também obtém dados sobre seu aplicativo no contexto de um cluster do Service Fabric na seção Dados personalizados. Os dados incluem o contexto de serviço, para que você possa ver os valores PartitionID e ReplicaId da origem da solicitação e isolar melhor os problemas ao diagnosticar erros em seu aplicativo.

Captura de tela que mostra os detalhes do rastreamento do Application Insights.

Para ir para Mapa do aplicativo, selecione Mapa do aplicativo no menu de recursos no painel Visão geral ou selecione o ícone Mapa do aplicativo . O mapa mostra seus dois serviços conectados.

Captura de tela que destaca Mapa do aplicativo no menu de recursos.

O Mapa de Aplicativos pode ajudá-lo a entender melhor a topologia do aplicativo, especialmente quando você começa a adicionar serviços que funcionam juntos. Ele também fornece dados básicos sobre as taxas de sucesso de solicitações e pode ajudá-lo a diagnosticar solicitações com falha para entender onde as coisas deram errado. Para saber mais, consulte Mapa de aplicativos no Application Insights.

Adicionar instrumentação personalizada à sua aplicação

Embora o Application Insights forneça telemetria pronta, convém adicionar instrumentação personalizada. Talvez você tenha necessidades comerciais de instrumentação personalizada ou queira melhorar o diagnóstico quando algo der errado em seu aplicativo. Você pode ingerir eventos e métricas personalizados usando a API do Application Insights.

Em seguida, adicione alguns eventos personalizados ao VoteDataController.cs (em VotingData>Controllers) para acompanhar quando os votos estão sendo adicionados e excluídos do subjacente votesDictionary:

  1. Adicione using Microsoft.ApplicationInsights; no final das outras using declarações.

  2. Declare um novo valor para TelemetryClient no início da classe, sob a criação de IReliableStateManager: private TelemetryClient telemetry = new TelemetryClient();.

  3. Put() Na função, adicione um evento que confirme que um voto foi adicionado. Adicione telemetry.TrackEvent($"Added a vote for {name}"); depois que a transação for concluída, logo antes do extrato de devolução OkResult .

  4. No Delete(), há um "se/senão" baseado na condição que votesDictionary contém votos para uma opção de voto específica.

    1. Adicione um evento que confirme a exclusão de um voto na if declaração, após await tx.CommitAsync(): telemetry.TrackEvent($"Deleted votes for {name}");
    2. Adicione um evento para mostrar que a exclusão não ocorreu na else instrução, antes da return instrução: telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");

Eis um exemplo do aspeto das suas Put() funções e Delete() depois de adicionar os eventos:

// 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();
        }
    }
}

Quando terminar de fazer essas alterações, selecione Iniciar no aplicativo para que ele compile e implante a versão mais recente. Quando a implantação do aplicativo terminar, vá para localhost:8080. Adicione e exclua algumas opções de votação. Em seguida, volte ao recurso do Application Insights para ver os rastreamentos da execução mais recente (os rastreamentos levam de 1 a 2 minutos para aparecer no Application Insights). Para todos os votos que você adicionou e excluiu, agora você verá uma entrada para Evento personalizado com telemetria de resposta associada.

Captura de tela que mostra eventos personalizados.