Grafana配置Prometheus数据源时获取空响应问题求助
问题:Grafana无法连接Prometheus数据源(返回empty response)
我通过以下Docker Compose配置启动Prometheus、Alertmanager和Grafana:
version: '3.9' services: prometheus: build: ~/programming/tools/prometheus-2.39.1.linux-amd64 ports: - "9090:9090" alertmanager: build: ~/programming/tools/prometheus-2.39.1.linux-amd64/alertmanager ports: - "9093:9093" grafana: image: grafana/grafana ports: - 3000:3000
现象
- Grafana容器内部可以ping通Prometheus容器
- 在Grafana UI配置Prometheus数据源时,日志返回错误:
grafana_1 | logger=context userId=1 orgId=1 uname=admin t=2022-12-02T06:33:08.707608032Z level=error msg="Internal server error" error="[plugin.downstreamError] failed to query data: received empty response from prometheus" remote_addr=172.18.0.1 traceID=
- 已在
~/.docker/config.json配置代理,但添加MySQL容器后可正常配置MySQL数据源
可能的解决方法
1. 确保Prometheus监听容器内所有网络接口
Prometheus默认可能仅绑定127.0.0.1,导致容器内其他服务无法访问。修改Prometheus配置文件prometheus.yml,添加或修改监听地址:
global: scrape_interval: 15s # 新增或确认该配置 web.listen-address: 0.0.0.0:9090 scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090']
同时确保Dockerfile中启动命令正确加载配置:
FROM scratch COPY prometheus prometheus.yml / EXPOSE 9090 CMD ["/prometheus", "--config.file=/prometheus.yml"]
2. 配置Grafana跳过内部服务代理
Docker全局代理会影响容器内所有请求,而Grafana与Prometheus的通信属于Docker内部网络请求,无需走代理。在docker-compose.yml中给Grafana添加环境变量:
grafana: image: grafana/grafana ports: - 3000:3000 environment: - NO_PROXY=prometheus,localhost,127.0.0.1 - no_proxy=prometheus,localhost,127.0.0.1
或者修改Grafana配置文件grafana.ini:
[proxy] exclude = prometheus
3. 使用Docker服务名作为数据源地址
在Grafana配置Prometheus数据源时,不要填写localhost:9090,而是直接使用Docker Compose中定义的服务名prometheus:9090——Docker内部网络会自动通过服务名解析到对应容器IP。
4. 验证Prometheus自身是否正常提供数据
进入Prometheus容器,执行命令检查是否能返回指标数据:
curl http://localhost:9090/metrics
如果返回空内容,说明Prometheus启动或配置存在问题,需要查看其容器日志排查。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

