docs: def _start_subspan(headers=None):
      """ Sets up a new span to contact a downstream service.
      This is used when making a downstream service call. It returns a dict containing the required sub-span headers.
      Each downstream call you make is handled as a new span, so call this every time you need to contact another service.
  
      This temporarily updates what's returned by values() to match the sub-span, so it can can also be used when calling
      e.g. a database that doesn't support B3. You'll still be able to record the client side of an interaction,
      even if the downstream server doesn't use the propagated trace information.
  
      You'll need to call end_subspan when you're done. You can do this using the `SubSpan` class:
  
          with SubSpan([headers]) as headers_b3:
              ... log.debug("Client start: calling downstream service")
              ... requests.get(<downstream service>, headers=headers_b3)
              ... log.debug("Client receive: downstream service responded")
  
      For the specification, see: https://github.com/openzipkin/b3-propagation
      :param headers: The headers dict. Headers will be added to this as needed.
      :return: A dict containing header values for a downstream request.
      This can be passed directly to e.g. requests.get(...).
      """
      b3 = values()
      g.subspan = {
  
          # Propagate the trace ID
          b3_trace_id: b3[b3_trace_id],
  
          # Start a new span for the outgoing request
          b3_span_id: _generate_identifier(),
  
          # Set the current span as the parent span
          b3_parent_span_id: b3[b3_span_id],
  
          b3_sampled: b3[b3_sampled],
          b3_flags: b3[b3_flags],
      }
  
      # Set up headers
      # NB dict() ensures we don't alter the value passed in. Maybe that's too conservative?
      result = dict(headers or {})
      result.update({
          b3_trace_id: g.subspan[b3_trace_id],
          b3_span_id: g.subspan[b3_span_id],
          b3_parent_span_id: g.subspan[b3_parent_span_id],
      })
  
      # Propagate only if set:
      if g.subspan[b3_sampled]:
          result[b3_sampled] = g.subspan[b3_sampled]
      if g.subspan[b3_flags]:
          result[b3_flags] = g.subspan[b3_flags]
  
      _info("Client start. Starting sub-span")
      _log.debug("B3 values for sub-span: {b3_headers}".format(b3_headers=values()))
      _log.debug("All headers for downstream request: {b3_headers}".format(b3_headers=result))
  
      return result