Prometheus topk 返回的结果比预期的多

Jor*_*rda 6 prometheus

如果我使用以下查询

topk(5,sum(container_memory_usage_bytes{kubernetes_container_name=~".+", kubernetes_namespace=~".+"}) by (kubernetes_namespace,kubernetes_container_name))
Run Code Online (Sandbox Code Playgroud)

它按预期返回 5 个结果。

然而与

topk(5,sum(irate(container_cpu_usage_seconds_total{kubernetes_container_name=~".+", kubernetes_namespace=~".+"}[20s])) by (kubernetes_namespace,kubernetes_container_name))
Run Code Online (Sandbox Code Playgroud)

大约返回 18 个结果。知道为什么会这样吗?我需要在第二个查询中更改什么才能只获得前 5 个?

val*_*ala 6

在 Grafana 中构建图表时, Prometheus 可能会ktopk(k, ...)返回更多时间序列,因为它独立选择k图表上每个点的最大值的顶部时间序列。图表上的每个点可能有自己的一组顶级时间序列。因此最终的图表可能包含的不仅仅是k时间序列。针对这个问题有以下几种解决方案:

  • 在 Grafana 中设置即时查询。然后 Grafana 查询/api/v1/query端点而不是/api/v1/query_range端点。端点/api/v1/query仅在单个时间戳处评估查询,因此它始终返回来自 的k时间序列topk(k, ...)
  • 使用来自我从事的 VictoriaMetrics 项目的MetricsQLtopk_* (类似 PromQL 的查询语言)中的函数之一。例如,topk_max(k, ...)返回所选时间范围内具有最大值的时间序列,而topk_last(k, ...)返回具有所选时间范围末尾的最大值的顶部时间序列。选定的时间范围。kk


Pat*_*vit 5

有同样的问题,我在查询中打开了“即时”,我得到了正确的金额


bri*_*zil 2

从角度来看,这些是相同的查询topk,两者返回的结果不应超过 5 个。

我是否可以正确地说,您不是将其作为查询运行,而是实际上作为图表运行?如果是这样,您到底想选择哪 5 个?

  • @brian-brazil:这个解决方案很棒 - https://www.robustperception.io/graph-top-n-time-series-in-grafana。然而,这仅显示了最后一个topk。如果我想显示某个时间范围内每个 avg_on_interval/timestamp 的 topk 该怎么办? (3认同)
  • 刚刚找到了关于这个确切问题的票证https://github.com/prometheus/prometheus/issues/586,所以我想目前没有好的解决方案。 (2认同)