获取一段时间内的总请求数
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
这建立了另一个有效并处理重启情况的答案和评论。
偏移量始终将值保持为整数,并且不会像 increase
和 rate
函数那样尝试执行插值。
最后的> 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) 不,这不是正确的解决方案。如果实例重新启动,计数器将被重置。所以....以上是关于获取一段时间内的总请求数的主要内容,如果未能解决你的问题,请参考以下文章