class NewRelic::Agent::Transaction::Trace

Attributes

attributes[RW]
finished[RW]
guid[RW]
node_count[RW]
profile[RW]
root_node[R]
start_time[R]
threshold[RW]
transaction_name[RW]
uri[RW]
xray_session_id[RW]

Public Class Methods

new(start_time) click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 17
def initialize(start_time)
  @start_time = start_time
  @node_count = 0
  @root_node = NewRelic::Agent::Transaction::TraceNode.new(0.0, "ROOT")
  @prepared = false
end

Public Instance Methods

collect_explain_plans!() click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 74
def collect_explain_plans!
  return unless NewRelic::Agent::Database.should_collect_explain_plans?
  threshold = NewRelic::Agent.config[:'transaction_tracer.explain_threshold']

  each_node do |node|
    if node[:sql] && node.duration > threshold
      node[:explain_plan] = node.explain_sql
    end
  end
end
count_nodes() click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 28
def count_nodes
  self.node_count
end
create_node(time_since_start, metric_name = nil) click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 50
def create_node(time_since_start, metric_name = nil)
  raise FinishedTraceError.new "Can't create additional node for finished trace." if self.finished
  self.node_count += 1
  NewRelic::Agent::Transaction::TraceNode.new(time_since_start, metric_name)
end
duration() click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 32
def duration
  self.root_node.duration
end
each_node(&block) click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 56
def each_node(&block)
  self.root_node.each_node(&block)
end
each_node_with_nest_tracking(&block) click to toggle source

Iterates recursively over each node in the entire transaction sample tree while keeping track of nested nodes

# File lib/new_relic/agent/transaction/trace.rb, line 109
def each_node_with_nest_tracking(&block)
  @root_node.each_node_with_nest_tracking(&block)
end
forced?() click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 36
def forced?
  return true if NewRelic::Coerce.int_or_nil(xray_session_id)
  false
end
prepare_sql_for_transmission!() click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 85
def prepare_sql_for_transmission!
  strategy = NewRelic::Agent::Database.record_sql_method
  each_node do |node|
    next unless node[:sql]

    case strategy
    when :obfuscated
      node[:sql] = NewRelic::Agent::Database.obfuscate_sql(node[:sql])
    when :raw
      node[:sql] = node[:sql].sql.to_s
    else
      node[:sql] = nil
    end
  end
end
prepare_to_send!() click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 60
def prepare_to_send!
  return self if @prepared

  if NewRelic::Agent::Database.should_record_sql?
    collect_explain_plans!
    prepare_sql_for_transmission!
  else
    strip_sql!
  end

  @prepared = true
  self
end
sample_id() click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 24
def sample_id
  self.object_id
end
strip_sql!() click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 101
def strip_sql!
  each_node do |node|
    node.params.delete(:sql)
  end
end
synthetics_resource_id() click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 41
def synthetics_resource_id
  intrinsic_attributes = attributes.intrinsic_attributes_for(NewRelic::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
  intrinsic_attributes[:synthetics_resource_id]
end
to_collector_array(encoder) click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 133
def to_collector_array(encoder)
  [
    NewRelic::Helper.time_to_millis(self.start_time),
    NewRelic::Helper.time_to_millis(self.root_node.duration),
    NewRelic::Coerce.string(self.transaction_name),
    NewRelic::Coerce.string(self.uri),
    encoder.encode(trace_tree),
    NewRelic::Coerce.string(self.guid),
    nil,
    forced?,
    NewRelic::Coerce.int_or_nil(xray_session_id),
    NewRelic::Coerce.string(self.synthetics_resource_id)
  ]
end
to_s_compact() click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 46
def to_s_compact
  @root_node.to_s_compact
end
trace_tree() click to toggle source
# File lib/new_relic/agent/transaction/trace.rb, line 113
def trace_tree
  destination = NewRelic::Agent::AttributeFilter::DST_TRANSACTION_TRACER

  agent_attributes     = self.attributes.agent_attributes_for(destination)
  custom_attributes    = self.attributes.custom_attributes_for(destination)
  intrinsic_attributes = self.attributes.intrinsic_attributes_for(destination)

  [
    NewRelic::Coerce.float(self.start_time),
    {},
    {},
    self.root_node.to_array,
    {
      'agentAttributes' => agent_attributes,
      'userAttributes'  => custom_attributes,
      'intrinsics'      => intrinsic_attributes
    }
  ]
end