You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Grafana Agent采集已停止的Docker容器?

问题

使用Grafana Agent的Prometheus docker_sd_config配置采集Docker容器时,仅能采集运行中的容器,无法发现已停止的容器,导致无法触发对应告警。不想用static_config手动维护容器列表,希望通过服务发现实现需求。

现有配置及环境信息如下:

采集配置

configs:
  - name: agent
    scrape_configs:
    - job_name: docker
      metrics_path: '/prometheus'
      docker_sd_configs:
        - host: unix:///var/run/docker.sock
      relabel_configs:
        - source_labels: [__meta_docker_port_private]
          regex: '8081'
          action: keep
        - source_labels: ['__meta_docker_container_name']
          regex: '/(.*)'
          target_label: 'job'

告警规则

- alert: ServerDown
  expr: up{} < 1
  for: 15m
  annotations:
    summary: Server down

当前容器状态

f8070378f38b   gitlab.mycomp.com:5005/test/my-app1:latest    "java -jar app.jar"      2 weeks ago     Up 12 hours (healthy)        0.0.0.0:8205->8081/tcp, :::8205->8081/tcp                                                                                                                 my-app1
c4a5042b9fcf   gitlab.mycomp.com:5005/test/my-app2:latest    "java -jar app.jar"      2 weeks ago     Exited (143) 40 seconds ago                                                                                                                                                             my-app2
解决方案

1. 修改Docker服务发现配置,包含已停止容器

默认docker_sd_configs仅发现running状态的容器,需添加filters参数指定包含exited状态的容器:

docker_sd_configs:
  - host: unix:///var/run/docker.sock
    filters:
      - name: status
        values: ["running", "exited"]

2. 调整Relabel规则,避免过滤已停止容器

原配置中通过__meta_docker_port_private=8081的规则保留容器,但已停止的容器无端口元数据,会被过滤。需根据业务场景调整relabel逻辑:

  • 方案一:基于容器名称/镜像筛选
    如果目标容器有统一命名或镜像规则,可替换端口筛选逻辑:
    relabel_configs:
      # 保留名称匹配my-app前缀的所有容器(运行中和已停止)
      - source_labels: [__meta_docker_container_name]
        regex: '/my-app.*'
        action: keep
      - source_labels: ['__meta_docker_container_name']
        regex: '/(.*)'
        target_label: 'job'
    
  • 方案二:混合筛选(运行容器按端口+已停止容器全保留)
    若需同时保留运行时带8081端口的容器,以及所有已停止容器:
    relabel_configs:
      # 保留运行中且私有端口为8081的容器
      - source_labels: [__meta_docker_container_status, __meta_docker_port_private]
        regex: 'running;8081'
        action: keep
      # 保留所有已停止的容器
      - source_labels: [__meta_docker_container_status]
        regex: 'exited'
        action: keep
      - source_labels: ['__meta_docker_container_name']
        regex: '/(.*)'
        target_label: 'job'
    

3. 验证告警触发逻辑

已停止容器被服务发现后,Grafana Agent尝试采集时会失败,对应的up指标会变为0,满足告警规则up{} <1,等待15分钟后会触发ServerDown告警。

注意事项
  • 添加status=exited筛选后,需定期清理长期停止的无用容器,避免服务发现列表冗余。
  • 调整relabel规则时,需确保逻辑符合业务监控范围,避免引入无关容器。

内容的提问来源于stack exchange,提问作者dur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:44:53