Class: TingYun::Agent::Collector::ErrorTraceArray
- Inherits:
-
Object
- Object
- TingYun::Agent::Collector::ErrorTraceArray
- Defined in:
- lib/ting_yun/agent/collector/error_collector/error_trace_array.rb
Instance Method Summary collapse
-
#add_to_error_queue(noticed_error) ⇒ Object
Synchronizes adding an error to the error queue, and checks if the error queue is too long - if so, we drop the error on the floor after logging a warning.
- #enabled? ⇒ Boolean
-
#harvest! ⇒ Object
Get the errors currently queued up.
-
#initialize(capacity) ⇒ ErrorTraceArray
constructor
A new instance of ErrorTraceArray.
- #merge!(errors) ⇒ Object
-
#notice_agent_error(exception) ⇒ Object
see TingYun::Agent::Instance.error_collector.notice_agent_error.
-
#over_queue_limit?(message) ⇒ Boolean
checks the size of the error queue to make sure we are under the maximum limit, and logs a warning if we are over the limit.
- #reset! ⇒ Object
Constructor Details
#initialize(capacity) ⇒ ErrorTraceArray
Returns a new instance of ErrorTraceArray.
9 10 11 12 13 |
# File 'lib/ting_yun/agent/collector/error_collector/error_trace_array.rb', line 9 def initialize(capacity) @capacity = capacity @lock = Mutex.new @errors = [] end |
Instance Method Details
#add_to_error_queue(noticed_error) ⇒ Object
Synchronizes adding an error to the error queue, and checks if the error queue is too long - if so, we drop the error on the floor after logging a warning.
46 47 48 49 50 51 52 53 |
# File 'lib/ting_yun/agent/collector/error_collector/error_trace_array.rb', line 46 def add_to_error_queue(noticed_error) return unless enabled? @lock.synchronize do if !over_queue_limit?(noticed_error.) && !@errors.include?(noticed_error) @errors << noticed_error end end end |
#enabled? ⇒ Boolean
15 16 17 |
# File 'lib/ting_yun/agent/collector/error_collector/error_trace_array.rb', line 15 def enabled? ::TingYun::Agent.config[:'nbs.error_collector.enabled'] end |
#harvest! ⇒ Object
Get the errors currently queued up. Unsent errors are left over from a previous unsuccessful attempt to send them to the server.
35 36 37 38 39 40 41 |
# File 'lib/ting_yun/agent/collector/error_collector/error_trace_array.rb', line 35 def harvest! @lock.synchronize do errors = @errors @errors = [] errors end end |
#merge!(errors) ⇒ Object
19 20 21 22 23 |
# File 'lib/ting_yun/agent/collector/error_collector/error_trace_array.rb', line 19 def merge!(errors) errors.each do |error| add_to_error_queue(error) end end |
#notice_agent_error(exception) ⇒ Object
see TingYun::Agent::Instance.error_collector.notice_agent_error
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/ting_yun/agent/collector/error_collector/error_trace_array.rb', line 67 def notice_agent_error(exception) return unless exception.class < TingYun::Support::Exception::InternalAgentError TingYun::Agent.logger.info(exception) @lock.synchronize do return if @errors.any? { |err| err.exception_class_name == exception.class.name } trace = exception.backtrace || caller.dup noticed_error = TingYun::Agent::Collector::NoticedError.new("TingYun/AgentError", exception) noticed_error.stack_trace = trace @errors << noticed_error end rescue => e TingYun::Agent.logger.info("Unable to capture internal agent error due to an exception:", e) end |
#over_queue_limit?(message) ⇒ Boolean
checks the size of the error queue to make sure we are under the maximum limit, and logs a warning if we are over the limit.
58 59 60 61 62 63 64 |
# File 'lib/ting_yun/agent/collector/error_collector/error_trace_array.rb', line 58 def over_queue_limit?() over_limit = (@errors.reject { |err| err.is_internal }.length >= @capacity) if over_limit ::TingYun::Agent.logger.warn("The error reporting queue has reached #{@capacity}. The error detail for this and subsequent errors will not be transmitted to TingYun until the queued errors have been sent: #{}") end over_limit end |
#reset! ⇒ Object
26 27 28 29 30 |
# File 'lib/ting_yun/agent/collector/error_collector/error_trace_array.rb', line 26 def reset! @lock.synchronize do @errors = [] end end |