Список всех счетчиков производительности для категории - PullRequest
8 голосов
/ 20 августа 2009

Есть ли в System.Diagnostics встроенный метод для извлечения всех экземпляров счетчиков производительности для данного CategoryName?

У нас есть несколько многопоточных приложений, использующих пользовательские счетчики производительности, и теперь нам нужно добавить панель мониторинга для отображения статистики производительности.

Я хотел бы сделать панель инструментов таким образом, чтобы ее не нужно было обновлять всякий раз, когда кто-то добавляет новый счетчик в новый фрагмент кода.

Ответы [ 2 ]

25 голосов
/ 20 августа 2009

Попробуйте это:

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

Вы должны знать о категориях, которые могут иметь несколько экземпляров, и относиться к ним несколько иначе.

6 голосов
/ 18 февраля 2013

Просто для удовольствия .. вот то же самое в 1 строке 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...