【问题标题】:How to get overall uptime of a server with prometheus and node_exporter如何使用 prometheus 和 node_exporter 获得服务器的整体正常运行时间
【发布时间】:2020-01-24 13:43:48
【问题描述】:

我正在寻找一个查询来获取上周运行 prometheus 的服务器的平均正常运行时间。它应该是大约 15 小时/周,所以大约 8-10 %。

我在 CentOS 7.6.1810 上使用 Prometheus 2.5.0 和 node_exporter。 我最有希望的实验是:

1 - avg_over_time(up{job="prometheus"}[7d])

这是我在寻找获得平均正常运行时间的方法时发现的,但它正好给了我 1。(我的猜测是它忽略了没有发生刮擦的时间?)

2 - sum_over_time(up{job="prometheus"}[7d]) * 15 / 604800

这在技术上是可行的,但取决于抓取间隔,在我的例子中是 15 秒。我似乎找不到从 prometheus 的配置中获取所述间隔的方法,因此我必须将其硬编码到查询中。

我还尝试找到获取工作的所有开始和结束时间的方法,但到目前为止无济于事。

【问题讨论】:

  • 你是在同一个节点上运行prometheus resver吗? up 指标给出了探测是否成功,所以如果监控服务器关闭,并且没有抓取,那么你将不会得到 0-s for up。
  • 是的,服务器基本上应该检查它自己的正常运行时间。

标签: prometheus prometheus-node-exporter


【解决方案1】:

给你。不要问。 (o:

avg_over_time(
  (
    sum without() (up{job="prometheus"})
      or
    (0 * sum_over_time(up{job="prometheus"}[7d]))
  )[7d:5m]
)

一点一点解释:

  1. sum without() (up{job="prometheus"}):采用up 指标(sum without() 部分用于在保留所有其他标签的同时摆脱指标名称);
  2. 0 * sum_over_time(up{job="prometheus"}[7d]):为过去一周看到的每个 up{job="prometheus"} 标签组合生成一个零值向量(例如,如果您有多个 Prometheus 实例);
  3. or 将两者放在一起,因此您可以在可用的地方获得实际值,在缺失的地方获得零;
  4. [7d:5m]:PromQL subquery,根据前面的表达式生成一个跨越 7 天的范围向量,分辨率为 5 分钟;
  5. avg_over_time:取 up 指标随时间变化的平均值,默认情况下填零。

您可能还想在该表达式的末尾添加 and sum_over_time(up{job="prometheus"}[7d],以便仅获得过去 7 天某个时间点存在的标签组合的结果。否则,由于 7 天范围和 7 天子查询的组合,您将获得过去 14 天所有组合的结果。

无论如何,这都不是一个有效的查询,但它不需要您将抓取间隔硬编码到查询中。按照要求。 (o:

【讨论】:

  • 谢谢。我必须升级到 prometheus 2.12,但这确实有效。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 2020-09-11
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多