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 =
'Transaction/'.freeze
COSS_CONTROLLER_PREFIX =
'WebAction/'.freeze
BACKGROUND_PREFIX =
'TaskAction/'.freeze
RAKE_TRANSACTION_PREFIX =
'TaskAction/Rake'.freeze
TASK_PREFIX =
'OtherTransaction/Background/'.freeze
RACK_PREFIX =
'Rack/'.freeze
SINATRA_PREFIX =
'WebAction/Sinatra/'.freeze
MIDDLEWARE_PREFIX =
'Middleware/'.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, set_frozen_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.



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

def initialize(category, client_transaction_id, options)
  @start_time = Time.now.to_f
  @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
  @is_mq = options[:mq] || false

  @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
    @attributes.merge_request_header(@request_attributes.header.select{|k,v|k.start_with?("HTTP")})
  else
    @request_attributes = nil
  end
end

Instance Attribute Details

#apdexObject (readonly)

Returns the value of attribute apdex.



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

def apdex
  @apdex
end

#attributesObject (readonly)

Returns the value of attribute attributes.



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

def attributes
  @attributes
end

#base_quantile_hashObject (readonly)

Returns the value of attribute base_quantile_hash.



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

def base_quantile_hash
  @base_quantile_hash
end

#categoryObject (readonly)

Returns the value of attribute category.



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

def category
  @category
end

#default_nameObject (readonly)

Returns the value of attribute default_name.



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

def default_name
  @default_name
end

#exceptionsObject (readonly)

Returns the value of attribute exceptions.



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

def exceptions
  @exceptions
end

#frame_stackObject (readonly)

Returns the value of attribute frame_stack.



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

def frame_stack
  @frame_stack
end

#guidObject (readonly)

Returns the value of attribute guid.



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

def guid
  @guid
end

#metricsObject (readonly)

Returns the value of attribute metrics.



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

def metrics
  @metrics
end

#request_attributesObject (readonly)

Returns the value of attribute request_attributes.



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

def request_attributes
  @request_attributes
end

#start_timeObject (readonly)

Returns the value of attribute start_time.



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

def start_time
  @start_time
end

Instance Method Details

#commit(state, end_time, outermost_node_name) ⇒ Object



170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/ting_yun/agent/transaction.rb', line 170

def commit(state, end_time, outermost_node_name)

  assign_agent_attributes(state)


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

  TingYun::Agent.instance.sql_sampler.on_finishing_transaction(state, @frozen_name)
  #
  # record_summary_metrics(state, outermost_node_name, end_time) unless @exceptions.had_error?
  # @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) unless @exceptions.had_error?
end

#commitV2(state, end_time, outermost_node_name) ⇒ Object



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/ting_yun/agent/transaction.rb', line 152

def commitV2(state, end_time, outermost_node_name)

  assign_agent_attributes(state)


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

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

  record_summary_metrics(state, outermost_node_name, end_time) unless @exceptions.had_error?
  @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) unless @exceptions.had_error?
end

#frozen_name=(name) ⇒ Object



102
103
104
# File 'lib/ting_yun/agent/transaction.rb', line 102

def frozen_name=(name)
  @frozen_name = name
end

#request_pathObject



94
95
96
# File 'lib/ting_yun/agent/transaction.rb', line 94

def request_path
  @request_attributes && @request_attributes.request_path
end

#request_portObject



98
99
100
# File 'lib/ting_yun/agent/transaction.rb', line 98

def request_port
  @request_attributes && @request_attributes.port
end

#start(state) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
# File 'lib/ting_yun/agent/transaction.rb', line 106

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



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
146
147
148
149
# File 'lib/ting_yun/agent/transaction.rb', line 121

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

  if @has_children or @is_mq
    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,
      name,
      EMPTY_SUMMARY_METRICS,
      outermost_frame,
      trace_options,
      end_time)

  commit(state, end_time, name)
end