2009-08-20 28 views
8

¿Hay un método incorporado en System.Diagnostics para recuperar todos los contadores de rendimiento instanciados para un CategoryName determinado?Listar todos los contadores de rendimiento para una categoría

Tenemos varias aplicaciones con múltiples hilos que utilizan contadores de rendimiento personalizados y ahora necesitamos agregar un panel para mostrar las estadísticas de rendimiento.

Me gustaría hacer el tablero de instrumentos de tal forma que no necesite ser actualizado cada vez que alguien agregue un nuevo contador a un nuevo código.

Respuesta

25

Prueba esto:

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

Tienes que ser consciente de las categorías que pueden tener varias instancias y hacer frente a los de forma ligeramente diferente.

6

Sólo por diversión .. aquí es lo mismo que en 1 línea de 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

llamando cat.GetInstanceNames() es lento, se debe hacer un "dejar que la variable" para obtener la lista, y reutilizarla mas tarde –

Cuestiones relacionadas