Diagnosticando uma aplicação no .NET Core 3.0

Na terceira versão do .NET Core foram introduzidas três ferramentas que permitem analisar o estado de uma aplicação em tempo de execução de forma simples:

  • dotnet-counters;
  • dotnet-trace;
  • dotnet-dump.

Minha aplicação está saudável?

Mesmo que se tenha cuidado e procure criar um bom código, apenas em produção que saberemos exatamente como a aplicação irá se comportar. Às vezes ela pode apresentar algum vazamento de memória ou algum pico inesperado da CPU. Felizmente podemos detectar esses tipos de problemas analisando algumas métricas da aplicação.

Métricas são representações de informações em um intervalo de tempo. No Windows, o .NET Framework gera contadores de performance (perf counters), que fornece algumas métricas das aplicações. Até a versão 2.2 o .NET Core não fornecia nada equivalente, só que na versão 3.0 foi introduzido o EventCounter API.

O EventCounters permite que a aplicação forneça algumas informações sobre o seu estado e através da ferramenta dotnet-counters, essas informações podem ser obtidas em tempo real.

Você pode instalar esta ferramenta como global tool com o comando abaixo:

dotnet tool install --global dotnet-counters --version 1.0.3-preview5.19251.2

E iniciá-la com o comando:

dotnet-counters monitor -p <pid> --refresh-interval 1

Como mostrado abaixo:

Você pode obter mais detalhes desta ferramenta na documentação do repositório dela do Github.

Desenvolvedor ASP.NET Full-Stack
Formação: Desenvolvedor ASP.NET Full-Stack
A formação Desenvolvedor ASP.NET Full Stack da TreinaWeb tem como objetivo abordar as duas principais plataformas dentro do ASP.NET: o ASP.NET MVC, para criação de aplicações web seguindo o padrão MVC/MVW; e o ASP.NET WebAPI, para criação de APIs RESTful que sigam os padrões mais atuais da indústria.
CONHEÇA A FORMAÇÃO

Porque minha aplicação está se comportando desta forma?

Enquanto os contadores de performance ajudam a identificar se a aplicação gerou algum comportamento inesperado, eles não deixam claro o que está errado. Para responder esta questão, podemos coletar informações adicionais com “trace”.

Tracing

Podemos definir “trace” como vestígios que a aplicação gera quando está sendo executada. No sistema isso resulta em registros que descrevem eventos gerados pela aplicação. Esses registros contém o contexto onde os eventos foram gerados, o que nos dá uma ideia melhor sobre o estado do sistema.

Tradicionalmente, o .NET Framework (e frameworks adjacentes, como ASP.NET) gera os “traces” via Event Tracing for Windows (ETW). Já no .NET Core, eles são gerados no ETW no Windows e no LTTng no Linux. No Mac OS X, isso ainda não está disponível.

Na versão 3.0 .NET Core todas as aplicações criam um “pipe” chamado EventPipe que permite a geração dos eventos. Para ter acesso as informações geradas, nesta versão também foi introduzida a ferramenta dotnet-trace.

Assim como a dotnet-counters, esta ferramenta pode ser instalada como uma global tool com o comando abaixo:

dotnet tool install --global dotnet-trace --version 1.0.3-preview5.19251.2

E um “trace” pode ser gerado com o comando:

dotnet-trace collect -p <pid>

Como mostrado abaixo:

No exemplo acima o dotnet-trace é executado com as configurações padrão. Mas você pode obter informações de provedores específicos, como explicado na documentação da ferramenta.

Ao executá-la, será gerado por padrão um arquivo *.netperf, que contém informações dos eventos gerados pela aplicação. Ele pode ser visualizado no perfview caso esteja em um ambiente Windows, ou caso esteja em um ambiente Unix, pode gerar um arquivo .speedscope.json com o atributo --format:

dotnet-trace collect -p <pid> --format "Speedscope"

E visualizá-lo no Speedscope.app:

Porque a minha aplicação “deu pau”?

Em alguns casos, não é possível aferir o que causou o problema da aplicação apenas analisando os eventos gerados, para isso, “process dump” (despejo de processo) pode ser a alternativa.

O “dump” é um registro do estado da memória utilizada pelo processo no momento que ele foi finalizado inesperadamente. Por isso, a análise deste registro é muito utilizada para identificar porque a aplicação foi finalizada ou apresentou algum comportamento inesperado.

Tradicionalmente, se confia no sistema operacional para capturar este registro quando a aplicação é finalizada (e.g. Windows Error Reporting) ou alguma ferramenta como procdump, para captar baseado em um critério.

Só que filtrar apenas as informações pertinentes a uma aplicação .NET Core é um desafio, principalmente em um ambiente Linux. Para ajudar nisso, foi criada a ferramenta dotnet-dump.

Como está em desenvolvimento, ela ainda não é totalmente suportada em todos os sistemas, como mostra a tabela abaixo de recursos:

WindowsMac OS XLinux
Collect×
Analyze××

Assim como as demais, esta ferramenta é uma global tool que pode ser instalada com o comando abaixo:

dotnet tool install --global dotnet-dump --version 1.0.3-preview5.19251.2

E o dump pode ser criado com o comando abaixo:

sudo dotnet-dump collect -p <pid>

No Linux, ele pode ser analisado com o comando abaixo:

dotnet dump analyze <dump-name>

Você pode ver mais detalhes desta ferramenta na documentação do repositório dela do Github.

Concluindo

Assim como a versão 3.0 do .NET Core, no momento essas ferramentas estão em preview, mas já mostram um grande potencial. Quando saíram do preview, devem se tornar ferramentas essenciais de qualquer desenvolvedor .NET Core.

Deixe seu comentário

Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo.