Class: RobotLab::Audit::EventLog

Inherits:
Object
  • Object
show all
Defined in:
lib/robot_lab/audit/event_log.rb

Constant Summary collapse

SCHEMA =
<<~SQL
  CREATE TABLE IF NOT EXISTS network_runs (
    id            INTEGER PRIMARY KEY AUTOINCREMENT,
    run_id        TEXT    NOT NULL UNIQUE,
    network_name  TEXT,
    input         TEXT,
    result        TEXT,
    error_class   TEXT,
    error_message TEXT,
    started_at    TEXT    NOT NULL,
    finished_at   TEXT,
    duration_ms   REAL
  );

  CREATE TABLE IF NOT EXISTS audit_events (
    id            INTEGER PRIMARY KEY AUTOINCREMENT,
    run_id        TEXT,
    event_type    TEXT NOT NULL,
    robot_name    TEXT,
    tool_name     TEXT,
    input         TEXT,
    output        TEXT,
    error_class   TEXT,
    error_message TEXT,
    started_at    TEXT NOT NULL,
    finished_at   TEXT,
    duration_ms   REAL
  );
SQL
NETWORK_RUN_COLUMNS =
%i[id run_id network_name input result error_class
error_message started_at finished_at duration_ms].freeze
AUDIT_EVENT_COLUMNS =
%i[id run_id event_type robot_name tool_name input output
error_class error_message started_at finished_at duration_ms].freeze

Instance Method Summary collapse

Constructor Details

#initialize(db_path:) ⇒ EventLog

Returns a new instance of EventLog.



40
41
42
43
44
45
# File 'lib/robot_lab/audit/event_log.rb', line 40

def initialize(db_path:)
  path = File.expand_path(db_path.to_s)
  FileUtils.mkdir_p(File.dirname(path))
  @db = SQLite3::Database.new(path)
  @db.execute_batch(SCHEMA)
end

Instance Method Details

#events_for(run_id) ⇒ Object



76
77
78
79
# File 'lib/robot_lab/audit/event_log.rb', line 76

def events_for(run_id)
  rows = @db.execute('SELECT * FROM audit_events WHERE run_id = ? ORDER BY started_at', [run_id])
  rows.map { |r| row_to_hash(:audit_events, r) }
end

#network_runs(limit: 100) ⇒ Object



71
72
73
74
# File 'lib/robot_lab/audit/event_log.rb', line 71

def network_runs(limit: 100)
  rows = @db.execute('SELECT * FROM network_runs ORDER BY started_at DESC LIMIT ?', [limit])
  rows.map { |r| row_to_hash(:network_runs, r) }
end

#recent_errors(limit: 50) ⇒ Object



81
82
83
84
85
86
87
# File 'lib/robot_lab/audit/event_log.rb', line 81

def recent_errors(limit: 50)
  rows = @db.execute(
    'SELECT * FROM audit_events WHERE error_class IS NOT NULL ORDER BY started_at DESC LIMIT ?',
    [limit]
  )
  rows.map { |r| row_to_hash(:audit_events, r) }
end

#record_event(run_id:, event_type:, robot_name:, tool_name:, input:, output:, error_class:, error_message:, started_at:, finished_at:, duration_ms:) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
# File 'lib/robot_lab/audit/event_log.rb', line 59

def record_event(run_id:, event_type:, robot_name:, tool_name:, input:, output:,
                 error_class:, error_message:, started_at:, finished_at:, duration_ms:)
  @db.execute(
    "INSERT INTO audit_events
       (run_id, event_type, robot_name, tool_name, input, output,
        error_class, error_message, started_at, finished_at, duration_ms)
     VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
    [run_id, event_type, robot_name, tool_name, input, output,
     error_class, error_message, started_at, finished_at, duration_ms]
  )
end

#record_network_run(run_id:, network_name:, input:, result:, error_class:, error_message:, started_at:, finished_at:, duration_ms:) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
# File 'lib/robot_lab/audit/event_log.rb', line 47

def record_network_run(run_id:, network_name:, input:, result:, error_class:,
                       error_message:, started_at:, finished_at:, duration_ms:)
  @db.execute(
    "INSERT INTO network_runs
       (run_id, network_name, input, result, error_class, error_message,
        started_at, finished_at, duration_ms)
     VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
    [run_id, network_name, input, result, error_class, error_message,
     started_at, finished_at, duration_ms]
  )
end