Prometheus无法抓取StatsD Exporter指标问题排查求助(Docker+k6+Prometheus+StatsD环境)
看起来你的核心问题是Prometheus没有加载你自定义的配置文件,导致statsd_exporter的抓取任务没被添加进去,咱们一步步来排查和解决:
问题根源分析
你提到Prometheus的实际配置里没有statsd_exporter的抓取任务,而是用了默认配置,这说明你挂载的自定义prometheus.yml没有被Prometheus容器正确加载。大概率是挂载路径错误、文件不存在或者权限问题导致的。
第一步:验证本地配置文件的存在性与路径
先确认你在执行docker compose up的目录下,确实存在./loadtesting/prometheus.yml文件。可以在终端执行:
ls loadtesting/prometheus.yml
如果返回No such file or directory,说明你要么放错了文件位置,要么执行docker compose up的目录不对(比如你在父目录的子文件夹里执行,而loadtesting在父目录)。
第二步:检查Prometheus容器的日志
查看Prometheus容器的启动日志,确认是否有加载配置文件的报错:
docker logs prometheus
如果日志里出现类似level=error ts=... caller=main.go:xx msg="Error loading config file" file=/etc/prometheus/prometheus.yml err="open /etc/prometheus/prometheus.yml: no such file or directory",那就是挂载路径完全不对;如果是权限相关的错误,可能需要调整本地文件的权限:
chmod +r loadtesting/prometheus.yml
第三步:修复Docker Compose中的Prometheus挂载配置
确保你的挂载路径正确,并且可以显式指定Prometheus的启动命令来强制加载自定义配置。修改Docker Compose中prometheus服务的部分:
prometheus: image: prom/prometheus container_name: prometheus ports: - 9090:9090 volumes: - ./loadtesting/prometheus.yml:/etc/prometheus/prometheus.yml # 显式指定加载自定义配置文件,避免使用默认配置 command: --config.file=/etc/prometheus/prometheus.yml
第四步:重启服务并验证
先停止所有服务:
docker compose down
然后重新启动:
docker compose up -d
之后访问http://localhost:9090/config,查看页面中的配置是否包含statsd_exporter的抓取任务。如果有,再去「Status→Targets」页面,应该就能看到statsd_exporter的目标了。
额外推荐:更简便的k6接入Prometheus方案
你提到用StatsD中转,其实现在k6支持直接通过Prometheus Remote Write输出指标,不需要经过StatsD Exporter,步骤更简单:
- 修改k6服务的command和环境变量:
k6: image: "loadimpact/k6:0.32.0" command: ["run", "/scripts/K6-script.js", "-q", "-o", "experimental-prometheus-rw"] depends_on: - prometheus environment: K6_PROMETHEUS_RW_SERVER_URL: "http://prometheus:9090/api/v1/write" K6_PROMETHEUS_RW_TREND_AS_HISTOGRAM: "true" K6_PROMETHEUS_RW_PUSH_INTERVAL: 1s volumes: - "./loadtesting:/scripts"
- 确保Prometheus的配置里开启了remote write接收(默认是开启的,不需要额外配置),这样k6的指标就会直接写入Prometheus,省去StatsD中转的环节,配置更简洁。
最后验证StatsD Exporter与Prometheus的通信
如果修复配置后还是看不到目标,可以进入Prometheus容器内部,尝试ping statsd_exporter:
docker exec -it prometheus ping statsd_exporter
如果能ping通,说明网络没问题;如果ping不通,检查Docker Compose的网络设置(默认会创建一个自定义网络,所有服务都在同一个网络里,应该能互通)。
内容的提问来源于stack exchange,提问作者Jay

