Class: SoarAuditingProvider::AuditingWorker

Inherits:
SoarThreadWorker::ThreadWorker
  • Object
show all
Defined in:
lib/soar_auditing_provider/auditing_worker.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeAuditingWorker

Returns a new instance of AuditingWorker.



13
14
15
16
17
18
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 13

def initialize
  @queue = Queue.new
  @start_mutex = Mutex.new
  @queue_mutex = Mutex.new
  initialize_metrics
end

Instance Attribute Details

#dequeued_auditsObject (readonly)

Returns the value of attribute dequeued_audits.



9
10
11
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 9

def dequeued_audits
  @dequeued_audits
end

#failed_audit_attemptsObject (readonly)

Returns the value of attribute failed_audit_attempts.



5
6
7
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 5

def failed_audit_attempts
  @failed_audit_attempts
end

#latest_failed_audit_error_messageObject (readonly)

Returns the value of attribute latest_failed_audit_error_message.



7
8
9
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 7

def latest_failed_audit_error_message
  @latest_failed_audit_error_message
end

#latest_failed_audit_timestampObject (readonly)

Returns the value of attribute latest_failed_audit_timestamp.



6
7
8
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 6

def latest_failed_audit_timestamp
  @latest_failed_audit_timestamp
end

#latest_successful_audit_timespanObject (readonly)

Returns the value of attribute latest_successful_audit_timespan.



10
11
12
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 10

def latest_successful_audit_timespan
  @latest_successful_audit_timespan
end

#latest_successful_audit_timestampObject (readonly)

Returns the value of attribute latest_successful_audit_timestamp.



11
12
13
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 11

def latest_successful_audit_timestamp
  @latest_successful_audit_timestamp
end

#successful_auditsObject (readonly)

Returns the value of attribute successful_audits.



8
9
10
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 8

def successful_audits
  @successful_audits
end

Instance Method Details

#configure(queue_worker_configuration:, auditor_audit_method:) ⇒ Object



20
21
22
23
24
25
26
27
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 20

def configure(queue_worker_configuration: ,auditor_audit_method: )
  validate_configuration(queue_worker_configuration)
  @maximum_queue_size = queue_worker_configuration['queue_size'].to_i
  @initial_back_off_in_seconds = queue_worker_configuration['initial_back_off_in_seconds'].to_i
  @back_off_multiplier = queue_worker_configuration['back_off_multiplier'].to_i
  @maximum_back_off_attempts = queue_worker_configuration['back_off_attempts'].to_i
  @auditor_audit_method = auditor_audit_method
end

#enqueue(level, data) ⇒ Object



29
30
31
32
33
34
35
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 29

def enqueue(level, data)
  @queue_mutex.synchronize {
    raise AuditingOverflowError if @queue.size >= @maximum_queue_size
    @queue.push({:level => level, :data => data})
    start
  }
end

#executeObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 43

def execute
  audit_event = @queue.pop
  @dequeued_audits += 1
  failed_before = false
  begin
    if @stopping
      @queue.push(audit_event) if audit_event #push the event back into the queue so that fallback flush mechanism can deal with this audit event
      return true #indicates to thread worder that we are done executing since we are in the process of stopping
    end
    exponential_back_off(start_at_last_attempt: failed_before) {
      time_before_audit = Time.now
      @auditor_audit_method.call(audit_event[:level],audit_event[:data])
      @latest_successful_audit_timespan = (Time.now - time_before_audit).round(3)
      @latest_successful_audit_timestamp = Time.now.utc.iso8601(3)
      @successful_audits += 1
    }
  rescue Exception => e
    print_exception_with_message_to_stderr(nil,e)
    failed_before = true
    retry
  end

  @queue_mutex.synchronize {
    return false if not @queue.empty? #indicates to thread worker that we are not done executing since the queue is not empty
    stop #explicitly stop the thread so that the stop occur automatically along with queue operations.
    return true #indicates to thread worker that we are done executing since the queue is empty
  }
end

#flush(timeout = 1) ⇒ Object



72
73
74
75
76
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 72

def flush(timeout = 1)
  start
  wait_for_worker_to_clear_queue(timeout)
  fallback_flush_to_stderr if @queue.size > 0
end

#startObject



37
38
39
40
41
# File 'lib/soar_auditing_provider/auditing_worker.rb', line 37

def start
  @start_mutex.synchronize {
    super if not running?
  }
end