Class: DecisionAgent::Monitoring::Storage::ActiveRecordAdapter

Inherits:
BaseAdapter
  • Object
show all
Defined in:
lib/decision_agent/monitoring/storage/activerecord_adapter.rb

Overview

ActiveRecord adapter for persistent database storage

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeActiveRecordAdapter

Returns a new instance of ActiveRecordAdapter.



10
11
12
13
# File 'lib/decision_agent/monitoring/storage/activerecord_adapter.rb', line 10

def initialize
  super
  validate_models!
end

Class Method Details

.available?Boolean

Returns:

  • (Boolean)


125
126
127
128
129
130
131
# File 'lib/decision_agent/monitoring/storage/activerecord_adapter.rb', line 125

def self.available?
  defined?(ActiveRecord) &&
    defined?(::DecisionLog) &&
    defined?(::EvaluationMetric) &&
    defined?(::PerformanceMetric) &&
    defined?(::ErrorMetric)
end

Instance Method Details

#cleanup(older_than:) ⇒ Object



110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/decision_agent/monitoring/storage/activerecord_adapter.rb', line 110

def cleanup(older_than:)
  cutoff_time = Time.now - older_than
  count = 0

  count += ::DecisionLog.where("created_at < ?", cutoff_time).delete_all
  count += ::EvaluationMetric.where("created_at < ?", cutoff_time).delete_all
  count += ::PerformanceMetric.where("created_at < ?", cutoff_time).delete_all
  count += ::ErrorMetric.where("created_at < ?", cutoff_time).delete_all

  count
rescue StandardError => e
  warn "Failed to cleanup old metrics from database: #{e.message}"
  0
end

#metrics_countObject



98
99
100
101
102
103
104
105
106
107
108
# File 'lib/decision_agent/monitoring/storage/activerecord_adapter.rb', line 98

def metrics_count
  {
    decisions: ::DecisionLog.count,
    evaluations: ::EvaluationMetric.count,
    performance: ::PerformanceMetric.count,
    errors: ::ErrorMetric.count
  }
rescue StandardError => e
  warn "Failed to get metrics count from database: #{e.message}"
  { decisions: 0, evaluations: 0, performance: 0, errors: 0 }
end

#record_decision(decision, context, confidence: nil, evaluations_count: 0, duration_ms: nil, status: nil) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/decision_agent/monitoring/storage/activerecord_adapter.rb', line 15

def record_decision(decision, context, confidence: nil, evaluations_count: 0, duration_ms: nil, status: nil)
  ::DecisionLog.create!(
    decision: decision,
    context: context.to_json,
    confidence: confidence,
    evaluations_count: evaluations_count,
    duration_ms: duration_ms,
    status: status
  )
rescue StandardError => e
  warn "Failed to record decision to database: #{e.message}"
end

#record_error(error_type, message: nil, stack_trace: nil, severity: nil, context: {}) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
# File 'lib/decision_agent/monitoring/storage/activerecord_adapter.rb', line 51

def record_error(error_type, message: nil, stack_trace: nil, severity: nil, context: {})
  ::ErrorMetric.create!(
    error_type: error_type,
    message: message,
    stack_trace: stack_trace&.to_json,
    severity: severity,
    context: context.to_json
  )
rescue StandardError => e
  warn "Failed to record error to database: #{e.message}"
end

#record_evaluation(evaluator_name, score: nil, success: nil, duration_ms: nil, details: {}) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
# File 'lib/decision_agent/monitoring/storage/activerecord_adapter.rb', line 28

def record_evaluation(evaluator_name, score: nil, success: nil, duration_ms: nil, details: {})
  ::EvaluationMetric.create!(
    evaluator_name: evaluator_name,
    score: score,
    success: success,
    duration_ms: duration_ms,
    details: details.to_json
  )
rescue StandardError => e
  warn "Failed to record evaluation to database: #{e.message}"
end

#record_performance(operation, duration_ms: nil, status: nil, metadata: {}) ⇒ Object



40
41
42
43
44
45
46
47
48
49
# File 'lib/decision_agent/monitoring/storage/activerecord_adapter.rb', line 40

def record_performance(operation, duration_ms: nil, status: nil, metadata: {})
  ::PerformanceMetric.create!(
    operation: operation,
    duration_ms: duration_ms,
    status: status,
    metadata: .to_json
  )
rescue StandardError => e
  warn "Failed to record performance to database: #{e.message}"
end

#statistics(time_range: 3600) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/decision_agent/monitoring/storage/activerecord_adapter.rb', line 63

def statistics(time_range: 3600)
  decisions = ::DecisionLog.recent(time_range)
  evaluations = ::EvaluationMetric.recent(time_range)
  performance = ::PerformanceMetric.recent(time_range)
  errors = ::ErrorMetric.recent(time_range)

  {
    decisions: decision_statistics(decisions, time_range),
    evaluations: evaluation_statistics(evaluations),
    performance: performance_statistics(performance, time_range),
    errors: error_statistics(errors)
  }
rescue StandardError => e
  warn "Failed to retrieve statistics from database: #{e.message}"
  default_statistics
end

#time_series(metric_type, bucket_size: 60, time_range: 3600) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/decision_agent/monitoring/storage/activerecord_adapter.rb', line 80

def time_series(metric_type, bucket_size: 60, time_range: 3600)
  case metric_type
  when :decisions
    decisions_time_series(bucket_size, time_range)
  when :evaluations
    evaluations_time_series(bucket_size, time_range)
  when :performance
    performance_time_series(bucket_size, time_range)
  when :errors
    errors_time_series(bucket_size, time_range)
  else
    { data: [], timestamps: [] }
  end
rescue StandardError => e
  warn "Failed to retrieve time series from database: #{e.message}"
  { data: [], timestamps: [] }
end