Condividi tramite


Confronto delle API delle metriche

Quando si aggiunge una nuova strumentazione relativa alla metrica a un'app o a una libreria .NET, sono disponibili diverse API tra cui scegliere. Questo articolo aiuterà a comprendere cosa è disponibile e alcuni dei compromessi coinvolti.

Esistono due categorie principali di API, indipendenti dal fornitore e specifiche per il fornitore. Le API specifiche per il fornitore hanno il vantaggio che il fornitore può eseguire l'iterazione rapida dei propri elementi progettuali, aggiungere funzionalità specializzate e ottenere una stretta integrazione tra le API di strumentazione e i sistemi back-end. Ad esempio, se l'app è stata instrumentata con le API delle metriche fornite da Application Insights, ci si aspetterebbe di trovare una funzionalità ben integrata e tutte le funzionalità più recenti di Application Insights quando si utilizzano gli strumenti di analisi. Tuttavia, anche la libreria o l'app saranno ora associate a questo fornitore e il passaggio a uno diverso in futuro richiederebbe la riscrittura della strumentazione. Per le librerie, questo accoppiamento può essere particolarmente problematico perché lo sviluppatore di librerie potrebbe usare l'API di un fornitore e lo sviluppatore di app che fa riferimento alla libreria vuole collaborare con un fornitore diverso. Per risolvere questo problema di accoppiamento, le opzioni indipendenti dal fornitore forniscono una facciata API standardizzata e punti di estendibilità per instradare i dati a vari sistemi back-end fornitore a seconda della configurazione. Tuttavia, le API indipendenti dal fornitore possono fornire meno funzionalità e si è ancora vincolati a scegliere un fornitore integrato con il meccanismo di estendibilità della facciata.

API .NET

In oltre 20 anni di storia di .NET, abbiamo provveduto alcune volte all’iterazione in relazione alla progettazione relativa alle API delle metriche, tutte supportate e indipendenti dal fornitore:

System.Diagnostics.Metrics

Le API System.Diagnostics.Metrics sono le API multipiattaforma più recenti e sono state progettate in stretta collaborazione con il progetto OpenTelemetry. Se non si ha un motivo specifico per usare una delle API precedenti descritte di seguito, System.Diagnostics.Metrics rappresenta una scelta predefinita ottimale per il nuovo lavoro. È disponibile specificando come destinazione .NET 6+o nelle app .NET Core e .NET Framework precedenti aggiungendo un riferimento al pacchetto NuGet .NET System.Diagnostics.DiagnosticsSource 6.0+. Oltre a puntare a una compatibilità generale, questa API aggiunge il supporto per molti aspetti mancanti dalle API precedenti, ad esempio:

  • Istogrammi e percentili
  • Metriche multidimensionali
  • API listener ad alte prestazioni fortemente tipizzata
  • Più listener simultanei
  • Accesso del listener alle misurazioni non aggregate

Anche se questa API è stata progettata per funzionare bene con OpenTelemetry e il suo crescente ecosistema di librerie di integrazione fornitore pluggable, le applicazioni presentano anche la possibilità di usare direttamente le API listener predefinito .NET. Con questa opzione, è possibile creare strumenti di metrica personalizzati senza dipendenze relativamente ad alcuna libreria esterna.

PerformanceCounter

Le API System.Diagnostics.PerformanceCounter sono le API delle metriche meno recenti. Sono supportate solo in Windows e forniscono un wrapper gestito per la tecnologia Contatore delle prestazioni del sistema operativo Windows. Sono disponibili in tutte le versioni supportate di .NET.

Queste API vengono fornite principalmente per la compatibilità; il team .NET considera questa area stabile e probabilmente non riceverà ulteriori miglioramenti oltre alle correzioni di bug. Queste API non sono consigliate per i nuovi progetti di sviluppo, a meno che il progetto non sia relativo solo a Windows e che si desideri usare gli strumenti Contatore delle prestazioni di Windows.

Per altre informazioni, vedere Contatori delle prestazioni in .NET Framework.

EventCounters

L'API EventCounters è arrivata dopo PerformanceCounters. Questa API ha lo scopo di offrire un'esperienza multipiattaforma uniforme. Le API sono disponibili specificando come destinazione .NET Core 3.1+, mentre un piccolo subset è disponibile in .NET Framework 4.7.1 e versioni successive. Queste API sono completamente supportate e vengono usate attivamente dalle librerie .NET chiave, ma hanno meno funzionalità rispetto alle API System.Diagnostics.Metrics più recenti. Le API EventCounters sono in grado di segnalare le frequenze di modifica e le medie, ma non supportano istogrammi e percentili. Non è inoltre disponibile alcun supporto per le metriche multidimensionali. Gli strumenti personalizzati sono possibili tramite l'API EventListener, anche se non è fortemente tipizzata, concede l'accesso solo ai valori aggregati e presenta limitazioni quando si usano più listener contemporaneamente. Le API EventCounters sono supportate direttamente da Visual Studio, Application Insights, dotnet-counters e dotnet-monitor. Per il supporto di strumenti di terze parti, consultare la documentazione del fornitore o del progetto per verificare la disponibilità.

Il team .NET non si aspetta di effettuare importanti investimenti su questa API in futuro, ma come con PerformanceCounters, l'API rsta attivamente supportata per tutti gli utenti correnti e futuri.

API di terze parti

La maggior parte dei fornitori di Application Performance Monitoring (APM), ad esempio AppDynamics, Application Insights, DataDog, DynaTrace e NewRelic, includono le API delle metriche come parte delle librerie di strumentazione. Prometheus e AppMetrics sono inoltre progetti .NET OSS popolari. Per altre informazioni su questi progetti, consultare i vari siti Web dei progetti.