簡體   English   中英

Python:獲取 urllib3 請求標頭

[英]Python: fetching urllib3 request headers

我們正在將跟蹤信息注入到基於 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“請求”庫中,我們有“response.request.headers”屬性來返回請求頭

在 urllib3 中,我找不到返回請求標頭以進行進一步處理的方法

你們中的任何人都可以分享一些想法嗎

現在從這個請求頭中,我們需要獲取 'uber-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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM