NETでパフォーマンスカウンタープロバイダーv 2.0を作成するため。 枠組み

こんにちは友人!

nuget DevUtils ETW IMBAのパッケージを紹介します。これは、Windows Vistaで導入された新しいアーキテクチャ(バージョン2.0)をサポートするパフォーマンスカウンターをすばやく簡単に作成するのに役立ちます。



.NET Framework 4.5では、クラスがSystem.Diagnostics.PerformanceDataスペースに追加されました。これにより、この新しいアーキテクチャでカウンターを作成できますが、使用するには以下が必要です。
  1. XMLマニフェストに手動でカウンターを記述するために、これらのカウンターはカウンターのセットに論理的にグループ化されます。 セット内のカウンタは、指定されたカウンタセット内で一意の数値識別子によって決定されます。 プロバイダーに対して1つ以上のカウンターのセットを定義できます。 一連のカウンターは、このプロバイダーの一意のGUIDによって識別されます。
  2. マニフェストを記録した後、 CTRPPツールを使用してマニフェストをコンパイルする必要があります 。これは.rcファイルを作成し、コンパイルされたリソースファイル(.res)が作成され、プロジェクトに追加されます。
  3. LodCtrツールを使用してコンピューターにカウンターを登録する




このツールは、これらすべての手順を実行します。 カウンターをコードで記述するだけです。



[CounterSource(Guid = "{ab8e1320-965a-4cf9-9c07-fe25378c2a23}")] sealed class MyCounterSource { #region MyLogicalDiskSet [CounterSet(CounterSetInstances.Multiple, Name = "My LogicalDisk", Description = "This is a sample counter set with multiple instances.")] public enum MyLogicalDiskSet { [Counter(CounterType.PerfCounterRawcount, DefaultScale = 1, Name = "My Free Megabytes", Description = "First sample counter.", DetailLevel = CounterDetailLevel.Standard)] MyFreeMegabytes = 1, [CounterAttributeReference] [CounterAttributeDisplayAsReal] [Counter(CounterType.PerfAverageTimer, DefaultScale = 1, BaseId = (int)MyAvgDiskTransfer, Name = "My Avg. Disk sec/Transfer", Description = "Second sample counter.", DetailLevel = CounterDetailLevel.Advanced)] MyAvgDiskSec, [CounterAttributeNoDisplay] [Counter(CounterType.PerfAverageBase, DetailLevel = CounterDetailLevel.Advanced)] MyAvgDiskTransfer, } #endregion #region MySystemObjectsSet [CounterSet(CounterSetInstances.Single, Name = "My System Objects", Description = "My System Objects Help.")] public enum MySystemObjectsSet { [CounterAttributeDisplayAsHex] [CounterAttributeNoDigitGrouping] [Counter(CounterType.PerfCounterRawcount, DefaultScale = 1, Name = "Process Count", Description = "Process Count Help.")] ProcessCount = 1, [Counter(CounterType.PerfCounterRawcount, Name = "Thread Count", Description = "Thread Count Help.")] ThreadCount, [Counter(CounterType.PerfElapsedTime, DefaultScale = 1, PerfTimeId = (int)SystemTime, PerfFreqId = (int)SystemFreq, Name = "System Elapsed Time", Description = "System Elapsed Time Help.", DetailLevel = CounterDetailLevel.Advanced)] SystemElapsedTime, [CounterAttributeNoDisplay] [Counter(CounterType.PerfCounterLargeRawcount)] SystemTime, [CounterAttributeNoDisplay] [Counter(CounterType.PerfCounterLargeRawcount)] SystemFreq } #endregion }
      
      







そして、これらのカウンターにデータを提供します。



 public static void Test() { using (var diskSet = new CounterSet<MyLogicalDiskSet>()) using (var objectsSet = new CounterSet<MySystemObjectsSet>()) using (var diskSetInst = diskSet.CreateInstance("Default")) using (var objectsSetInst = objectsSet.CreateInstance("Default")) { var processCount = objectsSetInst[MySystemObjectsSet.ProcessCount]; var myAvgDiskSec = diskSetInst[MyLogicalDiskSet.MyAvgDiskSec]; var myAvgDiskTransfer = diskSetInst[MyLogicalDiskSet.MyAvgDiskTransfer]; processCount.Value = 2; for (var i = 0; i < 10; ++i) { var beginTicks = Stopwatch.GetTimestamp(); //  -  Thread.Sleep(1000); var endTicks = Stopwatch.GetTimestamp(); myAvgDiskSec.IncrementBy(endTicks - beginTicks); myAvgDiskTransfer.IncrementBy(1); } } }
      
      







そして、プログラムを実行します。



コンパイル後、bin \ Debug \に2つのファイルが作成されます。



  1. <プロジェクト名> .IM.xmlこれはマニフェスト自体であり、自動的に生成されます。
  2. <プロジェクト名> .IM.dllこれは、リソースのみを含むファイルです。 これらは、カウンター名、セット名、説明行などです。




また、スタジオに管理者権限がある場合、カウンターがシステムに登録され、すぐに結果を確認できます。



プロジェクトファイルに挿入することにより、自動的に登録する機能を無効にできます。



 <PropertyGroup> <IMBASkipInstallManifest>true</IMBASkipInstallManifest> </PropertyGroup>
      
      







このパッケージをすぐに使い始めるために書きたかった言葉をいくつか紹介します。 すべての質問にお答えできることを嬉しく思います。



All Articles