在一个范围内减去两个指标,然后找到平均值

Posted

技术标签:

【中文标题】在一个范围内减去两个指标,然后找到平均值【英文标题】:Subtract two metrics across a range and then find the average 【发布时间】:2021-09-28 07:37:16 【问题描述】:

我试图在一段时间 [5m] 内用相同的标签减去两个指标(量规),然后平均结果。

我尝试过的查询,

avg_over_time(jvm_memory_bytes_maxarea="heap", app="ui",kubernetes_pod_name="ui-dep-76b4f95bf4-xcs4s"[5m] -  jvm_memory_bytes_usedarea="heap", app="ui",kubernetes_pod_name="ui-76b4f95bf4-xcs4s"[5m]) 

avg_over_time(jvm_memory_bytes_maxarea="heap", app="ui",kubernetes_pod_name="ui-dep-76b4f95bf4-xcs4s" -  jvm_memory_bytes_usedarea="heap", app="ui",kubernetes_pod_name="ui-76b4f95bf4-xcs4s")[5m]

avg_over_time((jvm_memory_bytes_max - on(area, app, kubernetes_pod_name) jvm_memory_bytes_used)[5m])

所有这些都有解析错误,因为查询不正确。

大多数超出范围的示例都使用 avg_over_time 将指标缩减为单个值,然后使用算术运算。

我不确定它是否适用,因为我不想对一个指标进行平均,然后再应用一个算术函数。相反,我想对不同指标的两个数据点进行算术运算,然后对结果进行平均。

这可能吗?如果是这样,我会怎么做?

【问题讨论】:

【参考方案1】:

尝试以下查询:

avg_over_time((jvm_memory_bytes_maxarea="heap", app="ui",kubernetes_pod_name="ui-dep-76b4f95bf4-xcs4s" -  jvm_memory_bytes_usedarea="heap", app="ui",kubernetes_pod_name="ui-76b4f95bf4-xcs4s")[5m:10s])

它每隔 10 秒计算两个指标的差异,然后计算过去 5 分钟差异的平均值。查询使用Prometheus subquery feature。

【讨论】:

【参考方案2】:

实现此功能的一种方法是将内部表达式作为记录规则,然后将avg_over_time 应用于您喜欢的任何范围。由于在 PromQL 中子查询仍然非常有限,因此使用记录规则从表达式创建指标以用于其他表达式是一种常见的解决方案。

在你的情况下,它会是这样的:

...
  - name: memory_diff
    rules:
    - record: jvm_memory_diff_max_used
      expr: jvm_memory_bytes_max - jvm_memory_bytes_used
...

然后:

avg_over_time(jvm_memory_diff_max_used[5m])

【讨论】:

添加录制规则是否会给 prometheus 服务器带来负载?特别是如果有多个规则,那会扩展吗?

以上是关于在一个范围内减去两个指标,然后找到平均值的主要内容,如果未能解决你的问题,请参考以下文章

平均指标与相对指标的区别

计算不同时间范围内项目的平均分钟数

聚类-均值漂移

熊猫在相对时间范围内通过另一个值获得平均值

找到R中两个时间范围(POSIXct)之间的平均值

什么是平均指标?其特点都有哪些