代码之家  ›  专栏  ›  技术社区  ›  Steve Dwire

按度量值而不是标签值筛选prometheus结果

  •  21
  • Steve Dwire  · 技术社区  · 7 年前

    因为 Prometheus topk returns more results than expected ,因为 https://github.com/prometheus/prometheus/issues/586 https://github.com/grafana/grafana/issues/7664

    在我的特殊情况下,我想绘制的大多数度量值在大多数情况下都是零。只有当它们高于零时,它们才有趣。

    我可以找到编写普罗米修斯查询的方法,根据 标签 ,但我还没有找到一种方法来告诉普罗米修斯,只有当 米制的 满足一定条件。在我的例子中,我想过滤大于零的值。

    我可以向普罗米修斯查询添加一个条件,根据度量值过滤数据点吗?如果是这样,我在哪里可以找到这样做的语法示例?

    3 回复  |  直到 7 年前
        1
  •  26
  •   Caesar    5 年前

    如果你对 brian 's answer :使用比较运算符进行过滤的结果不是布尔值,而是过滤后的序列。例如。

    min(flink_rocksdb_actual_delayed_write_rate > 0)
    

    将显示大于0的最小值。

    sum (flink_rocksdb_actual_delayed_write_rate >bool 0)
    

    这将给出非零计数。

        2
  •  22
  •   brian-brazil    7 年前
        3
  •  5
  •   valyala    2 年前

    这可以通过以下方法解决: subqueries :

    count_over_time((metric > 0)[5m:10s])
    

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

    根据方括号中第二个arg(aka)之间的关系,此查询可能返回不准确的结果 step 对于内部查询)和原始样本之间的实际间隔(aka scrape_interval

    • 如果 超过 刮取间隔 计算过程中可能会丢失一些样本。在这种情况下,查询将返回低于预期的结果。
    • 如果 小于 刮取间隔 ,则可能会对一些样本进行多次计数。在这种情况下,查询将返回大于预期的结果。

    因此,建议设置 刮取间隔

    P、 上面提到的问题在我研究的类似于维多利亚时代普罗米修斯的监控系统中得到了解决。它提供 count_gt_over_time() 函数,非常适合这种情况。例如,以下 MetricsQL 查询返回 过去5分钟内值大于0的原始样本数:

    count_gt_over_time(metric[5m], 0)