Compartilhar via


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

Este tutorial é a parte cinco de uma série. Ele percorre as etapas para configurar o monitoramento e o diagnóstico de 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 parte um da série de tutoriais.

Neste tutorial, você aprenderá a:

  • Configurar um recurso do Application Insights
  • Adicionar o Application Insights aos serviços do aplicativo
  • Exibir telemetria e mapa de aplicativos no Application Insights
  • Adicionar instrumentação personalizada ao seu aplicativo

A série de tutoriais mostra como:

Pré-requisitos

Antes de começar este tutorial:

Baixar o aplicativo de exemplo Votação

Se você não tiver criado o aplicativo de exemplo de votação na parte um desta série de tutoriais, poderá baixá-lo. Em uma janela de comando ou terminal, execute o seguinte comando para clonar o repositório de aplicativo de exemplo no 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, acesse 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 recursose Nome. Para 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 aplicativo Web ASP.NET.

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

Quando você inseriu ou selecionou 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 do aplicativo

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 Arquivo>Abrir>Projeto/Solução e vá para o aplicativo de votação (criado na parte um do tutorial ou clonado do GitHub). Abra Voting.sln. Se for solicitado que você restaure 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>Serviços Conectados>Monitoramento com o Application Insights.

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

    Observação

    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 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 na qual você criou o recurso do Application Insights. Para localizar o recurso, no Recurso, acesse Recurso existente do 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.

Observação

Certifique-se de seguir essas etapas para ambos os serviços no aplicativo concluírem a configuração do Application Insights para o aplicativo. O mesmo recurso do Application Insights é usado para ambos os serviços a fim de ver solicitações e comunicação de entrada e de saída entre os serviços.

Adicionar o NuGet do 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 para Service Fabric.

Para configurar o pacote NuGet:

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

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

    Observação

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

  3. Pesquise por 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 instruções using na parte superior de cada arquivo, após as instruções using existentes:

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

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

      Esse código adiciona Service Context à telemetria, para que você possa entender melhor a origem da telemetria no Application Insights. Sua instrução return aninhada 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();
      

Em 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 método UseApplicationInsights() é chamado em VotingWeb.cs e VotingData.cs, conforme mostrado nos exemplos.

Observação

Esse aplicativo de exemplo usa HTTP para a comunicação dos serviços. Se você desenvolver um aplicativo usando o Service Fabric 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 compila e empacota o aplicativo, configura seu cluster local e implanta o aplicativo no cluster.

Observação

Você poderá receber um erro de build se não tiver uma versão atualizada do SDK do .NET Core instalada.

Quando o aplicativo for implantado, vá para localhost:8080, em que o aplicativo de página única de exemplo de votação está em execução. Vote em alguns itens diferentes de sua escolha para criar alguns dados de exemplo 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 recurso. Selecione Pesquisar para ver os rastreamentos que estão chegando. Levará alguns minutos para que os rastreamentos sejam exibidos no Application Insights. Se você não vir nenhum rastreamento, aguarde um minuto e selecione o botão Atualizar.

Role para baixo na janela de pesquisa para exibir toda a telemetria de entrada que vem com o Application Insights. Para cada ação que você executou 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ê sobre 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 de 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.

Para acessar o 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 realça o mapa do aplicativo no menu de recursos.

O Mapa do Aplicativo 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 êxito da solicitação e pode ajudá-lo a diagnosticar a solicitação com falha para entender onde as coisas deu errado. Para saber mais, consulte Mapa do Aplicativo no Application Insights.

Adicionar instrumentação personalizada ao seu aplicativo

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

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

  1. Adicione using Microsoft.ApplicationInsights; ao final das outras instruções using.

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

  3. Na função Put(), adicione um evento que confirme se uma votação foi adicionada. Adicione telemetry.TrackEvent($"Added a vote for {name}"); após a conclusão da transação, logo antes da instrução OkResult de retorno.

  4. Em Delete(), há um "se/else" com base na condição de que votesDictionary contém votos para uma opção de votação específica.

    1. Adicione um evento que confirme a exclusão de uma votação na instrução if, 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 instrução else, antes da instrução return: telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");

Veja um exemplo de como suas funções Put() e Delete() podem ser 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 crie e implante a versão mais recente. Quando o aplicativo terminar de implantar, vá para localhost:8080. Adicione e exclua algumas opções de votação. Em seguida, volte para o 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ê deverá ver uma entrada para Evento Personalizado com telemetria de resposta associada.

Captura de tela que mostra eventos personalizados.