Create performance counters using .NET and C#

Jul 12, 2006

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:

using System.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.

* $4.95/month BlogEngine.net Hosting – Click Here!

Comments (1) -

 Palmer
Palmer
9/23/2006 2:05:37 PM #

Could you show how the counters are set or incremented in your code? As your program runs, how does it increment the "total number of executed commands"? How does it set the start time of an operation & the end time, so that perfmon can display "average duration per operation execution"? How is "number of operations per second" calculated by perfmon (on the basis of what counter, as updated in your code?)

thanks,

Palmer

Comments are closed

About the author

Mads Kristensen

Mads Kristensen
Program Manager at the Microsoft Web Platform team and founder of BlogEngine.NET.

More...

Month List

Disclaimer

The opinions expressed herein are my own personal opinions and do not represent my employer’s view in any way.