2009-08-20 7 views
8

Gibt es in System.Diagnostics eine integrierte Methode zum Abrufen aller instanziierten Leistungsindikatoren für einen bestimmten CategoryName?Alle Leistungsindikatoren für eine Kategorie auflisten

Wir haben eine Reihe von Multithread-Anwendungen mit benutzerdefinierten Leistungsindikatoren und müssen nun ein Dashboard zur Anzeige der Leistungsstatistiken hinzufügen.

Ich möchte das Dashboard so konfigurieren, dass es nicht aktualisiert werden muss, wenn jemand einen neuen Zähler zu einem neuen Code hinzufügt.

Antwort

25

Versuchen Sie folgendes:

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); 
    } 
} 

Sie haben bewusst Kategorien zu sein, die etwas anders mehrere Instanzen und befassen sich mit denen haben kann.

6

Just for fun .. hier ist die gleiche Sache in 1 Zeile von 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

Aufruf cat.GetInstanceNames() ist langsam, Sie sollten eine "lassen Variable" tun, um die Liste zu bekommen, und es wiederverwenden später –