code: def wrap_httplib_request(request_func):
      
  
      def call(self, method, url, body, headers, *args, **kwargs):
          _tracer = execution_context.get_opencensus_tracer()
          blacklist_hostnames = execution_context.get_opencensus_attr(
              'blacklist_hostnames')
          dest_url = '{}:{}'.format(self._dns_host, self.port)
          if utils.disable_tracing_hostname(dest_url, blacklist_hostnames):
              return request_func(self, method, url, body,
                                  headers, *args, **kwargs)
          _span = _tracer.start_span()
          _span.span_kind = span_module.SpanKind.CLIENT
          _span.name = '[httplib]{}'.format(request_func.__name__)
  
          # Add the request url to attributes
          _tracer.add_attribute_to_current_span(HTTP_URL, url)
  
          # Add the request method to attributes
          _tracer.add_attribute_to_current_span(HTTP_METHOD, method)
  
          # Store the current span id to thread local.
          execution_context.set_opencensus_attr(
              'httplib/current_span_id', _span.span_id)
          try:
              headers = headers.copy()
              headers.update(_tracer.propagator.to_headers(
                  _span.context_tracer.span_context))
          except Exception:  # pragma: NO COVER
              pass
          return request_func(self, method, url, body, headers, *args, **kwargs)
  
      return call
docs: Wrap the httplib request function to trace. Create a new span and update
      and close the span in the response later.