三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Grafana 连接 Prometheus 数据源报错 Bad Gateway 502 如何处理

Grafana 连接 Prometheus 数据源报错 Bad Gateway 502 如何处理

502 错误通常意味着 Grafana 服务器无法从 Prometheus 收到有效响应,优先检查 Prometheus 服务状态和网络连通性,特别是中间代理的超时配置。

先说结论:多数情况是网络不通、Prometheus 服务不可用或代理超时,先排查基础连通性再调整配置。

  • 确认 Prometheus 服务是否正常运行且端口可访问
  • 检查 Grafana 数据源配置中的 URL 地址是否受容器网络隔离影响
  • 若存在 Nginx 或 Ingress,需调整代理超时时间
  • 生产环境切勿随意关闭 TLS 验证或暴露 9090 端口

命令速用版

在 Grafana 所在的服务器上执行以下命令,快速判断网络和服务状态(注意替换容器名称):

# 查找容器名称(避免硬编码)
docker ps | grep -E "grafana|prometheus"# 检查 Prometheus 服务进程
systemctl status prometheus# 测试网络连通性(替换为实际 IP 和端口)
curl -I http://<prometheus-ip>:9090/-/healthy# 查看 Grafana 日志(先获取容器 ID)
docker logs $(docker ps -q -f name=grafana)
# 或 systemd 服务
journalctl -u grafana-server -f

为什么会这样

HTTP 502 Bad Gateway 表示网关或代理服务器从上游服务器收到了无效响应。在 Grafana 和 Prometheus 的架构中,Grafana 作为客户端向 Prometheus 发起请求。如果中间有 Nginx、Ingress 等反向代理,或者 Grafana 自身的后端代理无法获取 Prometheus 的有效响应,就会返回 502。

常见原因包括 Prometheus 服务崩溃、网络防火墙拦截、容器网络隔离导致 IP 不可达,或者查询耗时过长导致中间代理超时。

分步处理

1. 确认 Prometheus 服务状态
登录到 Prometheus 所在的服务器,确认进程正在运行且监听端口正常。如果是容器部署,检查容器是否处于 Restarting 或 Exited 状态。

2. 检查数据源配置 URL
进入 Grafana 页面,找到 Configuration > Data sources > Prometheus。检查 URL 地址:

  • 容器网络隔离:容器内访问宿主机服务避免使用 localhost,应使用宿主机 IP、Docker 网络名或 host.docker.internal。
  • 如果跨机器,确保填写的是 Prometheus 服务器的内网 IP,而不是容器内部 IP。
  • 确认 http/https 协议是否与 Prometheus 实际配置一致。

3. 排查中间代理(重点)
如果 Grafana 和 Prometheus 之间有 Nginx 或 Kubernetes Ingress,检查代理日志。确认代理是否配置了正确的超时时间,有时默认超时时间过短会导致长查询被切断。

Nginx 配置示例:

location /prometheus/ {proxy_pass http://prometheus_upstream;proxy_read_timeout 300s;  # 增加读取超时时间proxy_send_timeout 300s;
}

Kubernetes Ingress 注解示例:

metadata:annotations:nginx.ingress.kubernetes.io/proxy-read-timeout: "300"nginx.ingress.kubernetes.io/proxy-send-timeout: "300"

4. 查看 Grafana 后端日志
502 错误通常会在 Grafana 服务端日志中留下更详细的错误信息,比如 connection refused 或 timeout。根据日志提示调整防火墙或安全组规则。

怎么验证是否生效

在 Grafana 数据源配置页面,点击底部的 Save & Test 按钮。如果显示 Data source is working,说明连通性已恢复。随后打开一个包含 Prometheus 数据的 Dashboard 面板,确认图表能正常加载且无 error 提示。

若使用配置文件 provisioning 数据源,可参考以下 JSON 片段检查配置:

{"apiVersion": 1,"datasources": [{"name": "Prometheus","type": "prometheus","url": "http://prometheus:9090","access": "proxy","isDefault": true}]
}

常见坑与安全建议

容器网络隔离:如果 Grafana 和 Prometheus 分别运行在不同的 Docker 网络或 K8s Namespace 中,直接使用容器名可能无法解析,需使用 Service 名称或完整域名。

自签名证书:如果 Prometheus 开启了 HTTPS 且使用自签名证书,Grafana 默认会校验证书。测试环境可临时关闭 TLS 验证,生产环境建议导入可信证书或配置 CA 根证书,避免中间人攻击风险。

防火墙与安全组:云服务器环境中,即使服务正常,安全组未放行 9090 端口也会导致连接被拒绝,进而引发网关错误。

安全风险提示:Prometheus 默认无认证机制,切勿将 9090 端口直接暴露在公网。建议通过内网访问,或在 Nginx 层配置基本认证(Basic Auth)进行隔离。

原文链接:https://www.zjcp.cc/ask/11406.html

← 返回列表