Windows ServerCore 容器中缺少性能计数器注册表项(天蓝色应用程序洞察 jar)
Posted
技术标签:
【中文标题】Windows ServerCore 容器中缺少性能计数器注册表项(天蓝色应用程序洞察 jar)【英文标题】:Performance Counters Registry key missing in Windows ServerCore container (azure application insights jar) 【发布时间】:2021-06-24 14:43:36 【问题描述】:我正在尝试让azure application insights java agent 在我的 Java 应用程序中工作。这在我的开发机器和 VM 上运行良好,但在本地 Windows 容器中尝试时出现错误。
[2021-06-24 06:04:48,844] INFO [PerformanceCounterContainer-0] out.b(a.java) 2021-06-24 06:04:48.844-07 ERROR o.d.w.r.HkeyPerformanceDataUtil - Unable to locate English counter names in registry Perflib 009. Counters may need to be rebuilt:
com.sun.jna.platform.win32.Win32Exception: The system cannot find the file specified.
at com.sun.jna.platform.win32.Advapi32Util.registryGetStringArray(Advapi32Util.java:951)
注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009 存在但没有内容。在非容器上,我看到了各种密钥,但在普通 Windows servercore: ltsc2019 容器中,密钥不存在。
MS 有几篇关于如何重建性能计数器的文章,尽管没有特定于 Windows Server 2019。
我觉得我需要在一个新容器上重建一些东西很奇怪。我是否遗漏了一些明显的东西,或者是否有另一种方法可以让 Azure 应用程序洞察 Java 代理在容器中工作?
如果我只是从 Windows Server 2019 中导出注册表项并将其导入到容器中运行的 Windows 的注册表中,那么一切似乎都可以正常工作,不再出现错误。仍然不明白为什么这是必要的。
【问题讨论】:
将见解 Java 代理导入我的 Spring 应用程序时,mcr.microsoft.com/windows/servercore:ltsc2019 中的相同问题。 【参考方案1】:作为导致上述日志消息的应用程序的作者,我刚刚发现这是另一个用户experiencing this issue 的结果。我能够在Azure Application Insights 中找到一个似乎相关的问题。从那里的对话来看,容器的隔离似乎阻止了对操作系统的访问。
建议的解决方法是:
在 Dockerfile 中添加一行并将权限授予 IIS 执行用户。
RUN net localgroup 'Performance Monitor Users' /add 'IIS APPPOOL\DefaultAppPool'
【讨论】:
我尝试了你的建议,但给出了这个错误:“没有这样的全局用户或组:IIS APPPOOL\DefaultAppPool。”请注意,我使用的是普通的 windowservercore 图像,而您链接的问题似乎使用了不同的 dotnet 容器。我试图重现原始问题,我可以使用 AI 代理 3.1.1 但不能使用 3.2.8,或者至少该错误在日志中不再可见。您应该能够使用以下代码重现它:github.com/robbie-coder/ai-container-perfcount-issue 将 Dockerfile 中的 AI 密钥替换为您的真实密钥。几分钟后出现错误。以上是关于Windows ServerCore 容器中缺少性能计数器注册表项(天蓝色应用程序洞察 jar)的主要内容,如果未能解决你的问题,请参考以下文章
Windows docker 容器中缺少 Microsoft.Cpp.Default.props
快速部署Windows Nano Server 2016 Hyper-V虚拟机
Windows Server 2012 GUI与Core的切换