Docker Swarm单副本服务出现多余容器的Prometheus告警配置问题
空服务名告警触发原因
- 当前告警规则未对指标做标签过滤,
container_last_seen会采集宿主机上所有容器的指标,包括非Swarm服务创建的容器(比如手动docker run启动的容器、节点上运行的系统组件容器),这类容器没有container_label_com_docker_swarm_service_name标签,分组聚合时会被统一归到服务名为空的分组下,只要这类容器数量超过1就会触发告警。 - 部分已销毁的容器指标可能还在Prometheus中留存未过期,也会被统计到空服务名分组的计数中。
修复方案
在告警表达式中添加标签过滤规则,直接排除没有服务名标签的指标即可,修改后的告警规则如下:
- alert: too_many_containers_per_service expr: count(container_last_seen{container_label_com_docker_swarm_service_name!=""}) by (container_label_com_docker_swarm_service_name) > 1 for: 2m labels: severity: warning annotations: description: Too many containers of '{{ $labels.container_label_com_docker_swarm_service_name }}' are running simultaneously! summary: Containers duplicate alert for service '{{ $labels.container_label_com_docker_swarm_service_name }}'
如果需要进一步排除已经停止的旧容器残留指标,可以增加时间过滤,仅统计最近5分钟活跃的容器:
expr: count(container_last_seen{container_label_com_docker_swarm_service_name!="", container_last_seen > time() - 300}) by (container_label_com_docker_swarm_service_name) > 1
内容的提问来源于stack exchange,提问作者Pepsko
相关产品推荐
相关产品推荐

