获取一段时间内的总请求

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

为此,我需要在这里解决2个问题,我将在这里问普罗米修斯问题和格拉法纳问题在另一个链接。

如果我有一个计数器 http_requests_total,我如何构建一个查询来获得在一段时间内(例如: 24小时)请求总数的 一个整数

208125 次浏览

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

increase(http_requests_total[24h])

如果有多个计数器 http_requests_total(例如来自多个实例) ,并且需要获取请求的累积计数,请使用 款额()操作符:

sum(increase(http_requests_total[24h]))

关于在查询中使用 Grafana 的时间范围选择的问题,请参见 我的回答

所以不会让我评论尤里的回答,所以我必须做一个新的..。

在 Grafana 5.3中,他们为普罗米修斯引入了更易于使用的 $__range:

sum(rate(http_requests_total[$__range]))

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

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

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

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

注意: 对我有用:)

: 为了计算普罗米修斯格拉法纳上 https 计数器的总和,应该使用 increase方法并设置 通用时间范围通用时间范围 $interval,以便对所有 http 请求计数器进行求和计算。

increase(http_requests_total[$interval])

根据 普罗米修斯参考文献:

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

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

增加 increase(http_requests_total{job="api-server"}[5m])应该 只能与计数器一起使用。它是速率(v)的句法糖 乘以指定时间范围内的秒数 窗口,并应主要用于人类的可读性。使用率 记录规则,以便在一个 按每秒计算。

附言

  1. 你应该在 Grafana 上设置正确的 射程很短来设置你选择的正确的时间框架(直接渲染为 $interval变量)此外,我建议在 图形可视化上设置正确的分辨率和最小时间间隔(在你的情况下是每天-> 1d)

为了对所有的请求求数求和,只需要执行求和函数

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()

最近,我也有困惑,我得到了一些解决方案,但并不是所有的工作都是完美的。


解决方案一:

    sum(increase(your_point))[$__interval]

这个函数将使用相同的语句导致一些不同的值,并且还将导致零值(实际上不是零)。


解决方案2:

    max_over_time(your_point[$__range])- min_over_time(your_point[$__range])
    your_point[$__range] -  your_point offset $__range

这两者都有潜在的 bug (值重置) ,并且只能在[某时-现在]中获得值,不能在任何时间段获得答案。


解决方案3:

    sum_over_time(your_point)[$__range]

这个解决方案需要花费很多时间来改变您的指标(在某个时期重置) ,但是确实有效。

有人能给我另一个解决方案吗?