module NewRelic::Agent::Transaction::TraceBuilder

Public Instance Methods

build_trace(transaction) click to toggle source
# File lib/new_relic/agent/transaction/trace_builder.rb, line 15
def build_trace(transaction)
  trace = Trace.new(transaction.start_time)
  trace.root_node.exit_timestamp = transaction.end_time - transaction.start_time
  copy_attributes(transaction, trace)
  first, *rest = transaction.segments
  relationship_map = rest.group_by { |s| s.parent }
  trace.root_node.children << process_segments(transaction, first, trace.root_node, relationship_map)
  trace
end

Private Instance Methods

copy_attributes(transaction, trace) click to toggle source
# File lib/new_relic/agent/transaction/trace_builder.rb, line 46
def copy_attributes(transaction, trace)
  trace.transaction_name = transaction.best_name
  trace.guid = transaction.guid
  trace.attributes = transaction.attributes
  trace.threshold = transaction.threshold
  trace.finished = true
end
create_trace_node(transaction, segment, parent) click to toggle source
# File lib/new_relic/agent/transaction/trace_builder.rb, line 40
def create_trace_node(transaction, segment, parent)
  relative_start = segment.start_time - transaction.start_time
  relative_end = segment.end_time - transaction.start_time
  TraceNode.new(segment.name, relative_start, relative_end, segment.params, parent)
end
process_segments(transaction, segment, parent, relationship_map) click to toggle source

recursively builds a transaction trace from the flat list of segments

# File lib/new_relic/agent/transaction/trace_builder.rb, line 28
def process_segments(transaction, segment, parent, relationship_map)
  current = create_trace_node(transaction, segment, parent)

  if children = relationship_map[segment]
    current.children = children.map! do |child|
      process_segments(transaction, child, current, relationship_map)
    end
  end

  current
end