Prometheus 给出空的查询结果,尽管单个组件指标可用

Prometheus gives empty query result although individual component metrics are available

在 Grafana 仪表板中显示了一个自定义指标。该指标通过 Prometheus 接收。该指标是通过 Spring Boot Actuator / Micrometer 构建的。

在大约一半的情况下,Prometheus 对指标的查询给出了空结果。在其他情况下,该值有效。那么,这可能与抓取的门槛有关?

分析 Prometheus 使用的查询,结果为空:

http://valid.url/prometheus/api/v1/query?query=last_seconds_since_startime_seconds&time=1645521095.864

http://valid.url/prometheus/api/v1/query?query=last_seconds_since_startime_seconds

结果是:

{"status":"success","data":{"resultType":"vector","result":[]}}

使用此查询显示完整的结果(大约 17 秒后)以及实际值:

http://valid.url/stackname/componentname/actuator/prometheus

文中是:

last_seconds_since_startime_seconds 63.0

环境是SpringBoot、Micrometer、Actuator、Prometheus和Grafana。执行器查询是用 Micrometer 构建的:

Gauge.builder( LAST_SECONDS_SINCE_STARTIME, this,
            PrometheusStatistics::secondsSinceStart)
            .description("Seconds since last fetch")
            .baseUnit("seconds")
            .strongReference(true)
            .register(meterRegistry);

解决方案是在 prometheus.yml 文件中为 Docker Swarm 中的特定组件更新抓取超时。

全局设置保留默认值10s。

对于特定组件:

- job_name: 'my-component'
  metrics_path: /actuator/prometheus
  scrape_interval: 30s
  scrape_timeout: 25s    <== this one
  dns_sd_configs:
    - names:
        - 'tasks.mycomponent'
      type: 'A'
      port: 8080