Prometheus无法获取Windows的CPU数据解决方法

Prometheus无法获取Windows的CPU数据解决方法,第1张

在使用的Prometheus的wmi exporter进行Windows监控时,会遇到CPU、 流量、磁盘等指标数据无法获取的情况。本文说一下解决方法

先说结论 :wmi exporter是通过Windows的WMI工具采集系统指标的,如果WMI这个工具有问题,那么监控工具肯定不会正常工作。

定位问题: 打开wmi exporter暴露的URL,查看cpu组件采集状态,一般是  >

2、windows系统中有获取cpu使用率的可执行文件exe,只要在java中获取该文件的执行路径,通过Java调用即可。

3、获取 *** 作系统可执行文件目录procCmd

4、调用java的RuntimegetRuntime()exec执行cmd应用程序

5、利用java中sleep来计算睡眠前后cpu的忙碌时间与空闲时间,因为sleep不会释放系统资源

6、根据忙碌时间占总时间的比例来计算cpu使用率

示例:

private double getCpuRatioForWindows() {  

        try {  

            String procCmd = Systemgetenv("windir")  

                    + "//system32//wbem//wmicexe process get Caption,CommandLine,"  

                    + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";  

            // 取进程信息  

            long[] c0 = readCpu(RuntimegetRuntime()exec(procCmd));  

            Threadsleep(CPUTIME);  

            long[] c1 = readCpu(RuntimegetRuntime()exec(procCmd));  

            if (c0 != null && c1 != null) {  

                long idletime = c1[0] - c0[0];  

                long busytime = c1[1] - c0[1];  

                return DoublevalueOf(  

                        PERCENT  (busytime) / (busytime + idletime))  

                        doubleValue();  

            } else {  

                return 00;  

            }  

        } catch (Exception ex) {  

            exprintStackTrace();  

            return 00;  

        }  

    }

1 要获取CPU编码可以使用dos命令wmic cpu get ProcessorId。

2 要在C语言中执行dos命令,一般使用system("wmic cpu get ProcessorId");

3 由于获取到的cpu编码是打印在命令行中的,要获取结果用system就无法实现了。这时可以用windows提供的_popen函数。该函数的功能为,执行一段dos命令,并将程序运行结果(原本的dos打印)保存在内存中,可以通过文件方式读取。

于是,代码如下:

#include <stdioh>

#include <stdlibh>

int main( void )

{

   char   psBuffer[128];

   FILE   pPipe;

   if( (pPipe = _popen( "wmic cpu get ProcessorId", "rt" )) == NULL )

      exit( 1 );//执行失败,退出程序。

 

   while(fgets(psBuffer, 128, pPipe))//读取结果,并输出。

   {

      printf(psBuffer);

   }

 

 

   / 关闭执行标识。本质上是释放这段内存。 /

    _pclose( pPipe );

    

    return 0;

}

在多核心或多处理器的计算机上,特别是在支持CPU频率动态调整的计算机上,windows系统下的QueryPerformanceFrequency()获取HPET(如果存在)的频率,而QueryPerformanceCounter()获取HPET(如果存在)自上电以来时钟周期数,与CPU频率无关。前一个函数不会因为线程运行所在的CPU不同或CPU的频率在不同时刻的差异而反馈不同的值,系统上电初始化以后便不会改变,后一个函数的源也是统一的。这样便可以精确计算目标程序,特别是多线程程序的性能。

如果想获得CPU的默认信息,包括制造商,版本号,默认频率等等,请使用:__cpuid()。如果想获得当前CPU的实际频率,请获取系统当前基频和倍频然后计算得到。

获取CPU的唯一标识代码,通常是通过代码编程来获取的,对业余者来说,难度很大,介绍一款小工具软件,可用它来提取这个代码:

1、搜索下载 “ Get CPU ID ” 获取CPU ID工具软件。软件运行环境要求如下:

2、下载提示的NET Framework V4030319 安装后,运行Get CPU ID程序,界面如下;

3、点击窗口中 “ Get CPU ID ” ,如指针所示位置,即会显示这个“ 唯一代码”;

4、注意问题,该小工具,可支持在XP及以上版本 *** 作系统运行。若在安装 NET Framework V4030319时,遇到错误提示,可先卸掉机中原已安装的 Net 老版本,重启后再行安装即可。

以上就是关于Prometheus无法获取Windows的CPU数据解决方法全部的内容,包括:Prometheus无法获取Windows的CPU数据解决方法、请问Java中获得CPU使用率的办法windows系统、C语言(VC++6.0)获取cpu编码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9756997.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存