Share via


Comparação de APIs de métrica

Ao adicionar uma nova instrumentação de métrica a um aplicativo ou biblioteca do .NET, existem várias APIs diferentes para escolher. Este artigo ajudará você a entender o que está disponível e algumas das desvantagens envolvidas.

Há duas categorias principais de APIs, com neutralidade de fornecedor e específicas do fornecedor. As APIs específicas do fornecedor têm a vantagem de que o fornecedor pode iterar os designs rapidamente, adicionar recursos especializados e obter uma integração completa entre as APIs de instrumentação e os sistemas de back-end. Por exemplo, se você instrumentou o aplicativo com as APIs de métrica fornecidas pelo Application Insights, espere encontrar funcionalidades bem integradas e todos os recursos mais recentes do Application Insight ao trabalhar com as ferramentas de análise. No entanto, a biblioteca ou aplicativo agora também seria acoplado a esse fornecedor e a mudança para um diferente no futuro exigiria a regravação da instrumentação. Para bibliotecas, esse acoplamento pode ser particularmente problemático, pois o desenvolvedor da biblioteca pode usar a API de um fornecedor e o desenvolvedor de aplicativos que referencia a biblioteca deseja trabalhar com um fornecedor diferente. Para resolver esse problema de acoplamento, as opções com neutralidade do fornecedor fornecem uma fachada de API padronizada e pontos de extensibilidade para encaminhar os dados para vários sistemas de back-end do fornecedor, dependendo da configuração. No entanto, as APIs com neutralidade do fornecedor podem oferecer menos funcionalidades e você ainda está restrito a escolher um fornecedor integrado ao mecanismo de extensibilidade da fachada.

APIs do .NET

Ao lingo da história de mais de 20 anos do NET, iteramos algumas vezes o design para APIs de métrica, todas com suporte e neutralidade do fornecedor:

System.Diagnostics.Metrics

As APIs System.Diagnostics.Metrics são as APIs multiplataforma mais recentes e foram criadas em estreita colaboração com o projeto OpenTelemetry. Se você não tiver um motivo específico para utilizar uma das APIs mais antigas abordadas abaixo, System.Diagnostics.Metrics é uma boa opção padrão para novos trabalhos. Ele está disponível ao direcionar o .NET 6+ ou em aplicativos .NET Core e .NET Framework mais antigos, adicionando uma referência ao pacote .NET System.Diagnostics.DiagnosticsSource 6.0+ do pacote NuGet. Além de visar à ampla compatibilidade, essa API adiciona suporte a muitos aspectos que não existiam nas APIs anteriores, como:

  • Histogramas e percentis
  • Métricas multidimensionais
  • API de ouvinte com tipo robusto e alto desempenho
  • Vários ouvintes simultâneos
  • Acesso do ouvinte a medidas não agregadas

Embora essa API tenha sido criada para funcionar corretamente com o OpenTelemetry e o ecossistema em desenvolvimento de bibliotecas de integração de fornecedores plugáveis, os aplicativos também têm a opção de usar as APIs de ouvinte internas do .NET diretamente. Com essa opção, você pode criar ferramentas de métrica personalizadas, sem usar dependências de biblioteca externa.

PerformanceCounter

As APIs System.Diagnostics.PerformanceCounter são as APIs de métrica mais antigas. Elas são compatíveis somente com o Windows e fornecem um wrapper gerenciado para tecnologia de Contador de Desempenho do Sistema Operacional Windows. Elas estão disponíveis em todas as versões com suporte do .NET.

Essas APIs são fornecidas principalmente para compatibilidade. A equipe do .NET considera esta uma área estável e sem probabilidades de receber melhorias adicionais além das correções de bugs. Essas APIs não são sugeridas para novos projetos de desenvolvimento, a menos que o projeto seja somente Windows e você tenha o desejo de usar as ferramentas do Contador de Desempenho do Windows.

Para obter mais informações, confira Contadores de desempenho no .NET Framework.

EventCounters

A API EventCounters veio depois do PerformanceCounters. Essa API tinha como objetivo fornecer uma experiência uniforme entre plataformas. As APIs estão disponíveis visando o .NET Core 3.1+, e um pequeno subconjunto está disponível no .NET Framework 4.7.1 e posterior. Essas APIs têm suporte total e são usadas ativamente pelas principais bibliotecas do .NET, mas têm menos funcionalidade do que as APIs System.Diagnostics.Metrics mais recentes. Os EventCounters são capazes de relatar taxas de alteração e médias, mas não são compatíveis com histogramas e percentis. Também não há suporte para métricas multidimensionais. A ferramenta personalizada é possível por meio da API EventListener, embora não tenha um tipo robusto, apenas dá acesso aos valores agregados e tem limitações ao usar mais de um ouvinte simultaneamente. Há suporte direto para EventCounters no Visual Studio, Application Insights, dotnet-counters e dotnet-monitor. Para obter suporte a ferramentas de terceiros, verifique a documentação do fornecedor ou do projeto para ver se está disponível.

A equipe do .NET não espera fazer novos investimentos consideráveis nessa API daqui para frente, mas, assim como acontece com PerformanceCounters, a API continua tendo suporte ativo para todos os usuários atuais e futuros.

APIs de terceiros

A maioria dos fornecedores de APM (monitoramento de desempenho de aplicativos), como AppDynamics, Application Insights, DataDog, DynaTrace e NewRelic, inclui APIs de métrica como parte das bibliotecas de instrumentação. Prometheus e AppMetrics também são projetos populares do .NET OSS. Para saber mais sobre esses projetos, confira os vários sites do projeto.