Служба приложений Azure: использование PerformanceCounters
Я пытаюсь настроить свое веб-приложение Azure таким образом, чтобы оно включало использование стороннего программного обеспечения, которое, по-видимому, требует доступа к PerformanceCounters. Локально это работает нормально, но когда я запускаю его в Azure, я получаю следующую ошибку:
[UnauthorizedAccessException: Access to the registry key 'Global' is denied.]
Microsoft.Win32.RegistryKey.Win32Error(Int32 errorCode, String str) +5230217
Microsoft.Win32.RegistryKey.InternalGetValue(String name, Object defaultValue, Boolean doNotExpand, Boolean checkSecurity) +11769029
Microsoft.Win32.RegistryKey.GetValue(String name) +40
System.Diagnostics.PerformanceMonitor.GetData(String item) +102
System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String item) +186
System.Diagnostics.PerformanceCounterLib.get_CategoryTable() +105
System.Diagnostics.PerformanceCounterLib.GetCategorySample(String category) +17
System.Diagnostics.PerformanceCounterLib.GetCategorySample(String machine, String category) +61
System.Diagnostics.PerformanceCounterCategory.GetCounterInstances(String categoryName, String machineName) +70
System.Diagnostics.PerformanceCounterCategory.GetInstanceNames() +25
Согласно этому ответу, я должен настроить IIS, чтобы разрешить доступ к пулу / пользователю приложения, но я не думаю, что это возможно для веб-приложения Azure. Есть ли способ заставить счетчики производительности работать в моей ситуации?
1 ответ
В Windows счетчики производительности доступны через WMI:
https://msdn.microsoft.com/en-us/library/aa392397(v=vs.85).aspx
WMI ограничен в изолированной программной среде службы приложений.
С https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox:
Доступ к внепроцессным COM-серверам
Серверы Windows имеют несколько COM-серверов, настроенных и доступных для использования по умолчанию; однако "песочница" предотвращает доступ ко всем COM-серверам вне процесса. Например, изолированное приложение не может вызывать WMI или MSIServer.
Из Куду:
PS D:\home> Get-Counter -Counter "\processor(_total)\% processor time"
Get-Counter : The specified object was not found on the computer.
PS D:\home> Get-WmiObject -Class WIN32_OperatingSystem
Get-WmiObject : Access is denied. (Exception from HRESULT: 0x80070005
(E_ACCESSDENIED))
Если вам абсолютно необходимо использовать стороннее программное обеспечение, обратите внимание на облачные службы Azure (с веб-ролью). У вас есть полный контроль над ОС там, пока вы все еще являетесь PaaS.