class TingYun::Agent::Collector::ErrorCollector

Constants

EMPTY_STRING
ERRORS_ACTION
ERRORS_ALL
ERRORS_ALL_BACK_GROUND
ERRORS_ALL_WEB
ERRORS_TYPE
EXCEPTIONS_ACTION
EXCEPTIONS_ALL
EXCEPTIONS_ALL_BACK_GROUND
EXCEPTIONS_ALL_WEB
EXCEPTIONS_TYPE
MAX_ERROR_QUEUE_LENGTH

Maximum possible length of the queue - defaults to 20, may be

Attributes

error_trace_array[R]
exception_error_array[R]
external_error_array[R]

Public Class Methods

new() click to toggle source
# File lib/ting_yun/agent/collector/error_collector.rb, line 109
def initialize
  @error_trace_array = ::TingYun::Agent::Collector::ErrorTraceArray.new(MAX_ERROR_QUEUE_LENGTH)
  @external_error_array = ::TingYun::Agent::Collector::ErrorTraceArray.new(MAX_ERROR_QUEUE_LENGTH)
  @exception_error_array = ::TingYun::Agent::Collector::ErrorTraceArray.new(MAX_ERROR_QUEUE_LENGTH)
end

Public Instance Methods

create_noticed_error(exception, options) click to toggle source
# File lib/ting_yun/agent/collector/error_collector.rb, line 167
def create_noticed_error(exception, options)
  if options[:type] && options[:type]==:exception
    attributes = options[:attributes]
    error_metric = options[:attributes].agent_attributes[:metric_name] || EMPTY_STRING
    noticed_error = TingYun::Agent::Collector::NoticedError.new(error_metric, exception)
    noticed_error.attributes  = attributes
    noticed_error.stack_trace = extract_stack_trace(exception) if ::TingYun::Agent.config[:'nbs.exception.stack_enabled']
    noticed_error.type = options[:type]
    noticed_error
  else
    attributes = options[:attributes]
    error_metric = attributes.agent_attributes[:metric_name] || EMPTY_STRING
    noticed_error = TingYun::Agent::Collector::NoticedError.new(error_metric, exception)
    noticed_error.attributes  = attributes
    noticed_error.stack_trace = extract_stack_trace(exception)
    noticed_error.type = options[:type]
    noticed_error.code = attributes.agent_attributes[:httpStatus]
    noticed_error
  end

end
extract_stack_trace(exception) click to toggle source

extracts a stack trace from the exception for debugging purposes

# File lib/ting_yun/agent/collector/error_collector.rb, line 202
def extract_stack_trace(exception)
  actual_exception = sense_method(exception, 'original_exception') || exception
  sense_method(actual_exception, 'backtrace') || '<no stack trace>'
end
increment_error_count(exception,state, type) click to toggle source

Notice the error with the given available options:

  • :type => default nil; :exception,:error

# File lib/ting_yun/agent/collector/error_collector.rb, line 144
def increment_error_count(exception,state, type)
  txn = state.current_transaction
  if type && type==:exception
    exception_metric_names = aggregated_exception_metric_names(txn)
    exception_metric_names.concat aggregated_exception_type_count(exception,txn)
    exception_metric_names << action_exception_metric_names(txn)
    stats_engine = TingYun::Agent.agent.stats_engine
    stats_engine.record_unscoped_metrics(state, exception_metric_names) do |stats|
      stats.increment_count
    end
  else
    metric_names = aggregated_metric_names(txn)
    metric_names.concat aggregated_type_count(exception,txn)
    metric_names.concat action_metric_names(txn,exception)
    stats_engine = TingYun::Agent.agent.stats_engine
    stats_engine.record_unscoped_metrics(state, metric_names) do |stats|
      stats.increment_count
    end
  end
end
notice_agent_error(exception) click to toggle source

*Use sparingly for difficult to track bugs.*

Track internal agent errors for communication back to TingYun To use, make a specific subclass of TingYun::Support::Exception::InternalAgentError, then pass an instance of it to this method when your problem occurs.

Limits are treated differently for these errors. We only gather one per class per harvest, disregarding (and not impacting) the app error queue limit.

# File lib/ting_yun/agent/collector/error_collector.rb, line 216
def notice_agent_error(exception)
  error_trace_array.notice_agent_error(exception)
end
notice_error(exception, options={}) click to toggle source

See TingYun::Agent.notice_error for options and commentary

# File lib/ting_yun/agent/collector/error_collector.rb, line 116
def notice_error(exception, options={})
  tag_exception(exception)
  state = ::TingYun::Agent::TransactionState.tl_get
  increment_error_count(exception,state,options[:type])
  _error = create_noticed_error(exception, options)
  noticed_error = _error.clone
  if noticed_error.is_external_error
    noticed_error.is_external_error = nil
    external_error_array.add_to_error_queue(_error)
  end
  if noticed_error.type && noticed_error.type == :exception
     exception_error_array.add_to_error_queue(noticed_error)
  else
    error_trace_array.add_to_error_queue(noticed_error)
  end


rescue => e
  ::TingYun::Agent.logger.warn("Failure when capturing error '#{exception}':", e)
  nil
end
reset!() click to toggle source
# File lib/ting_yun/agent/collector/error_collector.rb, line 220
def reset!
  @error_trace_array.reset!
  @external_error_array.reset!
  nil
end
sense_method(object, method) click to toggle source

calls a method on an object, if it responds to it - used for detection and soft fail-safe. Returns nil if the method does not exist

# File lib/ting_yun/agent/collector/error_collector.rb, line 197
def sense_method(object, method)
  object.send(method) if object.respond_to?(method)
end
skip_notice_error?(exception) click to toggle source
# File lib/ting_yun/agent/collector/error_collector.rb, line 190
def skip_notice_error?(exception)
  exception_tagged?(exception)
end