在使用的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编码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)