【问题标题】:Python: fetching urllib3 request headersPython:获取 urllib3 请求标头
【发布时间】:2021-07-23 14:54:31
【问题描述】:

我们将跟踪信息注入到我们基于 urllib3 实现的 API 客户端库中所有 http 请求调用的请求标头中

def _init_jaeger_tracer():
    '''Jaeger tracer initialization'''
    config = Config(
        config={
            'sampler': {
                'type': 'const',
                'param': 1,
            },
        },
        service_name="session"
        )
    return config.new_tracer()

class APIObject(rest.APIObject):
    '''Class for injecting traces into urllib3 request headers'''
    def __init__(self, configuration):
        print("RESTClientObject child class called####")
        self._tracer = None
        super().__init__(configuration)
        self._tracer = _init_jaeger_tracer()

    # pylint: disable=W0221
    def request(self, method, url, *args, **kwargs):
        lower_method = method.lower()
        with self._tracer.start_active_span('requests.{}'.format(lower_method)) as scope:
            span = scope.span
            span.set_tag(tags.SPAN_KIND, tags.SPAN_KIND_RPC_CLIENT)
            span.set_tag(tags.COMPONENT, 'request')
            span.set_tag(tags.HTTP_METHOD, lower_method)
            span.set_tag(tags.HTTP_URL, url)
            headers = kwargs.setdefault('headers', {})
            self._tracer.inject(span.context, Format.HTTP_HEADERS, headers)
    return r

这样实现后,urllib3请求头是这样的,

headers = {
    'Content-Type': 'application/json', 
    'User-Agent': 'API-Generator/1.0.0/python', 
    # **
    'uber-trace-id': '30cef3e816482516:1a4fed2c4863b2f6:0:1'
    # **
}

现在我们必须从注入的请求头中获取trace-id。

在python“requests”库中,我们有“response.request.headers”属性来返回请求标头

在 urllib3 中我找不到返回请求标头以进行进一步处理的方法

大家有什么想法吗

现在从这个请求标头中,我们需要获取 'uber-trace-id' 及其值以进一步构建 URL。

【问题讨论】:

    标签: python urllib3 jaeger opentracing


    【解决方案1】:

    urllib3.response.HTTPResponse 的文档说它是:

    向后兼容http.client.HTTPResponse [...]

    这是 stdlib 类,它的 getheader 方法描述为:

    返回标头name 的值,如果没有与name 匹配的标头,则返回default。如果名称为 name 的 header 不止一个,则返回所有由 ', ' 连接的值。如果default 是除单个字符串之外的任何可迭代对象,则它的元素同样返回以逗号连接。

    因此在你的情况下是这样的。

    import urllib3
    
    http = urllib3.PoolManager()
    response = http.request('GET', 'https://python.org/')
    response.getheader('uber-trace-id', 'UNKNOWN')
    

    更新

    urllib3 没有 HTTP 请求对象表示。 HTTP 请求以RequestMethods.request 的形式参数表示。因此,在jaeger_client 注入跟踪标识符后,您需要自己将跟踪标识符存储在request 覆盖中。将其存储为响应对象的属性可能是一个好主意:

    from jaeger_client.constants import TRACE_ID_HEADER
    
    class APIObject(rest.APIObject):
    
        def request(self, *args, **kwargs) -> urllib3.response.BaseHTTPResponse:
            ...
            r._request_tracing_id = headers[TRACE_ID_HEADER]
            return r
    

    【讨论】:

    • 我想 response.getheader 会给我响应属性值,但我对请求标头感兴趣
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-07
    • 2011-03-07
    • 2016-03-21
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多