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(
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