ProxyError,当试图查询代理后面的普罗米修斯时

ProxyError, when trying to query prometheus behind the proxy

我正在编写一个需要查询 Prometheus 功能的模块,此时 Prometheus 位于代理后面,而模块正在从我的本地环境进行查询。我的开发环境在虚拟机中,具有正确的环境变量和 DNS 设置,并且能够与代理后面的 Prometheus 通信,例如访问前端 GUI。

我已经测试了我的 requests.get() 方法,当它在代理后面的网络上执行时它返回了正确的值,所以我非常肯定代理导致了问题,因为出于某种原因,我没有让程序尊重我为请求提供的代理字典。我正在使用 Visual Studio 代码和 Python 3.9.7.

当执行这个post底部的代码时,我得到了很多错误,其中最后一个是这个:(清除了一些值,例如代理服务器,url 并查询出来,由于隐私原因,它们在我的代码中是正确的和就地的)

requests.exceptions.ProxyError: HTTPSConnectionPool(host='', port=443): Max retries exceeded with url: / (Caused by ProxyError('Cannot connect to proxy.', RemoteDisconnected('Remote end closed connection without response')))

相关Python代码:

    import requests
    import json

    http_proxy  = ''
    https_proxy = ''
    ftp_proxy   = ''

    proxies = { 
                "http"  : http_proxy, 
                "https" : https_proxy, 
                "ftp"   : ftp_proxy
                }

    headers = {
       'Content-Type': 'application/json',
    }
    
    response = requests.get(url='' + '/api/v1/query', verify=False, headers=headers, proxies=proxies, params={'query': ''}).text
    j = json.loads(response)
    print(j)

非常感谢任何帮助!

关于 no_proxy 对 Python 请求(例如:#4871, #5000)的缺失或错误支持,有几个未解决的错误。 目前 AFAICS 唯一的解决方案是在如下函数中编写缺失的逻辑:

import json
import requests
import tldextract  

http_proxy  = "http://PROXY_ADDR:PROXY_PORT"
https_proxy = "http://PROXY_ADDR:PROXY_PORT"
no_proxy    = "example.net,.example.net,127.0.0.1,localhost"

def get_url(url, headers={}, params={}):
    ext = tldextract.extract(url)
    proxy_exceptions = [host for host in no_proxy.replace(' ', '').split(',')]

    if (ext.domain in proxy_exceptions
        or '.'.join([ext.subdomain, ext.domain, ext.suffix]) in proxy_exceptions
        or '.'.join([ext.domain, ext.suffix]) in proxy_exceptions):
        proxies = {}
    else:
        proxies = {
            "http"  : http_proxy,
            "https" : https_proxy,
        }

    response = requests.get(url=url,
                            verify=False,
                            headers=headers,
                            params=params,
                            proxies=proxies)
    return response

url = "https://example.net/api/v1/query"
headers = {
    'Content-Type': 'application/json',
}

response = get_url(url, headers)
j = json.loads(response.text)
print(j)