Class: Utility::ErrorMonitor

Inherits:
Object
  • Object
show all
Defined in:
lib/utility/error_monitor.rb

Defined Under Namespace

Classes: MaxErrorsExceededError, MaxErrorsInWindowExceededError, MaxSuccessiveErrorsExceededError, MonitoringError

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(max_errors: 1000, max_consecutive_errors: 10, max_error_ratio: 0.15, window_size: 100, error_queue_size: 20) ⇒ ErrorMonitor

Returns a new instance of ErrorMonitor.



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/utility/error_monitor.rb', line 30

def initialize(
  max_errors: 1000,
  max_consecutive_errors: 10,
  max_error_ratio: 0.15,
  window_size: 100,
  error_queue_size: 20
)
  @max_errors = max_errors
  @max_consecutive_errors = max_consecutive_errors
  @max_error_ratio = max_error_ratio
  @window_size = window_size
  @total_error_count = 0
  @success_count = 0
  @consecutive_error_count = 0
  @window_errors = Array.new(window_size) { false }
  @window_index = 0
  @last_error = nil
  @error_queue_size = error_queue_size
  @error_queue = []
end

Instance Attribute Details

#consecutive_error_countObject (readonly)

Returns the value of attribute consecutive_error_count.



28
29
30
# File 'lib/utility/error_monitor.rb', line 28

def consecutive_error_count
  @consecutive_error_count
end

#error_queueObject (readonly)

Returns the value of attribute error_queue.



28
29
30
# File 'lib/utility/error_monitor.rb', line 28

def error_queue
  @error_queue
end

#success_countObject (readonly)

Returns the value of attribute success_count.



28
29
30
# File 'lib/utility/error_monitor.rb', line 28

def success_count
  @success_count
end

#total_error_countObject (readonly)

Returns the value of attribute total_error_count.



28
29
30
# File 'lib/utility/error_monitor.rb', line 28

def total_error_count
  @total_error_count
end

Instance Method Details

#finalizeObject



71
72
73
74
75
76
# File 'lib/utility/error_monitor.rb', line 71

def finalize
  total_documents = @total_error_count + @success_count
  if total_documents > 0 && @total_error_count.to_f / total_documents > @max_error_ratio
    raise_with_last_cause(MaxErrorsInWindowExceededError.new("There were #{@total_error_count} errors out of #{total_documents} total documents", :tripped_by => @last_error))
  end
end

#note_error(error, id: Time.now.to_i) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/utility/error_monitor.rb', line 57

def note_error(error, id: Time.now.to_i)
  stack_trace = Utility::ExceptionTracking.generate_stack_trace(error)
  error_message = Utility::ExceptionTracking.generate_error_message(error, nil, nil)
  Utility::Logger.debug("Message id: #{id} - #{error_message}\n#{stack_trace}")
  @total_error_count += 1
  @consecutive_error_count += 1
  @error_queue << DocumentError.new(error.class.name, error_message, stack_trace, id)
  @error_queue = @error_queue.drop(1) if @error_queue.size > @error_queue_size
  track_window_error(true)
  @last_error = error

  raise_if_necessary
end

#note_successObject



51
52
53
54
55
# File 'lib/utility/error_monitor.rb', line 51

def note_success
  @consecutive_error_count = 0
  @success_count += 1
  track_window_error(false)
end