0 Comments

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.

#region Using

using System;
using System.Diagnostics;

#endregion

namespace PerformanceCounters
{

/// <summary>
/// A helper class to create the specified performance counters.
/// </summary>
public class PerfmormanceMonitor
{

/// <summary>
/// Creates an instance of the class.
/// </summary>
/// <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;

/// <summary>
/// Creates the performance counters
/// </summary>
public void CreateCounters()
{
   if (!PerformanceCounterCategory.Exists(_Category))
   { 
      PerformanceCounterCategory.Create(this._Category, this._Category, PerformanceCounterCategoryType.Unknown, this._Counters);
   }
}

/// <summary>
/// Add a performance counter to the category of performance counters.
/// </summary>
public void AddCounter(string name, string helpText, PerformanceCounterType type)
{
   CounterCreationData ccd = new CounterCreationData();
   ccd.CounterName = name;
   ccd.CounterHelp = helpText;
   ccd.CounterType = type;
   this._Counters.Add(ccd);
}

}
}

And here is the method that uses the helper class:

usingSystem.Diagnostics;

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);
   mon.CreateCounters();
}

The functionality could be greatly expanded in the helper class, but I haven't got the time for it at the moment.