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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prometheus无法获取Windows的CPU数据解决方法相关的知识,希望对你有一定的参考价值。

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

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

定位问题: 打开wmi exporter暴露的URL,查看cpu组件采集状态,一般是  http://localhost:9182/metrics ,搜索关键词,wmi_exporter_collector_success,发现cpu、disk、net的状态都是0,正常情况应该是1

排错步骤1:   打开Windows自带的events查看器,发现报错

排错步骤2: 打开 powershell,执行命令 Get-WmiObject Win32_PerfRawData_PerfOS_Processor,发现如下报错

得出结论: 这个报错表示WMI的获取CPU的方法无法执行,Windows的WMI组件受损,需要修复。

Prometheus 无法从自定义 Rest Endpoint 读取指标

【中文标题】Prometheus 无法从自定义 Rest Endpoint 读取指标【英文标题】:Promotheus not able to read metrics from custom Rest Endpoint 【发布时间】:2021-06-08 22:07:49 【问题描述】:

我正在尝试让 Promotheus 获取通过自定义 Spring Boot 端点公开的指标。 我在文件中有指标

# HELP cpu_usage_total The total amount of CPU.
# TYPE cpu_usage_total gauge.
cpu_usage_total 0.24950100481510162
# HELP memory_usage_total The total amount of MEMORY.
# TYPE memory_usage_total gauge.
memory_usage_total 30.0

我创建了一个 Restful 端点来读取这个文件并在端口 8080 上公开它的内容。到目前为止,这是我尝试过的:

  @GetMapping(value = "/metrics")
    public void metrics(HttpServletResponse response) throws IOException 
        File file = new File("/var/log/logparsing");
        InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
        MediaType mediaType = new MediaType("text", "plain", StandardCharsets.UTF_8);
        InputStream myStream = new FileInputStream(file);
        // Set the content type and attachment header.
        response.setContentType("text/plain; version=0.0.4;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        // Copy the stream to the response's output stream.
        IOUtils.copy(myStream, response.getOutputStream());
        response.flushBuffer();

我的 promotheus.yaml 配置文件:

global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.

  external_labels:
   monitor: 'codelab-monitor'
scrape_configs:
   - job_name: 'prometheus'
   scrape_interval: 5s
   metrics_path: '/metrics' 

   static_configs:
    - targets: ['logparsing:8080']

从我从 prometheus 文档中读到的内容是,服务器需要 format 中的数据。我尽量尊重它,但 promotheus 没有接受它。

任何帮助将不胜感激,谢谢。 PS:Prometheus的java客户端无法使用,需要这样操作。

【问题讨论】:

为什么将指标存储在静态文件中?指标应该发展。当您使用 Spring Boot 时,您可以在类路径中添加 spring-boot-actuator+ micrometer-registry-prometheus,然后 spring-boot 将自动配置并公开一个包含所有这些指标的 /prometheus 端点。 我完全同意你的看法,这将是更好的方法,但我必须以这种方式实现它.. 我很确定它是可行的。 您能提供您的回复正文吗?和原文件一样吗? 是的,和文件里的一样。 您也可以分享您的 prometheus 配置文件,以便我们检查作业是否设置好。你的工作是否指向好的 IP:HOST/metrics ? 【参考方案1】:

我已经复制了您的环境,由于行尾有\r 字符,您的指标似乎无效。

我首先得到了这个:

然后我删除了 cmets:

没有 cmets

我已经从文件中删除了所有\r 字符,并且有效。 PS:有些编辑器会自动添加\r,我用Notepad++编辑文件。

【讨论】:

以上是关于Prometheus无法获取Windows的CPU数据解决方法的主要内容,如果未能解决你的问题,请参考以下文章

Prometheus 查询以获取 kubernetes pod 中的 CPU 和内存使用情况

Prometheus 无法从自定义 Rest Endpoint 读取指标

Prometheus技术分享——prometheus的函数与计算公式详解

Prometheus 采集Windows主机监控数据

第七篇Prometheus PromQL 简单用法

使用 prometheus 计算 k8s 集群 cpu/内存使用情况