先把当时的情况摆出来。CentOS 7.9 上 node_exporter 1.6 由 systemd 拉起,ss -lntp 显示 9100 在听,Prometheus 上该 target 报 Get http://10.0.0.11:9100/metrics: proxyconnect tcp: dial tcp 127.0.0.1:7890: connect: connection refused。

把日志和配置对完,能解释这个现象的基本就这几处。机器为 yum 和 curl 配了 http_proxy 并写进 /etc/environment,Prometheus 进程直接继承。另一种情况是unit 文件里 Environment= 又带了一份 HTTP_PROXY,restart 后一直生效。

还有一种情况,no_proxy 只写了 localhost,没写 127.0.0.1 和内网段,抓取仍然走代理。

手工复现抓取请求

curl -v http://127.0.0.1:9100/metrics 2>&1 | head -5

再往下绕过代理再测一次

curl --noproxy '*' -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9100/metrics

给服务清掉代理变量

systemctl set-environment no_proxy=localhost,127.0.0.1,10.0.0.0/8

末了重启并确认进程环境

systemctl restart prometheus; tr '\0' '\n' < /proc/$(pgrep prometheus)/environ | grep -i proxy

当时还开着另一个排查窗口,两边日志对照着看才定位到。

同一份数据我导出了两份,一份留底,一份拿来试。

这类问题以前遇到过,但这次的触发条件和上次不一样。

这类改动我都写进变更记录,过两周再出问题时能对上号。

别只看报错消失,验证要多做一步。Prometheus 的 targets 页面该 job 从 DOWN 变 UP,Last scrape 在 15 秒内持续刷新,curl 的 http_code 返回 200。

提醒一点。代理变量对 scrape 的影响很隐蔽,报错里出现 proxyconnect 就不用再查 exporter;内网抓取一律显式配 no_proxy。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189