减去一个范围内的两个指标,然后求平均值
Subtract two metrics across a range and then find the average
我试图在 [5m] 的时间段内减去两个具有相同标签的指标(量表),然后对结果取平均值。
我试过的查询,
avg_over_time(jvm_memory_bytes_max{area="heap", app="ui",kubernetes_pod_name="ui-dep-76b4f95bf4-xcs4s"}[5m] - jvm_memory_bytes_used{area="heap", app="ui",kubernetes_pod_name="ui-76b4f95bf4-xcs4s"}[5m])
avg_over_time(jvm_memory_bytes_max{area="heap", app="ui",kubernetes_pod_name="ui-dep-76b4f95bf4-xcs4s"} - jvm_memory_bytes_used{area="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 将指标缩减为单个值,然后使用算术运算。
我不确定它是否适用,因为我不想对一个指标进行平均然后应用算术函数。但是,我想对不同指标的两个数据点应用算术运算,然后对结果进行平均。
这可能吗?如果是这样,我该怎么做?
实现此功能的一种方法是将内部表达式作为记录规则,然后将 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])
尝试以下查询:
avg_over_time((jvm_memory_bytes_max{area="heap", app="ui",kubernetes_pod_name="ui-dep-76b4f95bf4-xcs4s"} - jvm_memory_bytes_used{area="heap", app="ui",kubernetes_pod_name="ui-76b4f95bf4-xcs4s"})[5m:10s])
它每隔 10 秒计算两个指标的差异,然后计算最后 5 分钟差异的平均值。查询使用 Prometheus subquery feature.
我试图在 [5m] 的时间段内减去两个具有相同标签的指标(量表),然后对结果取平均值。
我试过的查询,
avg_over_time(jvm_memory_bytes_max{area="heap", app="ui",kubernetes_pod_name="ui-dep-76b4f95bf4-xcs4s"}[5m] - jvm_memory_bytes_used{area="heap", app="ui",kubernetes_pod_name="ui-76b4f95bf4-xcs4s"}[5m])
avg_over_time(jvm_memory_bytes_max{area="heap", app="ui",kubernetes_pod_name="ui-dep-76b4f95bf4-xcs4s"} - jvm_memory_bytes_used{area="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 将指标缩减为单个值,然后使用算术运算。
我不确定它是否适用,因为我不想对一个指标进行平均然后应用算术函数。但是,我想对不同指标的两个数据点应用算术运算,然后对结果进行平均。
这可能吗?如果是这样,我该怎么做?
实现此功能的一种方法是将内部表达式作为记录规则,然后将 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])
尝试以下查询:
avg_over_time((jvm_memory_bytes_max{area="heap", app="ui",kubernetes_pod_name="ui-dep-76b4f95bf4-xcs4s"} - jvm_memory_bytes_used{area="heap", app="ui",kubernetes_pod_name="ui-76b4f95bf4-xcs4s"})[5m:10s])
它每隔 10 秒计算两个指标的差异,然后计算最后 5 分钟差异的平均值。查询使用 Prometheus subquery feature.