使用请求库的重试历史记录

Dua*_*cho 4 python python-3.x python-requests

我正在我的 Orchestrate 脚本中构建一个新的重试功能,我想知道尝试连接到特定 URL 时我的请求方法发生了多少次,以及(如果可能)发生了什么错误。

现在,我需要这个用于记录目的,因为我正在开发一个消息系统,一旦我在一个消息系统中工作,我可能需要这个“重试”信息来了解我何时以及为何在 HTTP 请求中遇到任何类型的问题。微服务环境。

到目前为止,我调试并证明重试按预期工作(我有一个用于我们使用的所有微服务的模拟烧瓶服务器),但我找不到获取“重试历史记录”数据的方法。

换句话说,例如我想看看某个特定的微服务是否只能在第三个请求之后响应,诸如此类的事情。

下面是我现在使用的代码:

from requests import exceptions, Session
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter

def open_request_session():
    # Default retries configs
    toggle = True #loaded from config file

    session = Session()

    if toggle:

        # loaded from config file as 
        parameters = {'total': 5, 
                      'backoff_factor': 0.0, 
                      'http_error_to_retry': [400]}well

        retries = Retry(total=parameters['total'],
                        backoff_factor=parameters['backoff_factor'],
                        status_forcelist=parameters['http_error_to_retry'],
                        # Do not force an exception when False
                        raise_on_status=False)

        session.mount('http://', HTTPAdapter(max_retries=retries))
        session.mount('https://', HTTPAdapter(max_retries=retries))

    return session

# Request
    with open_request_session() as request:
        my_response = request.get(url, timeout=10)
Run Code Online (Sandbox Code Playgroud)

我在 urllib3文档中看到Retry 有一个历史属性,但是当我尝试查阅该属性时它是空的。

一旦软件开发不是我最好的技能,我不知道我是否做错了或忘记了什么。

所以,我有两个问题:

  1. 有谁知道如何获取此历史信息?
  2. 如何创建测试来验证重试行为是否按预期工作?(到目前为止我只在调试模式下进行测试)

我正在使用Python 3.6.8。

我知道我可以创建一个 while 语句来“控制”它,但我试图避免复杂性。这就是我来这里的原因,我正在寻找基于 Python 和社区最佳实践的替代方案。

loe*_*sak 5

有点晚了,但我自己才发现这一点,所以我想分享我的发现。

简短回答:

response.raw.retries.history
Run Code Online (Sandbox Code Playgroud)

会给你你正在寻找的东西。

长答案:

您无法获取Retry创建的原始实例的历史记录。在幕后,为每次尝试urllib3创建一个新Retry实例。

urllib3Retry当返回时,确实会存储响应中的最后一个实例。但是,来自库的响应requests是响应的包装器urllib3。幸运的是,requests将原始urllib3响应存储在raw现场。