【问题标题】:Prometheus alerting when a pod is running for too long当 Pod 运行时间过长时,Prometheus 会发出警报
【发布时间】:2020-09-22 08:55:56
【问题描述】:

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

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

我想要的: 如果 pod 处于运行状态超过 1 小时,我想通过 prometheus 发出警报,表明任务花费了太多时间。 仅当附图中箭头表示的持续时间超过 1 小时时,我才有兴趣提醒。当 pod 不再运行时也不会触发任何警报。

我尝试了什么: 以下 prometheus 度量,它是一个即时向量,可以是 0(pod 未运行)或 1(pod 正在运行):

kube_pod_status_ready{condition="true",pod_name=~".+POD-A.+"}

我想我尝试将此指标与以下公式一起用于计算指标为一天中的持续时间

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

因为这些 pod 来来去去,并不总是存在,所以我遇到了以下问题:

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

【问题讨论】:

  • 你可以试试这个:sum_over_time(kube_pod_status_ready{condition="true",pod_name=~".+POD-A.+"}[1h:1s]) == 3600 吗?
  • @HelloWorld 谢谢。这看起来是迄今为止最好的解决方案。我将对此发表完整的答案。

标签: docker kubernetes prometheus grafana


【解决方案1】:

感谢@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)
  • 计算过去一天/6h/3h 中 Pod 运行的次数,并验证是否超过 1h(3600s) 和
  • 检查 pod 是否仍在运行 - 这样它就不会考虑旧的 pod 或 pod 是否终止。

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2021-05-27
    • 2021-12-23
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多