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
Public Class Methods
# 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
# 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
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
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
*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
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
# File lib/ting_yun/agent/collector/error_collector.rb, line 220 def reset! @error_trace_array.reset! @external_error_array.reset! nil end
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
# File lib/ting_yun/agent/collector/error_collector.rb, line 190 def skip_notice_error?(exception) exception_tagged?(exception) end