Class: OneApm::TransactionSample

Inherits:
Object
  • Object
show all
Includes:
Coerce, TransactionAnalysis
Defined in:
lib/one_apm/transaction/transaction_sample.rb,
lib/one_apm/transaction/segment.rb,
lib/one_apm/transaction/summary_segment.rb,
lib/one_apm/transaction/composite_segment.rb

Overview

the number of segments that need to exist before we roll them up into one segment with multiple executions

Defined Under Namespace

Classes: CompositeSegment, Segment, SummarySegment

Constant Summary collapse

@@start_time =
Time.now

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Coerce

#event_params, #float, #int, #int_or_nil, #log_failure, #string

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.



25
26
27
28
29
30
31
32
# File 'lib/one_apm/transaction/transaction_sample.rb', line 25

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"
  @prepared = false
end

Instance Attribute Details

#finishedObject

Returns the value of attribute finished.



17
18
19
# File 'lib/one_apm/transaction/transaction_sample.rb', line 17

def finished
  @finished
end

#force_persistObject

Returns the value of attribute force_persist.



17
18
19
# File 'lib/one_apm/transaction/transaction_sample.rb', line 17

def force_persist
  @force_persist
end

#guidObject

Returns the value of attribute guid.



17
18
19
# File 'lib/one_apm/transaction/transaction_sample.rb', line 17

def guid
  @guid
end

#paramsObject

Returns the value of attribute params.



17
18
19
# File 'lib/one_apm/transaction/transaction_sample.rb', line 17

def params
  @params
end

#prepared=(value) ⇒ Object (writeonly)

Sets the attribute prepared

Parameters:

  • value

    the value to set the attribute prepared to.



21
22
23
# File 'lib/one_apm/transaction/transaction_sample.rb', line 21

def prepared=(value)
  @prepared = value
end

#profileObject

Returns the value of attribute profile.



17
18
19
# File 'lib/one_apm/transaction/transaction_sample.rb', line 17

def profile
  @profile
end

#root_segmentObject

Returns the value of attribute root_segment.



17
18
19
# File 'lib/one_apm/transaction/transaction_sample.rb', line 17

def root_segment
  @root_segment
end

#sample_idObject (readonly)

Returns the value of attribute sample_id.



20
21
22
# File 'lib/one_apm/transaction/transaction_sample.rb', line 20

def sample_id
  @sample_id
end

#start_timeObject

Returns the value of attribute start_time.



17
18
19
# File 'lib/one_apm/transaction/transaction_sample.rb', line 17

def start_time
  @start_time
end

#synthetics_resource_idObject

Returns the value of attribute synthetics_resource_id.



17
18
19
# File 'lib/one_apm/transaction/transaction_sample.rb', line 17

def synthetics_resource_id
  @synthetics_resource_id
end

#thresholdObject

Returns the value of attribute threshold.



17
18
19
# File 'lib/one_apm/transaction/transaction_sample.rb', line 17

def threshold
  @threshold
end

#xray_session_idObject

Returns the value of attribute xray_session_id.



17
18
19
# File 'lib/one_apm/transaction/transaction_sample.rb', line 17

def xray_session_id
  @xray_session_id
end

Instance Method Details

#count_segmentsObject



38
39
40
# File 'lib/one_apm/transaction/transaction_sample.rb', line 38

def count_segments
  @segment_count
end

#create_segment(relative_timestamp, metric_name = nil) ⇒ Object

relative_timestamp is seconds since the start of the transaction

Raises:

  • (TypeError)


105
106
107
108
109
110
# File 'lib/one_apm/transaction/transaction_sample.rb', line 105

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

#durationObject



112
113
114
# File 'lib/one_apm/transaction/transaction_sample.rb', line 112

def duration
  root_segment.duration
end

#each_segment(&block) ⇒ Object

Iterates recursively over each segment in the entire transaction sample tree



118
119
120
# File 'lib/one_apm/transaction/transaction_sample.rb', line 118

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



124
125
126
# File 'lib/one_apm/transaction/transaction_sample.rb', line 124

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



44
45
46
# File 'lib/one_apm/transaction/transaction_sample.rb', line 44

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



134
135
136
# File 'lib/one_apm/transaction/transaction_sample.rb', line 134

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

#forced?Boolean

Returns:

  • (Boolean)


100
101
102
# File 'lib/one_apm/transaction/transaction_sample.rb', line 100

def forced?
  !!@force_persist || !int_or_nil(xray_session_id).nil?
end

#path_stringObject



88
89
90
# File 'lib/one_apm/transaction/transaction_sample.rb', line 88

def path_string
  @root_segment.path_string
end

#prepare_to_send!Object

Return a new transaction sample that can be sent to the OneApm service.



161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/one_apm/transaction/transaction_sample.rb', line 161

def prepare_to_send!
  return self if @prepared

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

  @prepared = true
  self
end

#prepared?Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/one_apm/transaction/transaction_sample.rb', line 34

def prepared?
  @prepared
end

#set_custom_param(name, value) ⇒ Object



53
54
55
56
# File 'lib/one_apm/transaction/transaction_sample.rb', line 53

def set_custom_param(name, value)
  @params[:custom_params] ||= {}
  @params[:custom_params][name] = value
end

#timestampObject

offset from start of app



49
50
51
# File 'lib/one_apm/transaction/transaction_sample.rb', line 49

def timestamp
  @start_time - @@start_time.to_f
end

#to_arrayObject



60
61
62
63
64
65
# File 'lib/one_apm/transaction/transaction_sample.rb', line 60

def to_array
  [ OneApm::Helper.time_to_millis(@start_time),
    @params[:request_params],
    @params[:custom_params],
    @root_segment.to_array]
end

#to_collector_array(encoder) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/one_apm/transaction/transaction_sample.rb', line 67

def to_collector_array(encoder)
  # trace_tree = OneApm::Helper.obfuscator.obfuscate(OneApm::JSONWrapper.dump([self.to_array]))
  trace_tree = encoder.encode(self.to_array)
  trace_array = [ Helper.time_to_millis(@start_time),
    Helper.time_to_millis(duration),
    string(transaction_name),
    string(@params[:uri]),
    trace_tree,
    string(@guid),
    nil,
    forced?,
    trip_guid
  ] 
 return trace_array unless int_or_nil(xray_session_id)
 trace_array + [ int_or_nil(xray_session_id) ]
end

#to_sObject



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/one_apm/transaction/transaction_sample.rb', line 138

def to_s
  s = "Transaction Sample collected at #{Time.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



128
129
130
# File 'lib/one_apm/transaction/transaction_sample.rb', line 128

def to_s_compact
  @root_segment.to_s_compact
end

#transaction_nameObject



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

def transaction_name
  @params[:path]
end

#transaction_name=(new_name) ⇒ Object



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

def transaction_name=(new_name)
  @params[:path] = new_name
end

#trip_guidObject



84
85
86
# File 'lib/one_apm/transaction/transaction_sample.rb', line 84

def trip_guid
  string(params[:custom_params][:'bw.trip_id'] || @guid) rescue string(@guid)
end