我想要为给定的instance创建一个图,显示以下每一个内存消耗的总内存的比例
node_memory_MemFree_bytes{instance="$instance"}node_memory_MemAvailable_bytes{instance="$instance"}node_memory_Buffers_bytes{instance="$instance"}node_memory_Cached_bytes{instance="$instance"}我知道我可以从4个单独的查询中创建一个图,其中每个度量都被node_memory_MemTotal_bytes{instance="$instance"}除以
node_memory_MemFree_bytes{instance="$instance"} / node_memory_MemTotal_bytes{instance="$instance"}node_memory_MemAvailable_bytes{instance="$instance"} / node_memory_MemTotal_bytes{instance="$instance"}node_memory_Buffers_bytes{instance="$instance"} / node_memory_MemTotal_bytes{instance="$instance"}node_memory_Cached_bytes{instance="$instance"} / node_memory_MemTotal_bytes{instance="$instance"}我觉得应该有一种更简单的方法来处理group_left,因为每个查询的右侧都是相同的,左手可以简化为一个查询:
{__name__=~"node_memory_(MemFree|MemAvailable|Buffers|Cached)_bytes",instance="$instance"}node_memory_MemTotal_bytes{instance="$instance"}如果我正确地理解了“操作员”文件和这篇博客文章,我应该能够在一个查询中使用group_left来完成这个任务。然而,我一直无法做到这一点。
我的推理是,由于方程的左、右有完全相同的标签(不包括__name__ ),所以不需要对group_left操作符使用ignoring或on:
{__name__=~"node_memory_(MemFree|MemAvailable|Buffers|Cached)_bytes",instance="$instance"}
/
on() group_left node_memory_MemTotal_bytes{instance="$instance"}这个查询给出了一个错误:
"multiple matches for labels: grouping labels must ensure unique matches"如果我使用ignoring()或on(<labels>)和ignoring(<labels>)的任何其他组合,情况也是如此。我无法理解我在这里所缺少的东西,左派和右派之间没有相同的__name__是个问题吗?我是不是不正确地处理这个问题?
在使用函数的Graphite中,这个操作非常简单,当然,我也可以对PromQL做同样的操作。
任何帮助都将不胜感激,谢谢。
发布于 2022-01-16 08:39:10
PromQL在匹配二进制运算符(如/ )的左侧和右侧的时间序列之前,先剥去度量名称--参见这些医生。在您的示例中,左侧的时间序列仅通过度量名称不同,因此PromQL看到的序列在左侧有相同的标签集。解决方案是在应用/运算符之前将左侧时间序列的度量名称复制到另一个标签中,然后在/操作期间忽略该标签。这可以通过加入或替换函数来完成:
label_join({__name__=~"node_memory_(MemFree|MemAvailable|Buffers|Cached)_bytes",instance="$instance"}, "metric_name", "", "__name__")
/
ignoring(metric_name) group_left() node_memory_MemTotal_bytes{instance="$instance"}https://stackoverflow.com/questions/70690645
复制相似问题