List all performance counters for a category
-
19-09-2019 - |
Question
Is there a built-in method in System.Diagnostics for retrieving all of the instantiated performance counters for a given CategoryName?
We have a number of multi threaded apps using custom performance counters and now need to add a dashboard for displaying the performance statistics.
I'd like to make the dashboard in such a way that it does not need to be updated whenever someone adds a new counter to a new piece of code.
Solution
Try this:
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);
}
}
You have to be aware of categories that can have multiple instances and deal with those slightly differently.
OTHER TIPS
Just for fun.. here's the same thing in 1 line of 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))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow