Prometheus topk 函数返回所有结果

Sam*_*Sam 3 prometheus promql

我试图根据过去 24 小时内的登录次数绘制出排名前 5 位的用户。但是当我使用下面的topk函数时,我得到了该时间范围内的所有用户登录。

询问: topk(10, sum(my_app_login) by (User_Name) != 0)

在此输入图像描述

如何将其限制为仅前 10 名?

val*_*ala 5

首先,您需要在Grafana中启用即时查询。在这种情况下,Grafana 将仅返回每个结果时间序列所选时间范围上的最后一个数据点,而不是返回所选时间范围内每个时间序列的许多数据点。

其他考虑因素:

  • 如果my_app_login是一个计数器,那么以下查询应返回过去 24 小时内登录操作次数最多的用户:
topk(10, sum(increase(my_app_login[24h])) by (User_Name))
Run Code Online (Sandbox Code Playgroud)

请注意,即使my_app_login仅包含整数值,Prometheus 也可能会从此查询返回小数结果。这是因为increase()Prometheus 中的函数的数据模型怪癖 -有关详细信息,请参阅此评论本文。如果您需要精确的整数结果,请查看VictoriaMetrics 的 MetricsQL

  • 如果my_app_login是一个gauge,其中包含自上一个示例以来的应用程序登录次数,则以下查询应该有效:
topk(10, sum(sum_over_time(my_app_login[24h])) by (User_Name))
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅sum_over_time() 文档。

请注意,当topk(N, ...)N函数用于构建随时间变化的图表(又名范围查询)时,该函数可能返回的不仅仅是时间序列。N这是因为它根据图表上的每个时间戳独立返回顶部时间序列。如果您只需要N图表上的顶部时间序列,请查看topk_maxtopk_lasttopk_*MetricsQL 中的其他函数。