async def _traced_clientsession_request(aiohttp, pin, func, instance, args, kwargs): method = get_argument_value(args, kwargs, 0, "method") # type: str url = URL(get_argument_value(args, kwargs, 1, "url")) # type: URL params = kwargs.get("params") headers = kwargs.get("headers") or {} with pin.tracer.trace("aiohttp.request", span_type=SpanTypes.HTTP, service=ext_service(pin, config.aiohttp_client)) as span: if pin._config["distributed_tracing"]: HTTPPropagator.inject(span.context, headers) kwargs["headers"] = headers # Params can be included separate of the URL so the URL has to be constructed # with the passed params. url_str = str(url.update_query(params) if params else url) parsed_url = parse.urlparse(url_str) set_http_meta( span, config.aiohttp_client, method=method, url=url_str, query=parsed_url.query, request_headers=headers, ) resp = await func(*args, **kwargs) # type: aiohttp.ClientResponse set_http_meta(span, config.aiohttp_client, response_headers=resp.headers, status_code=resp.status, status_msg=resp.reason) return resp
async def _wrapped_async_send( wrapped, # type: BoundFunctionWrapper instance, # type: httpx.AsyncClient args, # type: typing.Tuple[httpx.Request], kwargs, # type: typing.Dict[typing.Str, typing.Any] ): # type: (...) -> typing.Coroutine[None, None, httpx.Response] req = get_argument_value(args, kwargs, 0, "request") pin = Pin.get_from(instance) if not pin or not pin.enabled(): return await wrapped(*args, **kwargs) with pin.tracer.trace("http.request", service=_get_service_name(pin, req), span_type=SpanTypes.HTTP) as span: _init_span(span, req) resp = None try: resp = await wrapped(*args, **kwargs) return resp finally: _set_span_meta(span, req, resp)
def test_infer_arg_value_miss(args, kwargs, pos, kw): with pytest.raises(ArgumentError) as e: get_argument_value(args, kwargs, pos, kw) assert e.value == "%s (at position %d)" % (kw, pos)
def test_infer_arg_value_hit(args, kwargs, pos, kw, expected): assert get_argument_value(args, kwargs, pos, kw) == expected