Load Testing with Custom Performance Counters: Listing 2.

The DataAccessCounterLocator class, which calls RecordOperation.

public class SqlServerCmsWebPageRepository :
  SqlServerCmsRepositoryBase <ICmsWebPage, 
  CmsDatasetTableAdapters.CmsWebPageTableAdapter >,
  ICmsWebPageRepository
{
  public override void Save(ICmsWebPage saveThis)
  {
    var startTicks = DateTime.Now.Ticks;

    try
    {
      DoSave(saveThis);
    }
    finally
    {
      // Call the locator to access OperationPerformanceCounterManager
      DataAccessCounterLocator.Instance.SaveWebPage.RecordOperation(
        DateTime.Now.Ticks - startTicks);
    }
  }

  // ...
}
public class DataAccessCounterLocator
{
  private static object m_SyncRoot = new object();

  private const string CategoryName = "Benday.com CMS Data Access";

  private DataAccessCounterLocator()
  {
    LoadWebPages = new OperationPerformanceCounterManager(
      CategoryName, "Load Web Pages");

    LoadWebPageById = new OperationPerformanceCounterManager(
      CategoryName, "Load Web Page By Id");

    SaveWebPage = new OperationPerformanceCounterManager(
      CategoryName, "Save Web Page");

    SaveFolder = new OperationPerformanceCounterManager(
      CategoryName, "Save Folder");

    SaveLink = new OperationPerformanceCounterManager(
      CategoryName, "Save Link");
  }

  public OperationPerformanceCounterManager 
    LoadWebPages { get; private set; }
  public OperationPerformanceCounterManager 
    SaveWebPage { get; private set; }
  public OperationPerformanceCounterManager 
    SaveFolder { get; private set; }
  public OperationPerformanceCounterManager 
    SaveLink { get; private set; }
  public OperationPerformanceCounterManager 
    LoadWebPageById { get; private set; }

  private static DataAccessCounterLocator m_Instance;
  public static DataAccessCounterLocator Instance
  {
    get
    {
      if (m_Instance == null)
      {
        lock (m_SyncRoot)
        {
          if (m_Instance == null)
          {
            m_Instance = new DataAccessCounterLocator();
          }
        }
      }

      return m_Instance;
    }
  }        // ...
}

About the Author

Benjamin Day is a consultant and trainer specializing in software best practices using Microsoft tools. Ben’s main areas of emphasis include Team Foundation Server, Scrum, software testing, and software architecture. He is a Microsoft Visual Studio ALM MVP, a certified Scrum trainer via Scrum.org, and a speaker at conferences such as TechEd and Visual Studio Live! When not developing software, Ben’s been known to go running and sea kayaking in order to balance out his love of cheese, cured meats, and champagne. He can be contacted via www.benday.com.

comments powered by Disqus

Featured

  • .NET Core Ranks High Among Frameworks in New Dev Survey

    .NET Core placed high in a web-dominated ranking of development frameworks published by CodinGame, which provides a tech hiring platform.

  • Here's a One-Stop Shop for .NET 5 Improvements

    Culled from reams of Microsoft documentation, here's a high-level summary of what's new for performance, networking, diagnostics and more, along with links to the nitty-gritty details for those wanting to dig in more.

  • Azure SQL Database Ranked Among Top 3 Databases of 2020

    Microsoft touted the inclusion of Azure SQL Database among the top three databases of 2020 in a popularity ranking by DB-Engines, which collects and manages information about database management systems, updating its lists monthly.

  • Time Tracker Says VS Code Is No. 1 Editor for Devs, Some Working 15+ Hours Per Day

    WakaTime, which does time tracking for programmers, released data for 2020 showing that Visual Studio Code is by far the top editor/IDE used by its coders, some of whom are hacking away for more than 15 hours per day.

Upcoming Events