Python:获取urllib3请求头



我们正在向API客户端库中所有http请求调用的请求头中注入跟踪信息,该库是基于urllib3实现的

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。

In python "requests"我们有"response.request.headers"属性返回请求头

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

你们谁能分享一下你们的想法?

现在,我们需要从这个请求头中获取' super -trace-id'和它的值,以便进一步构建URL。

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

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

这是stdlib类,其中getheader方法描述为:

返回报头name的值,如果没有匹配name的报头则返回default的值。如果名称为name的标头不止一个,则返回所有以','连接的值。如果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

相关内容

  • 没有找到相关文章

最新更新