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

2022-02-22 00:00:00 python python-3.x python-requests

问题描述

我正在我的编排脚本中构建一个新的重试功能,我想知道我的请求方法在尝试连接到特定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)

我在urllib3documentation中看到重试有一个历史记录属性,但当我尝试参考该属性时,它是空的。

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

因此,我有两个问题:

  1. 有人知道获取此历史记录信息的方法吗?
  2. 如何创建测试以验证重试行为是否按预期工作?(到目前为止,我只在调试模式下测试)

我使用的是Python 3.6.8。

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


解决方案

有点晚,但我自己刚刚发现这一点,所以我想我应该分享我的发现。

简短回答:

response.raw.retries.history

将为您提供您需要的内容。

详细答案:

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

urllib3在返回响应时,会将最后一个Retry实例存储在响应上。但是,来自requests库的响应是urllib3响应的包装器。幸运的是,requests将原始urllib3响应存储在raw字段中。

相关文章