如何用Prometheus计算实例时段平均CPU使用率并生成Grafana表格
解决Prometheus计算指定时段实例平均CPU使用率并生成Grafana表格的问题
没问题,我来帮你搞定这个需求!先从核心的Prometheus查询语句入手,再一步步讲Grafana的配置,保证你能快速生成想要的表格。
一、Prometheus查询语句编写
假设你用的是node_exporter采集的CPU指标(如果是自定义 exporter,替换成你的对应指标即可),要计算指定时间段内每个实例的平均CPU使用率,可以用下面的查询:
avg_over_time( (1 - sum by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) / sum by (instance) (rate(node_cpu_seconds_total[1m]))) * 100 [$__range] )
我拆解下这个查询的逻辑,方便你理解和调整:
rate(node_cpu_seconds_total{mode="idle"}[1m]):计算每个CPU核空闲时间的每秒增量,1m的窗口是为了平滑短时间波动,你可以根据自己的指标采集间隔调整(比如采集间隔15s的话,用30s窗口也可以)sum by (instance):把同一个实例下所有CPU核的空闲速率汇总,得到整个实例的总空闲CPU占比- 除以
sum by (instance) (rate(node_cpu_seconds_total[1m]))(整个实例的总CPU时间速率),得到空闲CPU的比例 1 - 空闲比例再乘100,就得到该实例的瞬时CPU使用率- 最外层的
avg_over_time(...)[$__range]:对Grafana当前选择的整个时间段内的瞬时使用率取平均,最终得到每个实例在这段时间的单一平均使用率值
这里的$__range是Grafana的内置变量,会自动匹配你在时间选择器里选的时间段(比如最近3小时),不用手动修改时间范围,非常灵活。
如果你的实例不是用instance标签区分的(比如K8s里用pod或hostname),只需要把sum by (instance)改成对应的标签即可,比如sum by (pod)。
二、Grafana表格配置步骤
有了查询语句,接下来在Grafana里配置表格:
- 新建一个Table面板(或者编辑现有面板)
- 切换到
Query标签页,数据源选择你的Prometheus实例,把上面的查询语句粘贴进去 - (可选)给查询设置别名:比如在查询的
Alias输入框里填$instance,这样表格里的实例列会直接显示实例名,更直观 - 切换到
Panel options标签页,你可以调整表格的显示样式:- 在
Column styles里,把数值列的格式改成Percent,或者保留数字并添加%后缀 - 调整列的宽度、排序方式,比如按平均CPU使用率从高到低排序
- 在
- 最后在Grafana顶部的时间选择器里选你需要的时间段(比如最近3小时),表格就会自动加载每个实例的平均CPU使用率了
注意事项
- 确保你的Prometheus已经正确采集到CPU指标,比如
node_exporter是否正常运行,指标是否能在Prometheus UI里查询到 - 如果查询结果出现空值,检查
rate的窗口是否太小(比如窗口小于2倍的采集间隔,会导致rate无法计算),可以适当调大窗口时间 - 如果需要排除某些实例,直接在查询的指标标签里添加过滤条件,比如
node_cpu_seconds_total{mode="idle", instance!="xxx:9100"}
内容的提问来源于stack exchange,提问作者Ivan Savcic
相关产品推荐
相关产品推荐

