Class: TingYun::Agent::Transaction

Inherits:
Object
  • Object
show all
Extended by:
ClassMethod
Includes:
InstanceMethod
Defined in:
lib/ting_yun/agent/transaction.rb,
lib/ting_yun/agent/transaction/apdex.rb,
lib/ting_yun/agent/transaction/trace.rb,
lib/ting_yun/agent/transaction/attributes.rb,
lib/ting_yun/agent/transaction/exceptions.rb,
lib/ting_yun/agent/transaction/trace_node.rb,
lib/ting_yun/agent/transaction/class_method.rb,
lib/ting_yun/agent/transaction/instance_method.rb,
lib/ting_yun/agent/transaction/request_attributes.rb

Overview

web transaction

Defined Under Namespace

Modules: ClassMethod, InstanceMethod Classes: Apdex, Attributes, Exceptions, RequestAttributes, Trace, TraceNode

Constant Summary collapse

SUBTRANSACTION_PREFIX =
'Nested/'.freeze
CONTROLLER_PREFIX =
'WebAction/'.freeze
BACKGROUND_PREFIX =
'BackgroundAction/'.freeze
RAKE_TRANSACTION_PREFIX =
'BackgroundAction/Rake'.freeze
TASK_PREFIX =
'OtherTransaction/Background/'.freeze
RACK_PREFIX =
'Rack/'.freeze
SINATRA_PREFIX =
'WebAction/Sinatra/'.freeze
MIDDLEWARE_PREFIX =
'Middleware/Rack/'.freeze
GRAPE_PREFIX =
'WebAction/Grape/'.freeze
RAKE_PREFIX =
'WebAction/Rake'.freeze
CABLE_PREFIX =
'WebAction/ActionCable'.freeze
EMPTY_SUMMARY_METRICS =
[].freeze
MIDDLEWARE_SUMMARY_METRICS =
['Middleware/all'.freeze].freeze
TRACE_OPTIONS_SCOPED =
{:metric => true, :scoped_metric => true}.freeze
TRACE_OPTIONS_UNSCOPED =
{:metric => true, :scoped_metric => false}.freeze
NESTED_TRACE_STOP_OPTIONS =
{:metric => true}.freeze

Constants included from InstanceMethod

InstanceMethod::GUID_LENGTH, InstanceMethod::HEX_DIGITS, InstanceMethod::WEB_TRANSACTION_CATEGORIES

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ClassMethod

nested_transaction_name, notice_error, recording_web_transaction?, set_default_transaction_name, start_new_transaction, tl_current, wrap

Methods included from InstanceMethod

#assign_agent_attributes, #best_name, #create_nested_frame, #freeze_name_and_execute, #ignore!, #ignore?, #influences_transaction_name?, #instrumentation_state, #make_transaction_name, #name_last_frame, #needs_middleware_summary_metrics?, #record_summary_metrics, #set_default_transaction_name, #similar_category?, #web_category?, #with_database_metric_name

Constructor Details

#initialize(category, client_transaction_id, options) ⇒ Transaction

Returns a new instance of Transaction.



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/ting_yun/agent/transaction.rb', line 68

def initialize(category, client_transaction_id, options)
  @start_time = Time.now

  @exceptions = TingYun::Agent::Transaction::Exceptions.new
  @metrics = TingYun::Agent::TransactionMetrics.new
  @attributes = TingYun::Agent::Transaction::Attributes.new
  @apdex = TingYun::Agent::Transaction::Apdex.new(options[:apdex_start_time], @start_time)

  @has_children = false
  @category = category

  @guid = client_transaction_id || generate_guid
  @frame_stack = []
  @frozen_name = nil
  @base_quantile_hash = {}
  @default_name = TingYun::Helper.correctly_encoded(options[:transaction_name])

  if request = options[:request]
    @request_attributes = TingYun::Agent::Transaction::RequestAttributes.new request
  else
    @request_attributes = nil
  end
end

Instance Attribute Details

#apdexObject (readonly)

Returns the value of attribute apdex.



54
55
56
# File 'lib/ting_yun/agent/transaction.rb', line 54

def apdex
  @apdex
end

#attributesObject (readonly)

Returns the value of attribute attributes.



54
55
56
# File 'lib/ting_yun/agent/transaction.rb', line 54

def attributes
  @attributes
end

#base_quantile_hashObject (readonly)

Returns the value of attribute base_quantile_hash.



54
55
56
# File 'lib/ting_yun/agent/transaction.rb', line 54

def base_quantile_hash
  @base_quantile_hash
end

#categoryObject (readonly)

Returns the value of attribute category.



54
55
56
# File 'lib/ting_yun/agent/transaction.rb', line 54

def category
  @category
end

#default_nameObject (readonly)

Returns the value of attribute default_name.



54
55
56
# File 'lib/ting_yun/agent/transaction.rb', line 54

def default_name
  @default_name
end

#exceptionsObject (readonly)

Returns the value of attribute exceptions.



54
55
56
# File 'lib/ting_yun/agent/transaction.rb', line 54

def exceptions
  @exceptions
end

#frame_stackObject (readonly)

Returns the value of attribute frame_stack.



54
55
56
# File 'lib/ting_yun/agent/transaction.rb', line 54

def frame_stack
  @frame_stack
end

#guidObject (readonly)

Returns the value of attribute guid.



54
55
56
# File 'lib/ting_yun/agent/transaction.rb', line 54

def guid
  @guid
end

#metricsObject (readonly)

Returns the value of attribute metrics.



54
55
56
# File 'lib/ting_yun/agent/transaction.rb', line 54

def metrics
  @metrics
end

#request_attributesObject (readonly)

Returns the value of attribute request_attributes.



54
55
56
# File 'lib/ting_yun/agent/transaction.rb', line 54

def request_attributes
  @request_attributes
end

#start_timeObject (readonly)

Returns the value of attribute start_time.



54
55
56
# File 'lib/ting_yun/agent/transaction.rb', line 54

def start_time
  @start_time
end

Instance Method Details

#commit(state, end_time, outermost_node_name) ⇒ Object



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/ting_yun/agent/transaction.rb', line 148

def commit(state, end_time, outermost_node_name)

  assign_agent_attributes


  TingYun::Agent.instance.transaction_sampler.on_finishing_transaction(state, self, end_time)

  TingYun::Agent.instance.sql_sampler.on_finishing_transaction(state, @frozen_name)

  record_summary_metrics(state, outermost_node_name, end_time)
  @apdex.record_apdex(@frozen_name, end_time, @exceptions.had_error?)
  @exceptions.record_exceptions(@attributes)


  TingYun::Agent.instance.stats_engine.merge_transaction_metrics!(@metrics, best_name)
  TingYun::Agent.instance.stats_engine.record_base_quantile(@base_quantile_hash) if @exceptions.exceptions.empty?
end

#request_pathObject



92
93
94
# File 'lib/ting_yun/agent/transaction.rb', line 92

def request_path
  @request_attributes && @request_attributes.request_path
end

#request_portObject



96
97
98
# File 'lib/ting_yun/agent/transaction.rb', line 96

def request_port
  @request_attributes && @request_attributes.port
end

#start(state) ⇒ Object



101
102
103
104
105
106
107
108
109
110
111
# File 'lib/ting_yun/agent/transaction.rb', line 101

def start(state)
  return if !state.execution_traced?
  ::TingYun::Agent.instance.events.notify(:start_transaction) # Dispatcher调用

  ::TingYun::Agent::Collector::TransactionSampler.on_start_transaction(state, start_time)
  ::TingYun::Agent::Collector::SqlSampler.on_start_transaction(state, request_path)

  frame_stack.push TingYun::Agent::MethodTracerHelpers.trace_execution_scoped_header(state, Time.now.to_f)
  name_last_frame @default_name
  freeze_name_and_execute if @default_name.start_with?(RAKE_TRANSACTION_PREFIX)
end

#stop(state, end_time, outermost_frame, summary_metrics = []) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/ting_yun/agent/transaction.rb', line 116

def stop(state, end_time, outermost_frame, summary_metrics = [])

  freeze_name_and_execute

  if @has_children
    name = Transaction.nested_transaction_name(outermost_frame.name)
    trace_options = TRACE_OPTIONS_SCOPED
  else
    name = @frozen_name
    trace_options = TRACE_OPTIONS_UNSCOPED
  end

  if name.start_with?(MIDDLEWARE_PREFIX)
    summary_metrics_with_exclusive_time = MIDDLEWARE_SUMMARY_METRICS
  else
    summary_metrics_with_exclusive_time = EMPTY_SUMMARY_METRICS
  end
  summary_metrics_with_exclusive_time = summary_metrics unless summary_metrics.empty?

  TingYun::Agent::MethodTracerHelpers.trace_execution_scoped_footer(
      state,
      start_time.to_f,
      name,
      summary_metrics_with_exclusive_time,
      outermost_frame,
      trace_options,
      end_time.to_f)

  commit(state, end_time, name) unless ignore(best_name)
end