Continuous Profiling – Como configurar o Pyroscope no .NET do jeito certo?
A tecnologia tem auxiliado empresas a dar o próximo passo rumo à inovação e transformação digital. Nesse sentido, a implementação do Continuous Profiling com o Pyroscope no .NET pode contribuir para garantir a confiabilidade do produto, permitindo essa importante evolução.
No artigo anterior, discutimos o conceito de Continuous Profiling e como ele pode identificar problemas em produção e reduzir o MTTR. Agora, vamos aprofundar e explorar a implementação prática do Continuous Profiling usando o Pyroscope em aplicativos .NET, um recurso poderoso que pode trazer a observabilidade a um novo patamar em nossos projetos de software.
O que é o Pyroscope?
O Pyroscope é uma plataforma de análise de desempenho de código aberto. Sua principal função é auxiliar os desenvolvedores a entenderem melhor o desempenho de suas aplicações, identificando gargalos e melhorando a eficiência geral do código.
Com o objetivo primordial de orientar a identificação e resolução de problemas de desempenho, o Pyroscope oferece visibilidade contínua, análise detalhada e suporte a diversas linguagens de programação.
Visibilidade contínua
Diferentemente da maioria das ferramentas de análise de desempenho tradicionais, que proporcionam uma visão pontual ou periódica do desempenho da aplicação, fornecendo uma visibilidade contínua. Isso possibilita observar como o desempenho da sua aplicação se altera ao longo do tempo.
Análise detalhada
O Pyroscope permite aos desenvolvedores examinar o uso de recursos de maneira muito detalhada. É possível explorar até mesmo funções individuais dentro do código, possibilitando uma análise aprofundada de onde os recursos estão sendo utilizados e onde possíveis gargalos podem estar surgindo.
Suporte a diversas linguagens de programação
O Pyroscope é uma ferramenta flexível para as equipes de desenvolvimento de software, pois suporta uma variedade de linguagens de programação. Até o momento, ele oferece suporte nativo para Go, Python, Ruby e .NET, com planos de expandir o suporte para outras linguagens no futuro.
Implementando o Pyroscope no .NET
Antes de iniciar a implementação, o projeto completo está no meu Github. O primeiro passo para integrar o Pyroscope ao seu projeto .NET é adicionar a referência do pacote Pyroscope. Estamos utilizando a versão 0.8.4 neste exemplo.
1 |
dotnet add package Pyroscope |
Após executar esse comando, o .NET CLI adicionará a seguinte linha ao seu arquivo .csproj:
1 2 3 |
<ItemGroup> <PackageReference Include="Pyroscope" Version="0.8.4" /> </ItemGroup> |
O próximo passo na configuração do Pyroscope é habilitar as funcionalidades específicas de rastreamento. O Pyroscope fornece uma série de configurações que permitem rastrear diferentes aspectos do desempenho da sua aplicação.
1 |
Pyroscope.Profiler.Instance.SetAllocationTrackingEnabled(true); |
Essa linha habilita o rastreamento de alocações de memória. Isso ajudará você a entender melhor como a sua aplicação está usando a memória e pode ajudar a identificar vazamentos de memória ou uso ineficiente da memória.
1 |
Pyroscope.Profiler.Instance.SetExceptionTrackingEnabled(true); |
Essa linha habilita o rastreamento de exceções. Isso permitirá que você veja quais partes do seu código estão gerando exceções e pode ajudar a identificar áreas problemáticas no seu código.
1 |
Pyroscope.Profiler.Instance.SetContentionTrackingEnabled(true); |
Essa linha habilita o rastreamento de contenção. Isso pode ajudar a identificar locais no seu código onde múltiplas threads estão competindo pelos mesmos recursos, o que pode levar a um desempenho degradado.
1 |
Pyroscope.Profiler.Instance.SetCPUTrackingEnabled(true); |
Essa linha habilita o rastreamento de uso de CPU. Isso pode ajudar a identificar áreas do seu código que estão usando uma quantidade desproporcional de recursos de CPU.
Adicionando rótulos para categorizar e filtrar dados do profiling
No Pyroscope, rótulos são uma maneira eficiente de categorizar e filtrar seus dados de profiling. Eles fornecem uma maneira adicional de segmentar suas métricas para uma análise mais granular. No contexto do .NET, você pode adicionar rótulos em qualquer parte do seu código onde deseja obter insights mais detalhados.
1 2 3 4 5 6 |
var labels = Pyroscope.LabelSet.Empty.BuildUpon().Add("WeatherForecast", "Get").Build(); Pyroscope.LabelsWrapper.Do(labels, () => { // Your code }); |
Em seguida, definimos o Dockerfile, e por fim, o docker-compose.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
FROM --platform=linux/amd64 mcr.microsoft.com/dotnet/aspnet:7.0 AS base WORKDIR /app RUN apt-get update && apt-get -y install wget RUN wget -qO- https://github.com/grafana/pyroscope-dotnet/releases/download/v0.8.4-pyroscope/pyroscope.glibc.tar.gz \ | tar xvz EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build WORKDIR /src COPY ["Demo.Profiling.csproj", "."] RUN dotnet restore "./Demo.Profiling.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "Demo.Profiling.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "Demo.Profiling.csproj" -c Release -o /app/publish -r $(dotnet --info | grep RID | cut -b 6- | tr -d ' ') FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENV CORECLR_ENABLE_PROFILING=1 ENV CORECLR_PROFILER={BD1A650D-AC5D-4896-B64F-D6FA25D6B26A} ENV CORECLR_PROFILER_PATH=/app/Pyroscope.Profiler.Native.so ENV LD_PRELOAD=/app/Pyroscope.Linux.ApiWrapper.x64.so ENV PYROSCOPE_LOG_LEVEL=info ENV PYROSCOPE_PROFILING_ENABLED=1 ENV PYROSCOPE_PROFILING_ALLOCATION_ENABLED=true ENV PYROSCOPE_PROFILING_CONTENTION_ENABLED=true ENV PYROSCOPE_PROFILING_EXCEPTION_ENABLED=true ENTRYPOINT ["dotnet", "/app/Demo.Profiling.dll"] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
version: "3.9" services: demo: build: context: ./src container_name: demo ports: - 7000:80 environment: - PYROSCOPE_APPLICATION_NAME=demo.profiling - PYROSCOPE_SERVER_ADDRESS=http://pyroscope:4040 networks: - demo pyroscope: container_name: pyroscope image: pyroscope/pyroscope:latest command: - server ports: - 4040:4040 deploy: resources: limits: memory: 300M restart: always networks: - demo networks: demo: driver: bridge |
Conclusão
Discutimos a importância do Continuous Profiling para a inovação e transformação digital das empresas. Aprofundamos sobre a implementação prática no .NET, utilizando o Pyroscope – uma plataforma aberta de análise de desempenho. Analisamos as principais funcionalidades do Pyroscope, incluindo visibilidade contínua, análise detalhada e suporte a diversas linguagens de programação. Por fim, apresentamos um passo a passo para a implementação do Pyroscope em um projeto .NET, desde a adição do pacote à aplicação até a definição do Dockerfile e docker-compose.