按度量值而不是标签值过滤方法的结果

Ste*_*ire 8 grafana prometheus

因为Prometheus topk返回的结果比预期的要多,并且因为https://github.com/prometheus/prometheus/issues/586需要尚未通过https://github.com/grafana/grafana提供的客户端处理。/ issues / 7664,我正在尝试针对我的类似问题采用不同的近期解决方法。

在我的特定情况下,我想绘制的大多数度量标准值大多数时候都为零。只有当它们大于零时,它们才有意义。

我可以找到写prometheus查询的方法来基于标签的值过滤数据点,但是我还无法找到一种方法来告诉prometheus仅在度量值满足以下条件时才返回时间序列数据点:一定条件。就我而言,我想过滤一个大于零的值。

是否可以向Prometheus查询添加条件以根据指标值过滤数据点?如果是这样,我在哪里可以找到语法示例?

Cae*_*sar 12

如果您对brian的回答感到困惑:使用比较运算符进行过滤的结果不是布尔值,而是过滤后的系列。例如

min(flink_rocksdb_actual_delayed_write_rate > 0)
Run Code Online (Sandbox Code Playgroud)

将显示大于 0 的最小值。

如果您确实想要一个布尔值(或者更确切地说是 0 或 1),请使用类似

sum (flink_rocksdb_actual_delayed_write_rate >bool 0)
Run Code Online (Sandbox Code Playgroud)

这会给你非零计数。


bri*_*zil 8

例如,使用比较运算符进行过滤x > 0

  • 所以-详细一点...如果我想要一个grafana图,它显示特定主机(由host_name标记)上所有队列(items_in_queue指标)的队列深度的时间序列,但仅显示那些items_in_queue指标大于零的队列,该查询将类似于...`items_in_queue {host_name =〜“ myhost”}}> 0`。标签值的过滤器位于“ {}”内部,基于度量值的过滤器位于“ {...}”之后。是这样的吗? (3认同)

val*_*ala 5

这可以通过子查询来解决:

count_over_time((metric > 0)[5m:10s])
Run Code Online (Sandbox Code Playgroud)

上面的查询将返回过去metric5 分钟内大于 0 的数据点的数量。

此查询可能会返回不准确的结果,具体取决于方括号中的第二个参数(也称为step内部查询)与原始样本之间的实际间隔(也称为scrape_interval)之间的关系:

  • 如果step超过scrape_interval,则计算过程中可能会丢失一些样本。在这种情况下,查询将返回低于预期的结果。
  • 如果step小于scrape_interval,则某些样本可能会被计数多次。在这种情况下,查询将返回比预期更大的结果。

因此建议将 设为stepscrape_interval获得准确的结果。

PS 上述问题在我从事的类似 Prometheus 的监控系统 VictoriaMetrics 中得到了解决。它提供了count_gt_over_time()函数,非常适合这种情况。例如,以下MetricsQL查询返回过去 5 分钟内值大于 0 的原始样本的确切数量:

count_gt_over_time(metric[5m], 0)
Run Code Online (Sandbox Code Playgroud)

  • 对于其他人:请确保在括号内包含两个时间范围,否则会出现错误。我花了一些时间才弄清楚这一点。 (2认同)