def METHOD_NAME(
    tracer,
    request_hook,
    response_hook,
    duration_histogram,
    request_size_histogram,
    response_size_histogram,
    func,
    _,
    args,
    kwargs,
):
    start_time = time_ns()
    # Return immediately if no args were provided (error)
    # or original_request is set (meaning we are in a redirect step).
    if len(args) == 0 or hasattr(args[0], "original_request"):
        return func(*args, **kwargs)
    # Force the creation of a HTTPRequest object if needed,
    # so we can inject the context into the headers.
    args, kwargs = _normalize_request(args, kwargs)
    request = args[0]
    span = tracer.start_span(
        request.method,
        kind=trace.SpanKind.CLIENT,
        start_time=start_time,
    )
    if request_hook:
        request_hook(span, request)
    if span.is_recording():
        attributes = {
            SpanAttributes.HTTP_URL: remove_url_credentials(request.url),
            SpanAttributes.HTTP_METHOD: request.method,
        }
        for key, value in attributes.items():
            span.set_attribute(key, value)
    with trace.use_span(span):
        inject(request.headers)
        future = func(*args, **kwargs)
        future.add_done_callback(
            functools.partial(
                _finish_tracing_callback,
                span=span,
                response_hook=response_hook,
                duration_histogram=duration_histogram,
                request_size_histogram=request_size_histogram,
                response_size_histogram=response_size_histogram,
            )
        )
        return future