当 Pod 运行时间过长时 Prometheus 发出警报

Pau*_*anu 4 docker grafana kubernetes prometheus

对于一个看似简单的问题,我遇到了一些麻烦。

我的场景:我有一个可以随时运行的 k8s 作业(不是 cronJob),它又创建一个 pod 来执行某些任务。一旦 pod 执行了它的任务,它就完成了,从而完成了产生它的工作。

我想要的:如果 pod 处于运行状态超过 1 小时,我想通过 prometheus 发出警报,表明该任务花费了太多时间。我有兴趣仅在附图中箭头所示的持续时间超过 1 小时时发出警报。当 Pod 不再运行时也不会触发警报。在此输入图像描述

我尝试过的:以下普罗米修斯指标,它是一个即时向量,可以是 0(pod 未运行)或 1(pod 正在运行):

kube_pod_status_ready{condition="true",pod_name=~".+POD-A.+"}
Run Code Online (Sandbox Code Playgroud)

我想我尝试使用此指标和以下公式来计算该指标在一天中为一的持续时间

(1 - avg_over_time(kube_pod_status_ready{condition="true",pod_name=~".+POD-A.+"}[1d])) * 86400 > 3600
Run Code Online (Sandbox Code Playgroud)

由于这些 Pod 来来去去,并不总是存在,所以我遇到了以下问题:

  • 上面的 expr 从 86400 值开始,最终在容器运行时下降,这将触发警报
  • Pod 最终消失,我不想为不再运行的 Pod 发送虚假警报(尽管它们运行了 1 个小时以上)

Pau*_*anu 5

感谢@HelloWorld的建议,我认为这将是实现我想要的最佳解决方案:

(sum_over_time(kube_pod_status_ready{condition="true",pod_name=~".+POD-A.+"}[1d:1s]) > 3600) and (kube_pod_status_ready{condition="true",pod_name=~".+POD-A.+"}==1)
Run Code Online (Sandbox Code Playgroud)
  • 计算 pod 在过去一天/6 小时/3 小时内运行的次数,并验证是否超过 1 小时(3600 秒)并且
  • 检查 pod 是否仍在运行 - 这样就不会考虑旧的 pod 或 pod 是否终止。