如何通过Prometheus获取Kubernetes Pod的运行时长?
Kubernetes Pod运行时长追踪的PromQL修正方案
问题根源
你现在的查询跑不通,主要是两个问题:
or运算符在PromQL里是逻辑或,不是“兜底”逻辑——只要第一个表达式有数据,第二个就不会生效,导致运行中的Pod时长算不出来;sum by完全没必要,单个Pod的启动、结束时间都是单条指标,求和不会有任何变化,反而可能打乱逻辑。
修正后的查询语句
单个Pod的时长查询
max by (namespace, pod) ( (last_over_time(kube_pod_completion_time{pod="<pod_name>", namespace="<namespace>"}[1d]) - last_over_time(kube_pod_created{pod="<pod_name>", namespace="<namespace>"}[1d])) or ignoring() (time() - kube_pod_created{pod="<pod_name>", namespace="<namespace>"}) ) / 60
批量查询(指定Namespace或全集群)
如果不用指定单个Pod,删掉pod="<pod_name>"就行:
max by (namespace, pod) ( (last_over_time(kube_pod_completion_time{namespace="<namespace>"}[1d]) - last_over_time(kube_pod_created{namespace="<namespace>"}[1d])) or ignoring() (time() - kube_pod_created{namespace="<namespace>"}) ) / 60
关键调整点
- 把
or改成or ignoring():忽略指标标签的细微差异,确保Pod终止时用「结束时间-启动时间」,运行中用「当前时间-启动时间」,真正实现兜底逻辑; - 加
max by:保证每个Pod只返回一条结果,避免重复采集导致的多条数据干扰; - 最后除以60:把秒数转成分钟,正好得到你要的
duration=60这种结果。
注意事项
得确保你的Prometheus已经采集了kube-state-metrics的指标——kube_pod_created和kube_pod_completion_time都是这个组件提供的,没装的话先部署它。
内容的提问来源于stack exchange,提问作者trey
相关产品推荐
相关产品推荐

