Azure - 如何读取我的Web应用程序的CPU和内存?

时间:2017-08-01 13:10:44

标签: c# azure azure-web-sites azure-performancecounters

我尝试使用PerformanceCounters读取应用的CPU和内存使用情况。 代码:

PerformanceCounter cpuCounter;

cpuCounter = new PerformanceCounter();
cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";

var result = cpuCounter.NextValue();//ERROR HERE

我收到了一个未经授权的例外。 我该如何解决这个问题?

编辑1:
我试着为处理器数量和内存设置当前实例名称而没有运气......

编辑2:
例外.ToString()

  

System.UnauthorizedAccessException:访问注册表项' Global'被拒绝。在Microsoft.Win32.RegistryKey.Win32Error(的Int32的errorCode,字符串str)在Microsoft.Win32.RegistryKey.InternalGetValue在系统(字符串名称,对象默认值,布尔doNotExpand,布尔checkSecurity)在Microsoft.Win32.RegistryKey.GetValue(字符串名称) System.Diagnostics.PerformanceCounterLib.Counter上的System.Diagnostics.PerformanceCounterLib.get_CategoryTable()中的System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String item)中的.Diagnostics.PerformanceMonitor.GetData(String item)。字符串类别,字符串计数器,布尔值和类别Exists )在System.Diagnostics.PerformanceCounterLib.CounterExists(字符串机器,字符串类别,字符串计数器)在System.Diagnostics.PerformanceCounter.InitializeImpl()在System.Diagnostics.PerformanceCounter.Initialize()在System.Diagnostics.PerformanceCounter.NextSample()在StudioTech.Web.Infrastructure.CustomMachineMonitoring中的System.Diagnostics.PerformanceCounter.NextValue()。<> c__DisplayClass0_0。< b__0> d.Move C:\ MMT \ One \ StudioTech.Web \ Infrastructure \ CustomMachineMonitoring.cs:第33行中的Next()

1 个答案:

答案 0 :(得分:2)

根据异常信息,它表示我们无法访问性能监视器。由于WebApp是sandbox,如果我们使用Azure WebApp,我们无权访问。

  

用户帐户必须是管理员组的成员,或者是Windows中性能监视器用户组的成员。

我的建议是我们可以使用Application Insight来做到这一点。我们需要配置Application Insight for WebApp,更多详细信息,请参阅document。关于Application Insight中的性能计数器,我们可以参考此tutorials

如果我们尝试使用Application Insight API,则需要create a Apikey。我们也可以从document获取演示代码。它适用于我。

  static void Main(string[] args)
        {
            var applicationId = "xxxxxxxx";
            var applicationKey = "xxxxxxxx";
            var queryPath = "performanceCounters/processCpuPercentage";
            var queryType = "metrics";
            var str = GetTelemetry(applicationId, applicationKey, queryType, queryPath, "");


        }

 public static string GetTelemetry(string appid, string apikey,
            string queryType, string queryPath, string parameterString)
        {
            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Add("x-api-key", apikey);
            var req = string.Format(Url, appid, queryType, queryPath, parameterString);
            HttpResponseMessage response = client.GetAsync(req).Result;
            if (response.IsSuccessStatusCode)
            {
                return response.Content.ReadAsStringAsync().Result;
            }
            else
            {
                return response.ReasonPhrase;
            }
        }

enter image description here