Class: NewRelic::TransactionSample

Inherits:
Object
  • Object
show all
Includes:
TransactionAnalysis
Defined in:
lib/new_relic/transaction_sample.rb,
lib/new_relic/transaction_sample/segment.rb,
lib/new_relic/transaction_sample/fake_segment.rb,
lib/new_relic/transaction_sample/summary_segment.rb,
lib/new_relic/transaction_sample/composite_segment.rb

Defined Under Namespace

Classes: CompositeSegment, FakeSegment, Segment, SummarySegment

Constant Summary collapse

@@start_time =
Time.now

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from TransactionAnalysis

#breakdown_data, #database_time, #render_time, #sql_segments

Constructor Details

#initialize(time = Time.now.to_f, sample_id = nil) ⇒ TransactionSample

Returns a new instance of TransactionSample.



19
20
21
22
23
24
25
26
27
28
# File 'lib/new_relic/transaction_sample.rb', line 19

def initialize(time = Time.now.to_f, sample_id = nil)
  @sample_id = sample_id || object_id
  @start_time = time
  @params = { :segment_count => -1, :request_params => {} }
  @segment_count = -1
  @root_segment = create_segment 0.0, "ROOT"

  @guid = generate_guid
  NewRelic::Agent::TransactionInfo.get.guid = @guid
end

Instance Attribute Details

#force_persistObject

Returns the value of attribute force_persist.



12
13
14
# File 'lib/new_relic/transaction_sample.rb', line 12

def force_persist
  @force_persist
end

#guidObject

Returns the value of attribute guid.



12
13
14
# File 'lib/new_relic/transaction_sample.rb', line 12

def guid
  @guid
end

#paramsObject

Returns the value of attribute params.



12
13
14
# File 'lib/new_relic/transaction_sample.rb', line 12

def params
  @params
end

#profileObject

Returns the value of attribute profile.



12
13
14
# File 'lib/new_relic/transaction_sample.rb', line 12

def profile
  @profile
end

#root_segmentObject

Returns the value of attribute root_segment.



12
13
14
# File 'lib/new_relic/transaction_sample.rb', line 12

def root_segment
  @root_segment
end

#sample_idObject (readonly)

Returns the value of attribute sample_id.



13
14
15
# File 'lib/new_relic/transaction_sample.rb', line 13

def sample_id
  @sample_id
end

Instance Method Details

#count_segmentsObject



30
31
32
# File 'lib/new_relic/transaction_sample.rb', line 30

def count_segments
  @segment_count
end

#create_segment(relative_timestamp, metric_name, segment_id = nil) ⇒ Object

Raises:

  • (TypeError)


73
74
75
76
77
78
# File 'lib/new_relic/transaction_sample.rb', line 73

def create_segment(relative_timestamp, metric_name, segment_id = nil)
  raise TypeError.new("Frozen Transaction Sample") if frozen?
  @params[:segment_count] += 1
  @segment_count += 1
  NewRelic::TransactionSample::Segment.new(relative_timestamp, metric_name, segment_id)
end

#durationObject



80
81
82
# File 'lib/new_relic/transaction_sample.rb', line 80

def duration
  root_segment.duration
end

#each_segment(&block) ⇒ Object

Iterates recursively over each segment in the entire transaction sample tree



86
87
88
# File 'lib/new_relic/transaction_sample.rb', line 86

def each_segment(&block)
  @root_segment.each_segment(&block)
end

#each_segment_with_nest_tracking(&block) ⇒ Object

Iterates recursively over each segment in the entire transaction sample tree while keeping track of nested segments



92
93
94
# File 'lib/new_relic/transaction_sample.rb', line 92

def each_segment_with_nest_tracking(&block)
  @root_segment.each_segment_with_nest_tracking(&block)
end

#ensure_segment_count_set(count) ⇒ Object

makes sure that the parameter cache for segment count is set to the correct value



45
46
47
# File 'lib/new_relic/transaction_sample.rb', line 45

def ensure_segment_count_set(count)
  params[:segment_count] ||= count
end

#find_segment(id) ⇒ Object

Searches the tree recursively for the segment with the given id. note that this is an internal id, not an ActiveRecord id



102
103
104
# File 'lib/new_relic/transaction_sample.rb', line 102

def find_segment(id)
  @root_segment.find_segment(id)
end

#omit_segments_with(regex) ⇒ Object

return a new transaction sample that treats segments with the given regular expression in their name as if they were never called at all. This allows us to strip out segments from traces captured in development environment that would not normally show up in production (like Rails/Application Code Loading)



133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/new_relic/transaction_sample.rb', line 133

def omit_segments_with(regex)
  regex = Regexp.new(regex)

  sample = TransactionSample.new(@start_time, sample_id)
  
  sample.params = params.dup
  sample.params[:segment_count] = 0
  
  delta = build_segment_with_omissions(sample, 0.0, @root_segment, sample.root_segment, regex)
  sample.root_segment.end_trace(@root_segment.exit_timestamp - delta)
  sample.profile = self.profile
  sample
end

#path_stringObject



69
70
71
# File 'lib/new_relic/transaction_sample.rb', line 69

def path_string
  @root_segment.path_string
end

#prepare_to_send(options = {}) ⇒ Object

Return a new transaction sample that can be sent to the New Relic service. This involves potentially one or more of the following options

:explain_sql : run EXPLAIN on all queries whose response times equal the value for this key
    (for example :explain_sql => 2.0 would explain everything over 2 seconds.  0.0 would explain everything.)
:keep_backtraces : keep backtraces, significantly increasing size of trace (off by default)
:record_sql => [ :raw | :obfuscated] : copy over the sql, obfuscating if necessary


155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/new_relic/transaction_sample.rb', line 155

def prepare_to_send(options={})
  sample = TransactionSample.new(@start_time, sample_id)

  sample.params.merge! self.params
  sample.guid = self.guid
  sample.force_persist = self.force_persist if self.force_persist

  begin
    build_segment_for_transfer(sample, @root_segment, sample.root_segment, options)
  ensure
    NewRelic::Agent::Database.close_connections
  end

  sample.root_segment.end_trace(@root_segment.exit_timestamp)
  sample
end

#start_timeObject



65
66
67
# File 'lib/new_relic/transaction_sample.rb', line 65

def start_time
  Time.at(@start_time)
end

#timestampObject

offset from start of app



50
51
52
# File 'lib/new_relic/transaction_sample.rb', line 50

def timestamp
  @start_time - @@start_time.to_f
end

#to_json(options = {}) ⇒ Object

Used in the server only



55
56
57
58
59
60
61
62
63
# File 'lib/new_relic/transaction_sample.rb', line 55

def to_json(options = {}) #:nodoc:
  map = {:sample_id => @sample_id,
    :start_time => @start_time,
    :root_segment => @root_segment}
  if @params && !@params.empty?
    map[:params] = @params
  end
  map.to_json
end

#to_sObject



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/new_relic/transaction_sample.rb', line 106

def to_s
  s = "Transaction Sample collected at #{start_time}\n"
  s << "  {\n"
  s << "  Path: #{params[:path]} \n"

  params.each do |k,v|
    next if k == :path
    s << "  #{k}: " <<
    case v
      when Enumerable then v.map(&:to_s).sort.join("; ")
      when String then v
      when Float then '%6.3s' % v
      when Fixnum then v.to_s
      when nil then ''
    else
      raise "unexpected value type for #{k}: '#{v}' (#{v.class})"
    end << "\n"
  end
  s << "  }\n\n"
  s <<  @root_segment.to_debug_str(0)
end

#to_s_compactObject



96
97
98
# File 'lib/new_relic/transaction_sample.rb', line 96

def to_s_compact
  @root_segment.to_s_compact
end

#truncate(max) ⇒ Object

Truncates the transaction sample to a maximum length determined by the passed-in parameter. Operates recursively on the entire tree of transaction segments in a depth-first manner



37
38
39
40
41
# File 'lib/new_relic/transaction_sample.rb', line 37

def truncate(max)
  return if @segment_count < max
  @root_segment.truncate(max + 1)
  @segment_count = max
end