获取一段时间内的总请求数

Get Total requests in a period of time

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

为此我需要在这里解决2个问题,我会在这里问prometheus的问题,在另一个link.

问Grafana的问题

如果我有一个计数器 http_requests_total,我如何构建一个查询来获取 一个整数 以及一段时间内的请求总数(对于 example:24hs)?

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

increase(http_requests_total[24h])

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

sum(increase(http_requests_total[24h]))

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

所以不允许我对 Yorory 的回答发表评论,所以我必须重新做一个...

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

sum(rate(http_requests_total[$__range]))

This variable represents the range for the current dashboard. It is calculated by to - from

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

根据increase() documentation,它不是聚合运算符。 因此,它会给出错误的答案。 (见注释。)

您应该使用 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

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

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

注:适合我:)

解决方案:为了计算 prometheus grafana 上的 https 计数器总和,您应该使用 increase 方法并设置 generic Time Range $interval 以便汇总和计算所有 http 请求计数器。

increase(http_requests_total[$interval])

根据Prometheus Reference

increase() increase(v range-vector) calculates the increase in the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. The increase is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if a counter increases only by integer increments.

The following example expression returns the number of HTTP requests as measured over the last 5 minutes, per time series in the range vector:

increase(http_requests_total{job="api-server"}[5m]) increase should only be used with counters. It is syntactic sugar for rate(v) multiplied by the number of seconds under the specified time range window, and should be used primarily for human readability. Use rate in recording rules so that increases are tracked consistently on a per-second basis.

P.S

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

2.In为了对所有的请求求和只需执行求和函数

sum(increase(http_requests_total[$interval]))

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

http_requests_total - http_requests_total offset 24h

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

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

http_requests_total - http_requests_total offset $__interval > 0

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

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

末尾的 > 0 过滤器将忽略所有可能因重启而捕获的负值。

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

看来前面的回答都把题理解错了,就是求一个从t0到t1的计数,t0的值应该是0。

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

http_requests_total - http_requests_total @ start()