ProxyError,尝试在代理后面查询普罗米修斯时

Posted

技术标签:

【中文标题】ProxyError,尝试在代理后面查询普罗米修斯时【英文标题】:ProxyError, when trying to query prometheus behind the proxy 【发布时间】:2021-12-11 07:06:45 【问题描述】:

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

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

在执行这篇文章底部的代码时,我收到很多错误,其中最后一个是这个:(由于隐私原因,清除了一些值,例如代理服务器、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)

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

对于 Python 请求(例如:#4871、#5000)缺少对 no_proxy 的支持存在一些错误。 目前 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)

【讨论】:

我的真实代码中有正确的代理服务器,但在本例中,出于隐私原因,我将它们删除了。抱歉,我会将其编辑为原始帖子。 好的 :) 我同时添加了一个更完整的答案。 非常感谢您的帮助!我仍然收到错误消息。在你建议的修改之后。我现在尝试使用 .env -variables,并从那里加载代理设置,但没有运气。我开始认为这与外部环境有关,而不是代码或代理本身...继续调查。 这很奇怪,no_proxy 选项似乎被忽略了...所以我看到的唯一选项是通过设置 proxies = None 来禁用本地地址的代理。 @marjakuusi 我的新答案包含一些代码来解决 Python 请求中缺少对 no_proxy 的支持的问题。

以上是关于ProxyError,尝试在代理后面查询普罗米修斯时的主要内容,如果未能解决你的问题,请参考以下文章

普罗米修斯统计查询

grafana 使用基于指标的普罗米修斯查询定义变量

普罗米修斯与正则表达式查询不匹配

加入两个普罗米修斯查询

普罗米修斯获得整数计数

代理错误 502,在 apache2 服务器上运行节点 js 应用程序