如何检索当前 asp.net 应用程序的性能计数器

Posted

技术标签:

【中文标题】如何检索当前 asp.net 应用程序的性能计数器【英文标题】:How to retrieve performance counter for current asp.net application 【发布时间】:2012-07-04 15:41:21 【问题描述】:

我想从我的 ASP.NET 应用程序中检索“ASP.NET 应用程序”类别的一些性能计数器。

我的问题是,我不知道如何为当前正在运行的 ASP.NET 应用程序确定正确的实例名称。

我目前使用这个代码:

string instanceName = GetCurrentProcessInstanceName();

_perfCounters.Add(new PerformanceCounter("ASP.NET", "Application Restarts"));
_perfCounters.Add(new PerformanceCounter("ASP.NET Applications", "Pipeline Instance Count", instanceName));
_perfCounters.Add(new PerformanceCounter("ASP.NET Applications", "Requests Executing", instanceName));
_perfCounters.Add(new PerformanceCounter("ASP.NET Applications", "Requests/Sec", instanceName));
_perfCounters.Add(new PerformanceCounter("ASP.NET Applications", "Requests Failed", instanceName));

对于 GetCurrentProcessInstanceName,我根据在 intertubes 上找到的信息和代码 sn-ps 定义了这些辅助方法:

    private static string GetCurrentProcessInstanceName()
    
        return GetProcessInstanceName(GetCurrentProcessId());
    

    private static int GetCurrentProcessId()
    
        return Process.GetCurrentProcess().Id;
    

    private static string GetProcessInstanceName(int pid)
    
        PerformanceCounterCategory cat = new PerformanceCounterCategory("Process");

        string[] instances = cat.GetInstanceNames();
        foreach (string instance in instances)
        

            using (PerformanceCounter cnt = new PerformanceCounter("Process", "ID Process", instance, true))
            
                int val = (int) cnt.RawValue;
                if (val == pid)
                
                    return instance;
                
            
        

        return null;
    

现在的问题是,我收到以下错误: 指定类别中不存在实例“w3wp”。

很明显,代码 sn-ps 不会为当前应用程序返回正确的实例 ID。

我的问题是:如何确定(可靠)正确的值?

附加信息: 因为我了解到应该首先创建一个性能计数器对象并重用这个实例(而不是在每次需要的情况下创建这个对象),所以我在应用程序启动时启动了一个单例。出于这个原因,我无法访问当前的 HttpRequest,因为这发生在请求到达应用程序之前。

【问题讨论】:

【参考方案1】:

我找到了解决办法,而且很简单:

string curentWebApplicationInstanceName = System.Web.Hosting.HostingEnvironment.ApplicationID.Replace('/', '_');

【讨论】:

以上是关于如何检索当前 asp.net 应用程序的性能计数器的主要内容,如果未能解决你的问题,请参考以下文章

如何从当前用户检索(Jwt)访问令牌并将其传递给 asp.net 样板(abp)中的移动应用程序?

如何测量 .NET 内存缓存 4.0 的当前大小?

如何对正在运行的 ASP.NET 应用程序进行非侵入式分析?

为 ASP.NET 应用程序收集性能计数器数据的首选方法

用于远程可视化 ASP.NET 性能计数器的 Web 界面

为啥我的 ASP.NET MVC 多实例性能计数器不起作用