Docker部署的Prometheus无法采集主机JMeter 9270端口指标
已搭建包含cadvisor、Prometheus、Grafana的Docker监控栈,希望集成运行在主机上的JMeter。JMeter将指标推送到localhost:9270/metrics,但Docker容器中的Prometheus无法访问该地址。尝试将目标IP改为docker0网关IP 172.17.0.1 以及Ubuntu虚拟机eth0的IP 10.211.55.5,均无效果。
现有配置文件
docker-compose.yml
version: "3.9" services: cadvisor: image: gcr.io/cadvisor/cadvisor:v0.47.1 platform: linux/aarch64 container_name: cadvisor privileged: true devices: - /dev/kmsg:/dev/kmsg volumes: - /:/rootfs:ro - /var/run:/var/run:ro - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro - /dev/disk:/dev/disk:ro - /var/run/docker.sock:/var/run/docker.sock:ro - /cgroup:/cgroup:ro - /etc/machine-id:/etc/machine-id:ro expose: - "8080" ports: - "8005:8080" networks: - monitoring prometheus: image: prom/prometheus container_name: prometheus volumes: - ./docker/prometheus/:/etc/prometheus/ - prometheus-data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/console' - '--storage.tsdb.retention=200h' expose: - 9090 ports: - "9090:9090" networks: - monitoring grafana: image: grafana/grafana container_name: grafana volumes: - grafana-data:/var/lib/grafana expose: - 3000 ports: - "3000:3000" networks: - monitoring volumes: app: dbData: prometheus-data: {} grafana-data: {} networks: monitoring: driver: bridge
prometheus.yml
scrape_configs: - job_name: 'cadvisor' scrape_interval: 5s static_configs: - targets: ['cadvisor:8080'] - job_name: 'prometheus' scrape_interval: 10s static_configs: - targets: ['localhost:9090'] - job_name: 'jmeter' static_configs: - targets: ['172.17.0.1:9270']
1. 修改JMeter的监听地址
JMeter默认绑定localhost时,仅允许主机本地进程访问,Docker容器无法连接。需修改JMeter的Prometheus插件配置,将监听地址改为0.0.0.0,让服务绑定所有可用网卡:
- 找到JMeter的Prometheus插件配置(通常对应
jmeter-plugins-prometheus-listener-*.jar的设置项) - 设置
hostname为0.0.0.0,端口保持9270 - 重启JMeter服务
2. 检查主机防火墙/安全组规则
Ubuntu主机的防火墙(如ufw)可能拦截了Docker容器对9270端口的访问,需添加允许规则:
# 允许Docker默认网桥网段访问9270端口 sudo ufw allow from 172.17.0.0/16 to any port 9270 # 先查询自定义monitoring网络的子网:docker network inspect monitoring | grep Subnet # 允许自定义网络网段访问9270端口 sudo ufw allow from <monitoring_subnet> to any port 9270
执行后重启ufw:sudo ufw reload
3. 验证容器到主机的连通性
进入Prometheus容器,直接测试与主机IP的连通性,排查网络链路问题:
# 进入Prometheus容器 docker exec -it prometheus /bin/sh # ping主机eth0的IP 10.211.55.5,确认网络可达 ping 10.211.55.5 # 测试9270端口是否可访问 telnet 10.211.55.5 9270 # 或直接请求metrics端点 curl http://10.211.55.5:9270/metrics
如果ping不通,检查主机网络配置;如果telnet/curl失败,在主机上确认JMeter的监听状态:
sudo netstat -tulpn | grep 9270 # 正常输出应包含0.0.0.0:9270或10.211.55.5:9270
4. 调整Prometheus的网络模式(可选)
如果自定义bridge网络存在访问限制,可将Prometheus改为使用主机网络模式(注意避免端口冲突):
修改docker-compose.yml中prometheus服务的配置,添加network_mode: host并移除原有的networks配置:
prometheus: image: prom/prometheus container_name: prometheus volumes: - ./docker/prometheus/:/etc/prometheus/ - prometheus-data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/console' - '--storage.tsdb.retention=200h' network_mode: host
修改后重启Prometheus容器,此时Prometheus可直接使用localhost:9270作为JMeter的target地址。
5. 确认Prometheus配置生效
修改prometheus.yml后,需重启Prometheus容器使配置生效:
docker restart prometheus
访问Prometheus的Targets页面(http://localhost:9090/targets),查看jmeter job的状态,根据错误提示进一步排查(如connection refused、timeout等)。
内容的提问来源于stack exchange,提问作者akanesora

