【问题标题】:How can I alert for container restarted?如何提醒容器重新启动?
【发布时间】:2017-01-03 21:48:00
【问题描述】:

我喜欢使用 Prometheus 和 cAdvisor 监控容器,以便在容器重新启动时收到警报。我想知道是否有人对此有示例 Prometheus 警报。

【问题讨论】:

    标签: prometheus cadvisor


    【解决方案1】:

    我使用下面的 Prometheus 警报规则来查找容器在一小时内重启(可以修改为最大时间),它可能对您有所帮助。

    Prometheus 警报规则示例

    ALERT ContainerRestart/PodRestart
    IF rate(kube_pod_container_status_restarts[1h]) * 3600 > 1
    FOR 5s
    LABELS {action_required = "true", severity="critical/warning/info"}
    ANNOTATIONS {DESCRIPTION="Pod {{$labels.namespace}}/{{$labels.pod}} restarting more than once during last one hours.",
    SUMMARY="Container {{ $labels.container }} in Pod {{$labels.namespace}}/{{$labels.pod}} restarting more than once times during last one hours."}
    

    rate()

    rate(v range-vector) 计算范围向量中时间序列的每秒平均增长率。单调性的中断(例如由于目标重新启动而导致的计数器重置)会自动调整。此外,计算推断到时间范围的末端,允许错过刮擦或刮擦周期与该范围的时间段的不完美对齐。 以下示例表达式返回在过去 5 分钟内测量的 HTTP 请求的每秒速率,范围向量中的每个时间序列:

    rate(http_requests_total{job="api-server"}[5m])
    

    rate 只能与计数器一起使用。它最适合用于警报和缓慢移动计数器的图形。

    请注意,当将 rate() 与聚合运算符(例如 sum())或随时间聚合的函数(任何以 _over_time 结尾的函数)结合使用时,始终先使用 rate(),然后再进行聚合。否则 rate() 无法在目标重新​​启动时检测到计数器重置。

    kube_pod_container_status_restarts_total
    

    指标类型:计数器

    标签/标签: container=container-name, namespace=pod-namespace,pod=pod-name

    说明:每个 pod 的容器重启次数

    【讨论】:

    • 仅供参考,如果您打算使用rate(...[1h]) * 3600,您可以使用相同的号码使用delta(...[1h])
    • 尝试相同,但由于这里不存在kube_pod_container_status_restarts,所以我使用kube_pod_container_status_restarts_total。意思一样吗?
    【解决方案2】:

    如果您在 Kubernetes 中运行,您可以部署发布 pod 重启指标的 kube-state-metrics 容器:https://github.com/kubernetes/kube-state-metrics

    【讨论】:

    【解决方案3】:

    我使用 Compose 和 Swarm 部署,因此无法选择 Kubernetes 答案。所以我来到了这个规则。

    - alert: Container (Compose) Too Many Restarts
      expr: count by (instance, name) (count_over_time(container_last_seen{name!="", container_label_restartcount!=""}[15m])) - 1 >= 5
      for: 5m
      annotations:
        summary: "Too many restarts ({{ $value }}) for container \"{{ $labels.name }}\""
    
    - alert: Container (Swarm) Too Many Restarts
      expr: count by (instance, container_label_com_docker_swarm_service_name) (count_over_time(container_last_seen{container_label_com_docker_swarm_service_name!=""}[15m])) - 1 >= 5
      for: 5m
      annotations:
        summary: "Too many restarts ({{ $value }}) for container \"{{ $labels.container_label_com_docker_swarm_service_name }}\""
    

    基本上,两者的工作方式相同。每个服务有多个记录,但标签不同。

    • 除了container_label_restartcount标签之外,写的都是一样的

      {instance="instance1",name="service1",container_label_restartcount="1",...}
      {instance="instance1",name="service1",container_label_restartcount="2",...}
      {instance="instance1",name="service1",container_label_restartcount="3",...}
      
    • Swarm 看起来有点不同,因为在重新启动服务时会创建新容器(例如,从失败的健康检查)。 name 标签被更改,container_label_com_docker_swarm_service_name 充当服务名称。

      {instance="instance1",name="service1.1.<hash1>",container_label_com_docker_swarm_service_name="service1",...}
      {instance="instance1",name="service1.1.<hash2>",container_label_com_docker_swarm_service_name="service1",...}
      {instance="instance1",name="service1.1.<hash3>",container_label_com_docker_swarm_service_name="service1",...}
      

    所以这个想法只是计算每个实例和名称的唯一记录。我个人认为每次重启都发送警报是错误的并且没有用。如果在15m 期间有超过5 重新启动,我选择发出警报。在我的规则中,我随机使用了container_last_seen 度量,这实际上并不重要,因为计数是通过标签的差异来完成的。我们只需要一个持久的指标。另外,请注意表达式末尾的- 1。我们必须子结构1,因为我们正在计算唯一记录,所以如果您的容器正在运行,那么总是至少有一个。

    您可能需要针对具有多个副本的 swarm 服务调整此示例,但您知道如何计算唯一标签。

    【讨论】:

    • 你有 docker-compose 吗?我想使用与使用 compose 相同的方法。 Kubernetes 规则对我没有帮助
    • 你在说什么 docker-compose?我在答案中提供了 compose/swarm 部署的普罗米修斯规则。在您的 prometheus 实例上检查并调整它们。
    • 抱歉,我想说的是 cadvisor 没有公开“container_label_restartcount”的指标。我检查了 Prometheus 的“container_last_seen”指标没有“container_label_restartcount”标签。你能重新检查一下吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2020-01-21
    • 2017-01-10
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多