2009-08-20 16 views
8

Esiste un metodo incorporato in System.Diagnostics per il recupero di tutti i contatori delle prestazioni istanziati per un dato NomeCategoria?Lista tutti i contatori delle prestazioni per una categoria

Abbiamo un numero di app multi-thread che utilizzano contatori delle prestazioni personalizzati e ora è necessario aggiungere un dashboard per la visualizzazione delle statistiche delle prestazioni.

Mi piacerebbe realizzare il cruscotto in modo tale da non dover essere aggiornato ogni volta che qualcuno aggiunge un nuovo contatore a un nuovo pezzo di codice.

risposta

25

Prova questo:

public void ListCounters(string categoryName) 
{ 
    PerformanceCounterCategory category = PerformanceCounterCategory.GetCategories().First(c => c.CategoryName == categoryName); 
    Console.WriteLine("{0} [{1}]", category.CategoryName, category.CategoryType); 

    string[] instanceNames = category.GetInstanceNames(); 

    if (instanceNames.Length > 0) 
    { 
     // MultiInstance categories 
     foreach (string instanceName in instanceNames) 
     { 
      ListInstances(category, instanceName); 
     } 
    } 
    else 
    { 
     // SingleInstance categories 
     ListInstances(category, string.Empty); 
    } 
} 

private static void ListInstances(PerformanceCounterCategory category, string instanceName) 
{ 
    Console.WriteLine(" {0}", instanceName); 
    PerformanceCounter[] counters = category.GetCounters(instanceName); 

    foreach (PerformanceCounter counter in counters) 
    { 
     Console.WriteLine("  {0}", counter.CounterName); 
    } 
} 

Bisogna essere consapevoli delle categorie che possono avere più istanze e trattare con quelle in modo leggermente diverso.

6

Solo per divertimento .. qui è la stessa cosa in 1 linea di LINQ:

PerformanceCounterCategory 
.GetCategories() 
.Where(cat => cat.CategoryName == "ASP.NET v4.0.30319") 
.Select (cat => cat.GetInstanceNames().Any() ? cat.GetInstanceNames().Select (i => cat.GetCounters(i)).SelectMany (counter => counter) : cat.GetCounters("")).SelectMany (counter => counter) 
.Select(counter => string.Format("{0} : {1}.{2}", counter.InstanceName , counter.CategoryName, counter.CounterName)) 
+0

chiamando cat.GetInstanceNames() è lento, si dovrebbe fare un "lasciare variabile" per ottenere l'elenco, e riutilizzarlo più tardi –

Problemi correlati