我正在寻找一个查询来获取上周运行 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 的配置中获取所述间隔的方法,因此我必须将其硬编码到查询中。
我还试图找到获取工作的所有开始和结束时间的方法,但到目前为止无济于事。
最佳答案
干得好。不要问。 (o:
avg_over_time(
(
sum without() (up{job="prometheus"})
or
(0 * sum_over_time(up{job="prometheus"}[7d]))
)[7d:5m]
)
一点一点地解释一下:
sum without() (up{job="prometheus"})
: 接 up
metric(sum without()
部分用于在保留所有其他标签的同时删除度量名称); 0 * sum_over_time(up{job="prometheus"}[7d])
:为每个 up{job="prometheus"}
生成一个零值向量过去一周看到的标签组合(例如,如果您有多个 Prometheus 实例); or
两者结合在一起,因此您可以获得可用的实际值,缺失的值为零; [7d:5m]
:PromQL subquery , 产生一个跨越 7 天的范围向量,根据前面的表达式有 5 分钟的分辨率; avg_over_time
: 取 up
随时间变化的平均值带有零作为默认值填充的度量,其中缺少。 您可能还想添加
and sum_over_time(up{job="prometheus"}[7d]
到该表达式的末尾,仅获得过去 7 天内某个时间点存在的标签组合的结果。否则,由于 7 天范围和 7 天子查询的组合,您将获得前 14 天所有组合的结果。无论如何,这都不是一个有效的查询,但它不需要您将抓取间隔硬编码到查询中。按照要求。 (o:
关于prometheus - 如何使用 prometheus 和 node_exporter 获得服务器的整体正常运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58080200/