1

我们需要为我们的应用程序添加性能监控。对于原型,我创建了一个示例项目,我正在尝试开始工作。

我正在尝试将 policyInjection 用于性能计数器,因此我们将能够在生产环境中打开和关闭性能监控。

到目前为止,我可以在 perfmon 中看到实际类别,但我看不到任何实例(见图),即使我很确定应用程序正在运行并且实例存在,正如您在附加源中看到的那样。

perfmon 中没有实例

我尝试了很多东西,也用谷歌搜索,但没有找到任何可用的解决方案或线索寻找什么。

应用程序被创建为 consoleApplication

您还可以在此处下载 VS 的压缩项目:http: //dl.dropbox.com/u/19457132/stackOverflow/Mpd.Instrumentation.PerformanceCounter.zip

这是我的消息来源。

程序.cs

using System;
using System.Collections;
using System.Configuration.Install;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.PolicyInjection;
using Microsoft.Practices.EnterpriseLibrary.PolicyInjection.Installers;

namespace Mpd.Instrumentation.PerformanceCounter
{
    class Program
    {
        static void Main(string[] args)
        {
           //RemoveCounters();   
           InstallCounters();

            MyCounters myCounter = PolicyInjection.Create<MyCounters>();

            for (int i = 0; i < 100000000; i++)
            {
                myCounter.SampleMethod(i);
            }

            Console.ReadLine();
        }

        public static void InstallCounters()
        {
            PerformanceCountersInstaller installer = new PerformanceCountersInstaller(new SystemConfigurationSource());
            IDictionary state = new Hashtable();

            installer.Context = new InstallContext();
            installer.Install(state);
            installer.Commit(state);

            Console.WriteLine("Performance counters have been successfully installed. Press enter to continue");
            Console.ReadLine();
        }

        private static void RemoveCounters()
        {
            PerformanceCountersInstaller installer = new PerformanceCountersInstaller(new SystemConfigurationSource());
            installer.Context = new InstallContext();
            installer.Uninstall(null);
            Console.WriteLine("Performance counters have been successfully removed. Press enter to continue.");
            Console.ReadLine();
        }
    }
}

我的计数器.cs

using System;
using System.Threading;

namespace Mpd.Instrumentation.PerformanceCounter
{
    public class MyCounters : IPerformanceCounter
    {
        public void SampleMethod(int i)
        {
            Console.WriteLine(i);
            Thread.Sleep(50);
        }
    }
}

IPPerformanceCounter.cs

using System;

namespace Mpd.Instrumentation.PerformanceCounter
{
    public class IPerformanceCounter : MarshalByRefObject
    {

    }
}

最后是 app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="policyInjection" type="Microsoft.Practices.EnterpriseLibrary.PolicyInjection.Configuration.PolicyInjectionSettings, Microsoft.Practices.EnterpriseLibrary.PolicyInjection, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" />
    <section name="instrumentationConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Common.Instrumentation.Configuration.InstrumentationConfigurationSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false" />
  </configSections>
  <policyInjection>
    <policies>
      <add name="SampleCountersPolicy">
        <matchingRules>
          <add type="Microsoft.Practices.EnterpriseLibrary.PolicyInjection.MatchingRules.MethodSignatureMatchingRule, Microsoft.Practices.EnterpriseLibrary.PolicyInjection, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            match="SampleMethod" ignoreCase="true" name="Method Signature Matching Rule" />
        </matchingRules>
        <handlers>
          <add type="Microsoft.Practices.EnterpriseLibrary.PolicyInjection.CallHandlers.PerformanceCounterCallHandler, Microsoft.Practices.EnterpriseLibrary.PolicyInjection, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            categoryName=".aaaTest" instanceName="Default" useTotalCounter="true"
            incrementNumberOfCalls="true" incrementCallsPerSecond="true"
            incrementAverageCallDuration="true" incrementTotalExceptions="true"
            incrementExceptionsPerSecond="true" order="1" name="Performance Counter Call Handler" />
        </handlers>
      </add>
    </policies>
  </policyInjection>
  <instrumentationConfiguration performanceCountersEnabled="true"
    applicationInstanceName="Default" />
</configuration>
4

1 回答 1

0

由于SampleMethod接受参数,您需要将其添加到匹配规则配置中:

    <matchingRules>
      <add type="Microsoft.Practices.EnterpriseLibrary.PolicyInjection.MatchingRules.MethodSignatureMatchingRule, Microsoft.Practices.EnterpriseLibrary.PolicyInjection, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        match="SampleMethod" ignoreCase="true" name="Method Signature Matching Rule">
        <parameters>
          <parameter name="i" typeName="System.Int32" />
        </parameters>
      </add>
    </matchingRules>

如果没有该参数,则匹配规则不匹配,因此不会调用调用处理程序。如果您修改配置,您应该会在 perfmon 中看到这些实例。

于 2012-05-16T20:00:42.497 回答