Tutorial: Monitorar e diagnosticar um aplicativo ASP.NET Core no 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 para um aplicativo ASP.NET Core em execução em um cluster do Service Fabric usando o Application Insights. Coletaremos a telemetria do aplicativo desenvolvido na primeira parte do tutorial, Criar um aplicativo .NET do Service Fabric.

Na parte quatro da série de tutoriais, você aprenderá a:

  • Configurar o Application Insights para seu aplicativo
  • Coletar telemetria de resposta para rastrear comunicação baseada em HTTP entre serviços
  • Usar o recurso Mapa de aplicativos no Application Insights
  • Adicionar eventos personalizados usando a API do Application Insights

Nesta série de tutoriais, você aprenderá a:

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 Votação na parte um esta série de tutoriais, poderá baixá-lo. Em um terminal ou em uma janela de comando, execute o comando a seguir para clonar o repositório de aplicativos 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 aplicativo do Azure e a plataforma recomendada do Service Fabric para monitoramento e diagnóstico de aplicativos.

Para criar um recurso do Application Insights navegue até o Portal do Azure. Selecione Criar um recurso no menu de navegação à esquerda para abrir o Azure Marketplace. Selecione Monitoramento + Gerenciamento e, em seguida, Application Insights.

Criar novo recurso do AI

Agora será necessário preencher as informações necessárias sobre os atributos do recurso a ser criado. Insira um Nome, Grupo de recursos e Assinatura adequados. Defina o Local no qual você implantaria seu cluster do Service Fabric no futuro. Neste tutorial, implantaremos o aplicativo em um cluster local, então o campo Local é irrelevante. O Tipo de aplicativo deve ser deixado como "Aplicativo Web ASP.NET."

Atributos de recursos do AI

Depois de preencher as informações necessárias, selecione Criar para provisionar o recurso – deve levar cerca de um minuto.

Adicionar o Application Insights aos serviços do aplicativo

Inicie o Visual Studio 2019 com privilégios elevados clicando com o botão direito do mouse no ícone do Visual Studio no Menu Iniciar e escolhendo Executar como administrador. Selecione Arquivo>Abrir>Projeto/Solução e navegue até o aplicativo de votação (criado na parte um do tutorial ou clonado pelo git). Abra Voting.sln. Caso precise restaurar os pacotes NuGet do aplicativo, selecione Sim.

Siga estas etapas 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.

    Configurar o AI

Observação

Dependendo do tipo de projeto, quando você clica com o botão direito do mouse no nome do serviço, talvez tenha que selecionar Adicionar -> Application Insights Telemetry ...

  1. Selecione Introdução.

  2. Entre na conta que você usa para sua assinatura do Azure e selecione a assinatura na qual você criou o recurso do Application Insights. Localize o recurso em Recurso do Application Insights existente no menu suspenso "Recurso". Selecione Registrar para adicionar o Application Insights ao seu serviço.

    Registrar o AI

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

Observação

Certifique-se de seguir as etapas acima 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 NuGets específicos do Service Fabric que podem ser usados dependendo do cenário. Um é usado com serviços nativos do Service Fabric e o outro, com contêineres e executáveis do convidado. Nesse caso, usaremos o NuGet do Microsoft.ApplicationInsights.ServiceFabric.Native para aproveitar a compreensão do contexto do serviço que ele oferece. Para ler mais sobre o SDK do Application Insights e os pacotes NuGet específicos do Service Fabric, confira Microsoft Application Insights para Service Fabric.

Estas são as etapas para configurar o pacote NuGet:

  1. Clique com o botão direito do mouse em Solução 'Votação' na parte superior do seu Gerenciador de Soluções e selecione Gerenciar Pacotes NuGet para a Solução... .
  2. Selecione Procurar no menu de navegação superior da janela "NuGet – Solução" e marque a caixa Incluir pré-lançamento ao lado da barra de pesquisa.

Observação

Antes de instalar o pacote do Application Insights, talvez você precise instalar o pacote Microsoft.ServiceFabric.Diagnostics.Internal de maneira semelhante se ele já não estiver instalado

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

  2. À direita, selecione duas caixas de seleção ao lado dos dois serviços no aplicativo, VotingWeb e VotingData e selecione Instalar. Nuget do SDK de IA

  3. Selecione OK na caixa de diálogo Visualizar Alterações exibida e aceite a Aceitação da Licença. Isso concluirá a adição do NuGet aos serviços.

  4. Agora, é necessário configurar o inicializador de telemetria nos dois serviços. Para fazer isso, abra VotingWeb.cs e VotingData.cs. Para ambos, siga as duas etapas a seguir:

    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 arquivos, na instrução return aninhada de CreateServiceInstanceListeners() ou CreateServiceReplicaListeners() , em ConfigureServices>serviços, com os outros serviços singleton declarados, adicione:
    .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext))
    

    Isso adicionará o Contexto de serviço à sua telemetria, permitindo a você entender melhor a origem da sua telemetria no Application Insights. Sua instrução return aninhada em VotingWeb.cs deve ter esta aparência:

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

Observação

Esse aplicativo de exemplo usa http para a comunicação dos serviços. Se você desenvolver um aplicativo com o Serviço de Comunicação Remota V2, também será preciso adicionar as seguintes linhas de código no mesmo local, como feito acima

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

Neste ponto, você está pronto para implantar o aplicativo. Selecione Iniciar na parte superior (ou F5) e o Visual Studio vai compilar e empacotar o aplicativo, configurar seu cluster local e implantar o aplicativo nele.

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 terminar a implantação, vá para localhost:8080, em que você deverá conseguir ver o aplicativo de página única de votação de exemplo. Votar em alguns itens diferentes de sua escolha para criar alguns dados e a telemetria de exemplo – fui pelas sobremesas!

Votos de exemplo do AI

Fique à vontade para Remover algumas opções de votação também quando você terminar de adicionar alguns votos.

Exibir a telemetria e o mapa de aplicativos no Application Insights

Vá até o recurso do Application Insights no Portal do Azure.

Selecione Visão geral para voltar para a página de aterrissagem do seu recurso. Em seguida, selecione Pesquisar na parte superior para ver os rastreamentos sendo recebidos. Levará alguns minutos para que os rastreamentos sejam exibidos no Application Insights. Caso você não tenha visto nenhum, aguarde um minuto e pressione o botão Atualizar na parte superior. Rastreamentos de exibição de IA

Rolar a janela Pesquisar para baixo mostrará toda a telemetria de entrada que você recebe pronta para usar 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 que estão sendo exibidos. Também haverá um rastreamento de dependência para HTTP no localhost, já que eles são solicitações HTTP. Este é um exemplo do que você verá para a maneira como um voto é adicionado:

Rastreamento de solicitação de exemplo de IA

É possível selecionar um dos rastreamentos para exibir mais detalhes sobre ele. Há informações úteis sobre a solicitação fornecidas pelo Application Insights, incluindo o Tempo de resposta e a URL de solicitação. Além disso, como você adicionou o NuGet específico do Service Fabric, você também receberá dados sobre o seu aplicativo no contexto de um cluster do Service Fabric na seção Dados personalizados abaixo. Isso inclui o contexto de serviço para que você possa ver o PartitionID e o ReplicaId da origem da solicitação e localizar melhor problemas durante o diagnóstico de erros em seu aplicativo.

Detalhes de rastreamento do AI

Além disso, você pode selecionar o Mapa do aplicativo no menu à esquerda na página Visão Geral ou selecionar o ícone do Mapa do aplicativo para ir até o mapa que mostra os dois serviços conectados.

Captura de tela que realça o Mapa do aplicativo no menu à esquerda.

O mapa de aplicativos pode ajudar a entender melhor a topologia do seu aplicativo, principalmente quando você começa a adicionar vários serviços diferentes que funcionam em conjunto. Ele também fornece dados básicos sobre taxas de sucesso de solicitação e pode ajudá-lo a diagnosticar a solicitação com falha para entender onde as coisas podem ter dado errado. Para saber mais sobre como usar o mapa de aplicativos, consulte Mapa de aplicativos no Azure Application Insights.

Adicionar instrumentação personalizada ao seu aplicativo

Embora o Application Insights forneça muita telemetria pronta para usar, convém adicionar ainda mais instrumentação personalizada. Isso pode ocorrer com base em suas necessidades de negócios ou para melhorar o diagnóstico quando as coisas dão errado em seu aplicativo. O Application Insights tem uma API para ingerir métricas e eventos personalizados, sobre a qual você pode ler mais aqui.

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

  1. Adicione using Microsoft.ApplicationInsights; no final do outro usando as instruções.
  2. Declare um novo TelemetryClient no início da classe, na criação do IReliableStateManager: private TelemetryClient telemetry = new TelemetryClient();.
  3. Na função Put() , adicione um evento que confirma que um voto foi adicionado. Adicione telemetry.TrackEvent($"Added a vote for {name}"); depois que a transação tiver sido concluída, antes da instrução OkResult de retorno.
  4. Em Delete() , há um "if/else" baseado na condição se votesDictionary contém votos para uma determinada opção de votação.
    1. Adicione um evento que confirma a exclusão de um voto 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 aconteceu na instrução else antes da instrução de retorno: telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");

Veja um exemplo da aparência de suas funções Put() e Delete() após 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, Inicie o aplicativo para ele compilar e implantar a versão mais recente dele. Quando o aplicativo terminar a implantação, 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 para a execução mais recente (como antes, os rastreamentos podem levar de 1 a 2 min para aparecer no Application Insights). Para todos os votos adicionados e excluídos, agora você deve ver um "Evento personalizado* junto com a telemetria de resposta.

eventos personalizados

Próximas etapas

Neste tutorial, você aprendeu a:

  • Configurar o Application Insights para seu aplicativo
  • Coletar telemetria de resposta para rastrear comunicação baseada em HTTP entre serviços
  • Usar o recurso Mapa de aplicativos no Application Insights
  • Adicionar eventos personalizados usando a API do Application Insights

Agora que você configurou o monitoramento e o diagnóstico do seu aplicativo ASP.NET, tente o seguinte: