2009-08-20 28 views
8

System.Diagnosticsには、特定のCategoryNameのインスタンス化されたすべてのパフォーマンスカウンターを取得するための組み込みメソッドがありますか?カテゴリのすべてのパフォーマンスカウンターを一覧表示する

カスタムパフォーマンスカウンターを使用するマルチスレッドアプリケーションが多数あり、パフォーマンス統計情報を表示するためのダッシュボードを追加する必要があります。

誰かが新しいコードに新しいカウンタを追加するたびに更新する必要がないようにダッシュボードを作りたいと思います。

答えて

25

これを試してください:あなたは複数のインスタンスを持っていると少し違ったものに対処できるカテゴリに注意する必要があり

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

は...ここでLINQの1行でも同じことだ:

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

cat.GetInstanceNamesを()遅いです、あなたがすべき「let変数」のリストを取得するには、それを再利用呼び出し後で –

関連する問題