118

我需要在 Grafana 中显示一个面板,其中右上角选择的时间段内的请求数。

为此我需要在这里解决 2 个问题,我会在这里问 prometheus 问题,在另一个链接中问 Grafana 问题。

如果我有一个 Counter http_requests_total,我如何构建一个查询来获取一个整数,其中包含一段时间内的请求总数(例如:24hs)?

4

8 回答 8

173

您需要的是increase()函数,它将计算指定时间间隔开始和结束时计数器值之间的差异。它还可以正确处理该时间段内的计数器重置(如果有)。

increase(http_requests_total[24h])

如果您有多个计数器http_requests_total(例如来自多个实例)并且需要获取请求的累积计数,请使用sum()运算符:

sum(increase(http_requests_total[24h]))

另请参阅对在查询中使用 Grafana 的时间范围选择的那部分问题的回答。

于 2017-11-08T07:51:14.277 回答
49

所以不会让我评论 Yoory 的答案,所以我必须做一个新的......

在 Grafana 5.3 中,他们$__range为 Prometheus 引入了更易于使用的功能:

sum(rate(http_requests_total[$__range]))

此变量表示当前仪表板的范围。它由 to - from 计算得出

http://docs.grafana.org/features/datasources/prometheus/

于 2019-02-19T23:38:55.970 回答
12

根据increase() 文档,它不是聚合运算符。因此,它会给出错误的答案。(见说明。)

您应该使用随着时间间隔聚合的sum_over_time()函数。

sum_over_time(http_requests_total[24h])

如果您有多个计数器,请使用 sum() 运算符:

sum(sum_over_time(http_requests_total[24h]))

注意:我有 5 个数据点,其值为:847、870、836、802、836。(每分钟更新一次)

increase(http_requests_total[5m]) returns 2118.75 

sum_over_time(http_requests_total[5m]) returns 4191
于 2019-09-26T15:06:11.573 回答
10
http_requests_total - http_requests_total offset $__interval > 0

这建立了另一个有效并处理重启情况的答案和评论。

increase偏移量始终将值保持为整数,并且不会像andrate函数那样尝试执行插值。

最后的> 0过滤器将忽略由于重新启动而可能捕获的所有负值。

如果您选择在图例中选择总值,则最终结果是随时间推移的准确请求总数。

于 2020-09-29T16:51:47.743 回答
7

解决方案:为了计算 prometheus grafana 上的 https 计数器的总和,您应该使用increase方法并设置通用时间范围 $interval以求和并计算所有 http 请求计数器。

increase(http_requests_total[$interval])

根据普罗米修斯参考

increase() increase(v range-vector)计算范围向量中时间序列的增量。单调性的中断(例如由于目标重新启动而导致的计数器重置)会自动调整。该增加被外推以覆盖范围向量选择器中指定的整个时间范围,因此即使计数器仅增加整数增量,也可以获得非整数结果。

以下示例表达式返回在过去 5 分钟内测量的 HTTP 请求数,范围向量中的每个时间序列:

increase(http_requests_total{job="api-server"}[5m])增加只能与计数器一起使用。它是 rate(v) 乘以指定时间范围窗口下的秒数的语法糖,主要用于人类可读性。在记录规则中使用速率,以便每秒一致地跟踪增长。

附言

  1. 您应该在 Grafana 上设置正确的快速范围以设置您选择的正确时间范围(直接呈现为$interval变量)此外,我建议在图形可视化上设置 正确的分辨率和最小时间间隔(在您的情况下是每天 -> 1d)

2.为了求和所有数量的请求只需执行求和功能

sum(increase(http_requests_total[$interval]))
于 2020-05-13T09:46:10.667 回答
4

为了获得过去 24 小时的准确计数,我创建了以下查询:

max_over_time(http_requests_total[6s])- min_over_time(http_requests_total[24h])

注意:对我有用:)

于 2020-01-15T23:03:33.743 回答
1

要获得一段时间内准确的总请求数,我们可以使用offset

http_requests_total - http_requests_total offset 24h

increase将推断范围,以便我们可以在结果中看到浮点数。

通过使用offset,该值始终是整数,因为它只是计算开始和结束之间的差异

于 2020-06-18T14:30:24.920 回答
0

在我看来,之前所有的答案都误解了这些问题,即从 t0 到 t1 的计数,其中 t0 的值应该为 0。

为此,可以根据文档https://prometheus.io/docs/prometheus/latest/querying/basics/#modifier使用 @ 修饰符:

http_requests_total - http_requests_total @ start()
于 2022-02-14T16:05:19.897 回答