Class: NewRelic::Agent::TransactionSampleBuilder

Inherits:
Object
  • Object
show all
Includes:
CollectionHelper
Defined in:
lib/new_relic/agent/transaction_sampler.rb

Overview

a builder is created with every sampled transaction, to dynamically generate the sampled data. It is a thread-local object, and is not accessed by any other thread so no need for synchronization.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from CollectionHelper

#normalize_params, #strip_nr_from_backtrace

Constructor Details

#initialize(time = nil) ⇒ TransactionSampleBuilder

Returns a new instance of TransactionSampleBuilder.



225
226
227
228
229
230
# File 'lib/new_relic/agent/transaction_sampler.rb', line 225

def initialize(time=nil)
  time ||= Time.now.to_f
  @sample = NewRelic::TransactionSample.new(time)
  @sample_start = time
  @current_segment = @sample.root_segment
end

Instance Attribute Details

#current_segmentObject (readonly)

Returns the value of attribute current_segment.



221
222
223
# File 'lib/new_relic/agent/transaction_sampler.rb', line 221

def current_segment
  @current_segment
end

#sampleObject (readonly)

Returns the value of attribute sample.



221
222
223
# File 'lib/new_relic/agent/transaction_sampler.rb', line 221

def sample
  @sample
end

Instance Method Details

#finish_trace(time) ⇒ Object



255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# File 'lib/new_relic/agent/transaction_sampler.rb', line 255

def finish_trace(time)
  # This should never get called twice, but in a rare case that we can't reproduce in house it does.
  # log forensics and return gracefully
  if @sample.frozen?
    log = NewRelic::Control.instance.log
    
    log.warn "Unexpected double-freeze of Transaction Trace Object."
    log.info "Please send this diagnostic data to New Relic"
    log.info @sample.to_s
    return
  end
  @sample.root_segment.end_trace(time - @sample_start)
  @sample.params[:custom_params] = normalize_params(NewRelic::Agent.instance.custom_params)
  @sample.freeze
  @current_segment = nil
end

#freezeObject



284
285
286
# File 'lib/new_relic/agent/transaction_sampler.rb', line 284

def freeze
  @sample.freeze unless sample.frozen?
end

#ignore_transactionObject



238
239
240
# File 'lib/new_relic/agent/transaction_sampler.rb', line 238

def ignore_transaction
  @ignore = true
end

#ignored?Boolean

Returns:

  • (Boolean)


235
236
237
# File 'lib/new_relic/agent/transaction_sampler.rb', line 235

def ignored?
  @ignore || @sample.params[:path].nil? 
end

#sample_idObject



232
233
234
# File 'lib/new_relic/agent/transaction_sampler.rb', line 232

def sample_id
  @sample.sample_id
end

#scope_depthObject



272
273
274
275
276
277
278
279
280
281
282
# File 'lib/new_relic/agent/transaction_sampler.rb', line 272

def scope_depth
  depth = -1        # have to account for the root
  current = @current_segment
  
  while(current)
    depth += 1
    current = current.parent_segment
  end
  
  depth
end

#set_profile(profile) ⇒ Object



288
289
290
# File 'lib/new_relic/agent/transaction_sampler.rb', line 288

def set_profile(profile)
  @sample.profile = profile
end

#set_transaction_cpu_time(cpu_time) ⇒ Object



306
307
308
# File 'lib/new_relic/agent/transaction_sampler.rb', line 306

def set_transaction_cpu_time(cpu_time)
  @sample.params[:cpu_time] = cpu_time
end

#set_transaction_info(path, request, params) ⇒ Object



292
293
294
295
296
297
298
299
300
301
302
303
304
# File 'lib/new_relic/agent/transaction_sampler.rb', line 292

def set_transaction_info(path, request, params)
  @sample.params[:path] = path
  
  if NewRelic::Control.instance.capture_params
    params = normalize_params params
    
    @sample.params[:request_params].merge!(params)
    @sample.params[:request_params].delete :controller
    @sample.params[:request_params].delete :action
  end
  uri = params[:uri] || (request && request.path)
  @sample.params[:uri] ||= uri if uri
end

#trace_entry(metric_name, time) ⇒ Object



241
242
243
244
245
# File 'lib/new_relic/agent/transaction_sampler.rb', line 241

def trace_entry(metric_name, time)
  segment = @sample.create_segment(time - @sample_start, metric_name)
  @current_segment.add_called_segment(segment)
  @current_segment = segment
end

#trace_exit(metric_name, time) ⇒ Object



247
248
249
250
251
252
253
# File 'lib/new_relic/agent/transaction_sampler.rb', line 247

def trace_exit(metric_name, time)
  if metric_name != @current_segment.metric_name
    fail "unbalanced entry/exit: #{metric_name} != #{@current_segment.metric_name}"
  end
  @current_segment.end_trace(time - @sample_start)
  @current_segment = @current_segment.parent_segment
end