Em um cenário digital, onde o desempenho e a confiabilidade são primordiais, monitorar a integridade e o comportamento das suas aplicações é primordial. À medida que sistemas distribuídos complexos e microsserviços tornam-se comuns, as abordagens tradicionais de monitoramento falham ao fornecer insights completos sobre como sua aplicação está se comportando. É aí que as ferramentas de performance de aplicações (APM) entram em cena, oferecendo uma visão abrangente sobre todo o ciclo de vida, desde a execução do seu código até a utilização da sua infraestrutura.
Quando se trata de monitorar aplicações .NET, o Elastic APM surge como uma solução poderosa. Aproveitando os recursos do Elastic Stack, incluindo Elasticsearch, Kibana e Beats, o Elastic APM fornece aos desenvolvedores e equipes de operações visibilidade em tempo real do funcionamento interno de suas aplicações .NET. (Para entender mais sobre o Elasticsearch eu indico esta série de artigos)
Neste guia, exploraremos como o Elastic APM pode ajudá-lo a monitorar e otimizar o desempenho de suas aplicações .NET de maneira eficaz.
Pré-requisitos
- Visual Studio 2022 (.NET 8.0)
- Docker
- Packages:
Web API
Na classe program.cs da API, configure conforme o código abaixo:
As extensões principais dessa classe são:
- AddSerilog: Responsável por registrar o provedor de logs da aplicação e exportar os dados para o Elasticsearch.
- AddElasticsearch: Responsável por registrar a comunicação com o Elasticsearch.
- UseElasticApm: Responsável por registrar a comunicação com o Elastic APM.
A extensão AddSerilog contém o seguinte código:
Repare que todos os logs da aplicação são exportados para o Console e Elasticsearch ao chamar a propriedade WriteTo.
Já a extensão AddElasticsearch contém o seguinte código:
E por fim, temos a extensão UseElasticApm que realiza o registro das configurações no Elastic APM:
Configurando o Elastic APM
No código de exemplo deste projeto existe o arquivo docker-compose.yml responsável por provisionar toda infraestrutura necessária para instalação do Elasticsearch, Kibana e Elastic APM. Para executar, basta entrar na pastar src do projeto e rodar o comando abaixo:
docker-compose up
Em seguida, acesso o painel do Kibana, pelo link:
http://localhost:5601
Na sequência, cliquei no item de menu APM e configure o Elastic APM clicando no link Add data:
Configure o APM para a linguagem .NET e copie o exemplo de configuração do appsettings.json. Clique em Launch APM para finalizar a configuração.
Depois de tudo configurado no Elastic APM, é hora de ajustar o appsettings.json da API de exemplo:
As chaves ElasticsearchSettings e ElasticApm são responsáveis pela comunicação com o Elastic Stack. Todo log de texto gerado pelo Serilog será replicado para o banco Elasticsearch e toda telemetria (logs, traces e métricas) serão gravados no Elastic APM para tomada de decisões.
Mais informações sobre a configuração do Serilog você encontra aqui.
Testando
Para realizar os testes, execute todos os endpoints no swagger para geração de logs no Elasticsearch:
Cada endpoint gera um tipo de telemetria no Elasticsearch e Elastic APM. Agora vamos analisar todos os logs criando um modelo de visualização de dados no Kibana.
Logs do Elasticsearch
Abra o Kibana e clique em Stack Management e em seguida clique em Data Views:
Na sequência, clique em Create data view e crie um modelo com nome de indexlog e em Index pattern coloque indexlogs* para criar o padrão de listagem de registros que foi configurado na propriedade IndexFormat do Serilog. Clique em Save data view to Kibana para finalizar.
Em seguida, volte ao menu inicial do Kibana e clique em Discover e selecione o Data view indexlog. Nesta tela é possível criar filtros, gráficos, alertas e muito mais.
Logs do Elastic APM
Abra o Kibana e clique no item de menu APM, será listado a aplicação configurada com o nome inserido no appsettings.json da API:
Clique no nome da aplicação e analise as telemetrias geradas pela aplicação:
É possível analisar a latência das chamadas de cada componente da sua aplicação. No caso abaixo é possível entender que houve uma latência de quase 7 segundos para criar o banco, executar as migrations pelo EF Core e realizar a consulta:
É possível configurar vários outros tipos de coletas no Elastic APM para enriquecer sua análise, inserindo novos packages pelo nuget, visto aqui: https://www.elastic.co/guide/en/apm/agent/dotnet/current/packages.html
Também é possível analisar todas as dependências externas que a sua aplicação realiza. Este recurso é muito útil para entender quem está conectado na sua aplicação e com o que sua aplicação está se conectando:
Finalizando
Em resumo, a implementação do Elastic APM para monitorar aplicações .NET oferece uma solução poderosa para entender e otimizar o desempenho de suas aplicações. Ao fornecer insights detalhados sobre transações, erros e métricas, o Elastic APM capacita os desenvolvedores a identificar gargalos, resolver problemas de desempenho e melhorar a experiência do usuário.
Com sua integração perfeita com o ecossistema Elastic, essa ferramenta não apenas simplifica o processo de monitoramento, mas também se torna uma peça essencial para garantir a saúde e a eficiência de suas aplicações .NET.
Os detalhes completo desta série você encontra no meu GitHub: https://github.com/hgmauri/elastic-apm-dotnet
fiz de acordo como esta no artigo, mas infelizmente comigo não funcionou, aparece a seguinte mensagem de erro quando acesso o log do APM no docker:
{“log.level”:”error”,”@timestamp”:”2024-08-16T03:29:26.629Z”,”log.logger”:”beater”,”log.origin”:{“file.name”:”beater/waitready.go”,”file.line”:62},”message”:”precondition ‘apm integration installed’ failed: error querying Elasticsearch for integration index templates: unexpected HTTP status: 404 Not Found ({\”error\”:{\”root_cause\”:[{\”type\”:\”resource_not_found_exception\”,\”reason\”:\”index template matching [metrics-apm.service_destination.10m] not found\”}],\”type\”:\”resource_not_found_exception\”,\”reason\”:\”index template matching [metrics-apm.service_destination.10m] not found\”},\”status\”:404}): to remediate, please install the apm integration: https://ela.st/apm-integration-quickstart“,”service.name”:”apm-server”,”ecs.version”:”1.6.0″}