class ElasticAPM::Span

@api private

def build_stacktrace

def build_stacktrace
  @stacktrace = @stacktrace_builder.build(original_backtrace, type: :span)
  self.original_backtrace = nil # release it
end

def done

def done
  stop
  if should_build_stacktrace?
    build_stacktrace
  end
  self
end

def initialize(

rubocop:disable Metrics/ParameterLists
def initialize(
  name,
  type = nil,
  transaction: nil,
  parent: nil,
  context: nil,
  stacktrace_builder: nil
)
  @name = name
  @type = type || DEFAULT_TYPE
  @id = SecureRandom.hex(8)
  self.transaction = transaction
  self.parent = parent
  @context = context
  @stacktrace_builder = stacktrace_builder
end

def inspect

def inspect
  "<ElasticAPM::Span id:#{id}" \
    " name:#{name.inspect}" \
    " type:#{type.inspect}" \
    '>'
end

def long_enough_for_stacktrace?

def long_enough_for_stacktrace?
  min_duration =
    @stacktrace_builder.config.span_frames_min_duration_us
  return true if min_duration < 0
  return false if min_duration == 0
  duration >= min_duration
end

def parent_id

def parent_id
  @parent&.id || transaction_id
end

def running?

def running?
  started? && !stopped?
end

def should_build_stacktrace?

def should_build_stacktrace?
  @stacktrace_builder && original_backtrace && long_enough_for_stacktrace?
end

def start

def start
  raise 'Transaction needed to start span' unless transaction_id
  @relative_start = Util.micros - timestamp
  self
end

def started?

def started?
  !!relative_start
end

def stop

def stop
  @duration = Util.micros - timestamp - relative_start
end

def stopped?

def stopped?
  !!duration
end

def transaction=(transaction)

def transaction=(transaction)
  @transaction_id = transaction&.id
  @timestamp = transaction&.timestamp
  @trace_id = transaction&.trace_id
end