Today, I had to implement custom performance counters in one of our applications. I haven’t worked much with performance counters before, so I wanted to check the Internet for some good articles and maybe some helper classes or wrappers around the functionality.
I found this article, which does an excellent job explaining how to go about it. But it didn’t offer any helper class or plug ‘n play wrapper, so I decided to build my own. Then I can use it the next time I have to implement performance counters in .NET.
The code is not very complicated, and I think it is pretty self explanatory. It consist of a helper class and a method that calls this helper class.
/// A helper class to create the specified performance counters.
public class PerfmormanceMonitor
/// Creates an instance of the class.
/// <param name="categoryName">The name of the performance counter category.</param>
public PerfmormanceMonitor(string categoryName)
this._Category = categoryName;
private CounterCreationDataCollection _Counters = new CounterCreationDataCollection();
private string _Category = string.Empty;
/// Creates the performance counters
public void CreateCounters()
PerformanceCounterCategory.Create(this._Category, this._Category, PerformanceCounterCategoryType.Unknown, this._Counters);
/// Add a performance counter to the category of performance counters.
public void AddCounter(string name, string helpText, PerformanceCounterType type)
CounterCreationData ccd = new CounterCreationData();
ccd.CounterName = name;
ccd.CounterHelp = helpText;
ccd.CounterType = type;
And here is the method that uses the helper class:
static void CreatePerformanceCounter()
PerfmormanceMonitor mon = new PerfmormanceMonitor("Headlight Parser");
mon.AddCounter("# operations executed", "Total number of executed commands", PerformanceCounterType.NumberOfItems64);
mon.AddCounter("# logfiles parsed", "Total number of logfiles parsed", PerformanceCounterType.NumberOfItems64);
mon.AddCounter("# operations / sec", "Number of operations executed per second", PerformanceCounterType.RateOfCountsPerSecond32);
mon.AddCounter("average time per operation", "Average duration per operation execution", PerformanceCounterType.AverageTimer32);
mon.AddCounter("average time per operation base", "Average duration per operation execution base", PerformanceCounterType.AverageBase);
The functionality could be greatly expanded in the helper class, but I haven't got the time for it at the moment.