in lib/elastic_apm/instrumenter.rb [174:233]
def start_span(
name,
type = nil,
subtype: nil,
action: nil,
backtrace: nil,
context: nil,
trace_context: nil,
parent: nil,
sync: nil,
exit_span: nil
)
transaction =
case parent
when Span
parent.transaction
when Transaction
parent
else
current_transaction
end
return unless transaction
return unless transaction.sampled?
return unless transaction.inc_started_spans!
parent ||= (current_span || current_transaction)
if parent && parent.is_a?(Span) && parent.exit_span?
if parent.type != type || parent.subtype != subtype
debug "Skipping new span '#{name}' as its parent is an exit_span"
return
end
end
span = Span.new(
name: name,
subtype: subtype,
action: action,
transaction: transaction,
parent: parent,
trace_context: trace_context,
type: type,
context: context,
stacktrace_builder: stacktrace_builder,
sync: sync,
exit_span: exit_span
)
if backtrace && transaction.span_frames_min_duration
span.original_backtrace = backtrace
end
current_spans.push span
span.start
end