我尝试使用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()
答案 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;
}
}