Tutorial: Monitorizar e diagnosticar uma aplicação ASP.NET Core no Service Fabric com o Application Insights

Este tutorial é a quinta parte de uma série. Explica os passos para configurar a monitorização e o diagnóstico de uma aplicação ASP.NET Core em execução num cluster do Service Fabric com o Application Insights. Iremos recolher telemetria da aplicação desenvolvida na primeira parte do tutorial Criar uma aplicação .NET do Service Fabric.

Na quarta parte desta série de tutoriais, ficará a saber como:

  • Configurar o Application Insights para a sua aplicação
  • Recolher a telemetria de resposta para rastrear a comunicação baseada em HTTP entre os serviços
  • Utilizar a funcionalidade da Mapa da Aplicação no Application Insights
  • Adicionar eventos personalizados através da API do Application Insights

Nesta série de tutoriais, ficará a saber como:

Pré-requisitos

Antes de começar este tutorial:

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

Se não criou a aplicação de exemplo de Voto na primeira parte desta série de tutoriais, pode transferi-la. Num terminal ou janela do comando, execute o seguinte comando para clonar o repositório da aplicação de exemplo para o 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 gestão de desempenho de aplicações do Azure e a plataforma recomendada do Service Fabric para a monitorização e o diagnóstico de aplicações.

Para criar um recurso do Application Insights, navegue até ao portal do Azure. Selecione Criar um recurso no menu de navegação esquerdo para abrir Azure Marketplace. Selecione Monitorização + Gestão e, em seguida, Application Insights.

Criar novo recurso de IA

Agora tem de preencher as informações necessárias sobre os atributos do recurso a criar. Introduza um Nome, Grupo de Recursos, e Subscrição adequados. Defina a Localização para onde pretende implementar o cluster do Service Fabric no futuro. Neste tutorial, iremos implementar a aplicação num cluster local, por isso, o campo Localização é irrelevante. O Tipo de Aplicação deve ser deixado como “Aplicação Web ASP.NET”.

Atributos de recurso de IA

Depois de preencher as informações necessárias, selecione Criar para aprovisionar o recurso. Deverá demorar cerca de um minuto.

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

Inicie o Visual Studio 2019 com privilégios elevados ao clicar com o botão direito do rato no ícone do Visual Studio no Menu Iniciar e selecionar Executar como administrador. Selecione Ficheiro>Abrir>Projeto/Solução e navegue para a aplicação De voto (criada na primeira parte do tutorial ou clonada no Git). Abra Voting.sln. Se lhe for pedido para restaurar os pacotes NuGet da aplicação, selecione Sim.

Siga estes passos para configurar o Application Insights para os serviços VotingWeb e VotingData:

  1. Clique com o botão direito do rato no nome do serviço e selecione Adicionar > Monitorização de Serviços Ligados > com o Application Insights.

    Configurar a IA

Nota

Consoante o tipo de projeto, quando clica com o botão direito do rato no nome do serviço, poderá ter de selecionar Add-> Application Insights Telemetry ...

  1. Selecione Começar.

  2. Inicie sessão na conta que utiliza para a sua subscrição do Azure e selecione a subscrição na qual criou o recurso do Application Insights. Localize o recurso em Recurso do Application Insights existente na lista pendente "Recurso". Selecione Registar para adicionar o Application Insights ao seu serviço.

    Registar IA

  3. Clique em Concluir assim que a caixa de diálogo que aparece concluir a ação.

Nota

Garanta que segue os passos acima para ambos os serviços da aplicação para concluir a configuração do Application Insights para a aplicação. 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 NuGets específicos do Service Fabric que podem ser utilizados dependendo do cenário. Um é utilizado com serviços nativos do Service Fabric e o outro com contentores e executáveis convidados. Neste caso, iremos utilizar o NuGet Microsoft.ApplicationInsights.ServiceFabric.Native para tirar partido da compreensão de contexto de serviço que implica. Para ler mais sobre o SDK do Application Insights e os pacotes NuGet específicos do Service Fabric, veja Microsoft Application Insights para Service Fabric.

Eis os passos para configurar o pacote NuGet:

  1. Clique com o botão direito do rato na Solução "Voting" na parte superior do Explorador de Soluções e selecione Gerir Pacotes NuGet para Solução....
  2. Selecione Procurar no menu de navegação superior da janela "NuGet - Solução" e selecione a caixa Incluir pré-lançamento junto à barra de pesquisa.

Nota

Poderá ter de instalar o pacote de Microsoft.ServiceFabric.Diagnostics.Internal de forma semelhante, se não for pré-instalado antes de instalar o pacote do Application Insights

  1. Procure Microsoft.ApplicationInsights.ServiceFabric.Native e selecione o pacote NuGet adequado.

  2. À direita, selecione as duas caixas de verificação junto aos dois serviços na aplicação , VotingWeb e VotingData e selecione Instalar. Nuget de SDK de IA

  3. Selecione OK na caixa de diálogo Pré-visualizar Alterações apresentada e aceite a Aceitação da Licença. Deste modo, irá concluir a adição do NuGet aos serviços.

  4. Agora tem de configurar o inicializador de telemetria nos dois serviços. Para tal, abra VotingWeb.cs e VotingData.cs. Para ambos os parâmetros, execute os dois passos seguintes:

    1. Adicione estas duas instruções using na parte superior de cada <ServiceName.cs>, após as instruções using existentes:
    using Microsoft.ApplicationInsights.Extensibility;
    using Microsoft.ApplicationInsights.ServiceFabric;
    
    1. Em ambos os ficheiros, na declaração de devolução aninhada de CreateServiceInstanceListeners() ou CreateServiceReplicaListeners(), em ConfigurarServiços, com os outros serviços > singleton declarados, adicione:
    .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext))
    

    Deste modo, irá adicionar o Contexto do Serviço à sua telemetria, permitindo-lhe compreender melhor a origem da sua telemetria no Application Insights. A declaração devolver aninhada no VotingWeb.cs deve ter este aspeto:

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

    Da mesma forma, no VotingData.cs, deverá ter:

    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 novamente se o UseApplicationInsights() método é chamado em VotingWeb.cs e VotingData.cs , conforme mostrado acima.

Nota

Esta aplicação de exemplo utiliza http para os serviços para comunicar. Se desenvolver uma aplicação com o serviço Gestão remota V2 também terá de adicionar as seguintes linhas de código no mesmo local como fez acima

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

Agora, está pronto para implementar a aplicação. Selecione Iniciar na parte superior (ou F5) e o Visual Studio irá compilar e empacotar a aplicação, configurar o cluster local e implementar a aplicação no mesmo.

Nota

Poderá obter um erro de compilação se não tiver uma versão atualizada do SDK .NET Core instalada.

Quando a aplicação terminar a implementação, aceda a localhost:8080, onde deverá conseguir ver a aplicação de página única de Exemplo de Voto. Vote nalguns itens da sua preferência para criar alguns dados e telemetria de exemplo – escolhi as sobremesas!

Votos de exemplo de IA

Não hesite em Remover algumas das opções de votos, bem como quando tiver terminado de adicionar alguns votos.

Ver a telemetria e o mapa da aplicação no Application Insights

Vá para recurso do Application Insights no Portal do Azure.

Selecione Descrição geral para voltar à página de destino do recurso. Em seguida, selecione Procurar na parte superior para ver os rastreios que estão a chegar. Demora alguns minutos para que os rastreios apareçam no Application Insights. Se não vir nenhum, aguarde um pouco e toque no botão Atualizar na parte superior. IA – ver rastreios

Desloque-se para baixo na janela Pesquisar para mostrar toda a telemetria de entrada que obtém inicialmente com o Application Insights. Para cada ação realizada na aplicação de Votação, deverá haver um pedido PUT de saída de VotingWeb (Votos PUT/Put [nome]), um pedido PUT recebido de VotingData (PUT VoteData/Put [nome]), seguido de um par de pedidos GET para atualizar os dados que estão a ser apresentados. Também haverá um rastreio de dependência de HTTP no localhost, uma vez que estes são pedidos HTTP. Eis um exemplo do que verá sobre a forma como um voto é adicionado:

Rastreio de pedido de exemplo de IA

Pode selecionar num dos rastreios para ver mais detalhes sobre o mesmo. Não há informações úteis sobre o pedido realizado pelo Application Insights, incluindo o Tempo de resposta e o URL do Pedido. Além disso, uma vez que adicionou o NuGet específico do Service Fabric, irá também obter dados sobre a sua aplicação no contexto de um cluster do Service Fabric na secção Dados Personalizados abaixo. Esta secção inclui o contexto de serviço, para que possa ver o PartitionID e ReplicaId da origem do pedido e localizar melhor os problemas quando diagnosticar erros na sua aplicação.

Detalhes de rastreio de IA

Além disso, pode selecionar Mapa da aplicação no menu esquerdo na página Descrição geral ou selecionar o ícone Mapa da aplicação para o levar para o Mapa de Aplicações que mostra os seus dois serviços ligados.

Captura de ecrã que realça o Mapa da aplicação no menu esquerdo.

O Mapa da aplicação pode ajudar a compreender melhor a topologia da aplicação, especialmente quando começar a adicionar vários serviços que funcionam em conjunto. Também lhe dá dados básicos sobre taxas de êxito de pedidos e pode ajudar a diagnosticar pedidos falhados para compreender onde as coisas poderão ter corrido mal. Para saber mais sobre como utilizar o Mapa da aplicação, veja Mapa da Aplicação no Application Insights.

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

Apesar de o Application Insights proporcionar muita telemetria desde o início, poderá querer adicionar mais instrumentação personalizada. Tal pode ser baseado nas suas necessidades de negócio ou para melhorar o diagnóstico quando as coisas correrem mal na sua aplicação. O Application Insights tem um API para ingerir eventos e métricas personalizadas, sobre o qual pode ler mais aqui.

Vamos adicionar alguns eventos personalizados a VoteDataController.cs (em Controladores>VotingData) para controlar quando os votos estão a ser adicionados e eliminados do votesDictionary subjacente.

  1. Adicione using Microsoft.ApplicationInsights; no fim do outro através de declarações.
  2. Declare um novo TelemetryClient no início da classe, abaixo da criação do IReliableStateManager: private TelemetryClient telemetry = new TelemetryClient();.
  3. Na função Put(), adicione um evento que confirme que um voto foi adicionado. Adicione telemetry.TrackEvent($"Added a vote for {name}"); após a transação estar concluída, mesmo antes da declaração OkResult.
  4. Em Delete(), há um "if/else" com base na condição de que o votesDictionary contém votos para uma determinada opção de voto.
    1. Adicione um evento que confirme a eliminação de um voto na declaração if, após await tx.CommitAsync(): telemetry.TrackEvent($"Deleted votes for {name}");
    2. Adicione um evento para mostrar que a eliminação não ocorreu na declaração else, antes do elemento de matriz: telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");

Eis um exemplo do aspeto que as funções Put() e Delete() poderão ter 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();
        }
    }
}

Depois de realizar estas alterações, Inicie a aplicação para criar e implementar a versão mais recente da mesma. Quando a aplicação terminar de implementar, aceda a localhost:8080e adicione e elimine algumas opções de voto. Em seguida, volte ao recurso do Application Insights para ver os rastreios da execução mais recente (como anteriormente, os rastreios podem demorar 1 a 2 minutos a aparecer no Application Insights). Para todos os votos adicionados e eliminados, deverá ver agora um "Evento Personalizado* juntamente com toda a telemetria de resposta.

eventos personalizados

Passos seguintes

Neste tutorial, ficou a saber como:

  • Configurar o Application Insights para a sua aplicação
  • Recolher a telemetria de resposta para rastrear a comunicação baseada em HTTP entre os serviços
  • Utilizar a funcionalidade da Mapa da Aplicação no Application Insights
  • Adicionar eventos personalizados através da API do Application Insights

Agora que configurou a monitorização e o diagnóstico da sua aplicação ASP.NET, experimente o seguinte: