如何编写Prometheus查询获取实例24小时平均内存使用率?
嘿,我来帮你搞定这个查询!首先得理清楚一个关键点:内存使用率和CPU使用率的计算逻辑不太一样——CPU使用率是通过irate计算counter指标的瞬时速率得到的,但内存使用率本身是一个「瞬时值(gauge类型指标)」,所以不需要用irate来处理,直接对瞬时使用率取时间范围内的平均值就可以了。
第一步:先确认你的当前内存使用率查询
假设你当前的内存使用率查询是类似这样的(基于Node Exporter的指标):
100 - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) / node_memory_MemTotal_bytes * 100
这个公式是用「总内存 - 空闲/缓冲/缓存内存」除以总内存,再转成百分比,得到当前的内存使用率。
第二步:计算过去24小时的平均使用率
要得到过去24小时的平均值,只需要用avg_over_time()函数把上面的查询包裹起来,同时指定时间范围和样本步长:
avg_over_time( (100 - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) / node_memory_MemTotal_bytes * 100)[24h:1m] )
这里的[24h:1m]表示:取过去24小时的数据,每1分钟取一个样本点(步长可以根据你的需求调整,比如改成30s会更精确,但数据量也会更大)。avg_over_time()会自动对这些样本点计算平均值,最终返回过去24小时的平均内存使用率。
关于irate的小补充
你提到CPU用了irate,那是因为CPU的核心指标node_cpu_seconds_total是counter类型(只会递增),必须用irate或rate计算速率才能得到使用率。但内存相关的指标(比如node_memory_MemTotal_bytes、node_memory_MemFree_bytes)都是gauge类型(可以上下波动的瞬时值),所以不需要irate来处理。
如果硬要结合irate,那得到的是「内存使用率的瞬时变化率」的平均值(比如使用率每分钟变化了多少百分比),这不是你想要的「平均内存使用率」,所以不推荐这么用。
内容的提问来源于stack exchange,提问作者pdna

