Grafana中用PromQL获取各服务副本状态单值的问题
解决Grafana表格展示服务副本当前值及30分钟极值问题
问题核心
max_over_time返回多值的原因是:该函数默认会输出时间范围内每个采样点的最大值,而非按服务(deployment)聚合后的单值。需要结合by()聚合函数,确保每个服务只输出一个汇总值。
正确查询写法
针对需求,需创建3个独立查询,分别获取当前值、30分钟最小值和最大值:
- 当前副本数
kube_deployment_status_replicas{deployment=~"$deployment"}
若要避免瞬时波动,也可使用last_over_time取最近1分钟的最后一个值:
last_over_time(kube_deployment_status_replicas{deployment=~"$deployment"}[1m])
- 30分钟最小值
min by (deployment) (min_over_time(kube_deployment_status_replicas{deployment=~"$deployment"}[30m]))
外层的min by (deployment)会将同一个服务的所有时间序列采样值聚合为一个全局最小值。
- 30分钟最大值
max by (deployment) (max_over_time(kube_deployment_status_replicas{deployment=~"$deployment"}[30m]))
同理,外层max by (deployment)聚合出该服务30分钟内的全局最大值。
Grafana表格配置步骤
- 新建Table类型面板,添加上述3个查询,分别为每个查询设置别名(如“当前副本数”“30min最小值”“30min最大值”)。
- 进入Transform选项卡,选择Merge变换,按
deployment字段将三个查询的结果合并。 - 添加时间列:点击Add transformation,选择Calculated field,表达式填写
$__timeNow(),别名设为time;在字段设置中,将显示格式改为“自定义”,输入now。 - 调整列顺序:拖动列头,将
time、deployment(重命名为“metric”)、“当前副本数”(重命名为“pod”)、“30min最小值”、“30min最大值”按期望顺序排列。
最终效果示例
| time | metric | pod | min[30m] | max[30m] |
|---|---|---|---|---|
| now | ms | 5 | 2 | 7 |
内容的提问来源于stack exchange,提问作者LupefiascoMosdef
相关产品推荐
相关产品推荐

