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:
- Criar uma aplicação .NET do Service Fabric
- Implementar a aplicação num cluster remoto
- Adicionar um ponto final HTTPS a um serviço de front-end ASP.NET Core
- Configurar CI/CD com o Azure Pipelines
- Configurar a monitorização e os diagnósticos da aplicação
Pré-requisitos
Antes de começar este tutorial:
- Se não tiver uma subscrição do Azure, crie uma conta gratuita
- Instale o Visual Studio 2019 e instale as cargas de trabalho de desenvolvimento e ASP.NET e desenvolvimento Web do Azure.
- Instalar o SDK do Service Fabric
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.
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”.
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:
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.
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 ...
Selecione Começar.
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.
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:
- 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....
- 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
Procure
Microsoft.ApplicationInsights.ServiceFabric.Native
e selecione o pacote NuGet adequado.À direita, selecione as duas caixas de verificação junto aos dois serviços na aplicação , VotingWeb e VotingData e selecione Instalar.
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.
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:
- 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;
- 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!
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.
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:
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.
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.
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.
- Adicione
using Microsoft.ApplicationInsights;
no fim do outro através de declarações. - Declare um novo TelemetryClient no início da classe, abaixo da criação do IReliableStateManager:
private TelemetryClient telemetry = new TelemetryClient();
. - 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. - 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.
- 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}");
- 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");
- Adicione um evento que confirme a eliminação de um voto na declaração if, após await tx.CommitAsync():
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:8080
e 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.
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:
- Explorar profundamente a monitorização e diagnóstico no Service Fabric
- Análise de eventos do Service Fabric com o Application Insights
- Para saber mais sobre o Application Insights, veja a Documentação do Application Insights