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

Posted

技术标签:

【中文标题】获取一段时间内的总请求数【英文标题】:Get Total requests in a period of time 【发布时间】:2018-04-18 16:55:59 【问题描述】:

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

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

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

【问题讨论】:

请注意,Prometheus 可能会在具有整数值的时间序列上从 increase() 函数返回小数值。它也可能会错过一些缓慢增加的时间序列的值。这两个问题都记录在 github.com/prometheus/prometheus/issues/3746 中。如果您需要来自increase() 函数的准确整数值,请查看MetricsQL。 【参考方案1】:

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

increase(http_requests_total[24h])

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

sum(increase(http_requests_total[24h]))

另请参阅my answer 以了解有关在查询中使用 Grafana 的时间范围选择的部分问题。

【讨论】:

如果期间不是最后 24 小时,而是从第一个日期和时间和第二个日期和时间开始怎么办? @Cherry,您可以使用偏移量,例如increase(http_requests_total[5h] offset 1d)increase(http_requests_total[357s] offset 123m)。通过这种方式,您可以指定您感兴趣的时间段的宽度以及该时间段过去的距离。但这绝对不是一种方便的方式。也许其他人可以为您的问题提出更实用的解决方案。 @donotreply's answer 看起来像您要求的,但似乎仅在使用 Graphana 时适用。 实际上在服务器重启时prometheus值被重置为0,所以图表突然下降,如果我们看到24小时的增加,它是不准确的,因为它是第一个和最后一个值的差异,任何更好的方法? @somyabhargava 我遇到了确切的问题 - 我在 ***.com/questions/55928079/… 上找到了答案。所以在这种情况下,它将是sum(increase(http_requests_total[100y])) 但是sum(increase(http_requests_total[100y])) 会为您提供计数器整个生命周期内的总值,而不仅仅是选定的时间间隔【参考方案2】:

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

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

sum(rate(http_requests_total[$__range]))

此变量表示当前仪表板的范围。计算方式为 to - from

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

【讨论】:

【参考方案3】:

根据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

【讨论】:

sum_over_time 不应该直接用在计数器上,在 rate 之后使用。 当我使用 sum(sum_over_time(http_requests_total[$__interval])) 时,我仍然看到图表中出现下降,而应该是单调增加。 数据点不是单调递增的。计数器是否每分钟重置一次,而您每分钟都在收集?您是否正在执行将数据导入 prometheus 的推送方法?这可以解释为什么 sum_over_time 对你有用。对于其他数据点会被刮掉的人,重置不可能每分钟都发生,所以你会发现计数器看起来像这样:847、1690、2412、3245、4023。在这种情况下,增加功能应该会更好。【参考方案4】:
http_requests_total - http_requests_total offset $__interval > 0

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

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

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

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

【讨论】:

所有使用 increase() 的答案都不适用于所有仪表板范围,这个可以!【参考方案5】:

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

increase(http_requests_total[$interval])

根据Prometheus Reference:

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

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

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

附言

    您应该在 Grafana 上设置正确的 快速范围 以设置您选择的正确时间范围(直接渲染到 $interval 变量)另外我建议在 Graph 可视化上设置 正确的分辨率和最小时间间隔(在你的情况下是每天 -> 1d

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

sum(increase(http_requests_total[$interval]))

【讨论】:

【参考方案6】:

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

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

注意:对我有用:)

【讨论】:

如果 http_requests_total 在这 24 小时内被重置,这会给你错误的结果。【参考方案7】:

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

http_requests_total - http_requests_total offset 24h

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

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

【讨论】:

非常感谢!这是从 *_total 计数中获得真实结果的最准确请求。更通用的细粒度间隔方法是“http_requests_total - http_requests_total offset $__interval”(对于 grafana) 不,这不是正确的解决方案。如果实例重新启动,计数器将被重置。所以....

以上是关于获取一段时间内的总请求数的主要内容,如果未能解决你的问题,请参考以下文章

关于两种限流模式

SQL查询位置半径内的总点数

如何在单个过程调用python中获取具有实际数据的总记录数?

如何从 all_views 获取单个视图的总记录数

获取一段时间内的所有日期

通过浏览他/她的所有帖子 MongoDB 获取该用户收到的总喜欢数