Class: PerformanceMetric

Inherits:
ApplicationRecord
  • Object
show all
Defined in:
lib/generators/decision_agent/install/templates/performance_metric.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.average_duration(time_range: 3600) ⇒ Object

Performance statistics



16
17
18
# File 'lib/generators/decision_agent/install/templates/performance_metric.rb', line 16

def self.average_duration(time_range: 3600)
  recent(time_range).where.not(duration_ms: nil).average(:duration_ms).to_f
end

.average_duration_by_time(bucket_size: 60, time_range: 3600) ⇒ Object

Time series aggregation



61
62
63
64
65
66
# File 'lib/generators/decision_agent/install/templates/performance_metric.rb', line 61

def self.average_duration_by_time(bucket_size: 60, time_range: 3600)
  recent(time_range)
    .where.not(duration_ms: nil)
    .group("(EXTRACT(EPOCH FROM created_at)::bigint / #{bucket_size}) * #{bucket_size}")
    .average(:duration_ms)
end

.count_by_operation(time_range: 3600) ⇒ Object



56
57
58
# File 'lib/generators/decision_agent/install/templates/performance_metric.rb', line 56

def self.count_by_operation(time_range: 3600)
  recent(time_range).group(:operation).count
end

.max_duration(time_range: 3600) ⇒ Object



40
41
42
# File 'lib/generators/decision_agent/install/templates/performance_metric.rb', line 40

def self.max_duration(time_range: 3600)
  recent(time_range).maximum(:duration_ms).to_f
end

.min_duration(time_range: 3600) ⇒ Object



44
45
46
# File 'lib/generators/decision_agent/install/templates/performance_metric.rb', line 44

def self.min_duration(time_range: 3600)
  recent(time_range).minimum(:duration_ms).to_f
end

.p50(time_range: 3600) ⇒ Object



28
29
30
# File 'lib/generators/decision_agent/install/templates/performance_metric.rb', line 28

def self.p50(time_range: 3600)
  percentile(0.50, time_range: time_range)
end

.p95(time_range: 3600) ⇒ Object



32
33
34
# File 'lib/generators/decision_agent/install/templates/performance_metric.rb', line 32

def self.p95(time_range: 3600)
  percentile(0.95, time_range: time_range)
end

.p99(time_range: 3600) ⇒ Object



36
37
38
# File 'lib/generators/decision_agent/install/templates/performance_metric.rb', line 36

def self.p99(time_range: 3600)
  percentile(0.99, time_range: time_range)
end

.percentile(pct, time_range: 3600) ⇒ Object



20
21
22
23
24
25
26
# File 'lib/generators/decision_agent/install/templates/performance_metric.rb', line 20

def self.percentile(pct, time_range: 3600)
  durations = recent(time_range).where.not(duration_ms: nil).order(:duration_ms).pluck(:duration_ms)
  return 0.0 if durations.empty?

  index = ((durations.length - 1) * pct).ceil
  durations[index].to_f
end

.success_rate(time_range: 3600) ⇒ Object



48
49
50
51
52
53
54
# File 'lib/generators/decision_agent/install/templates/performance_metric.rb', line 48

def self.success_rate(time_range: 3600)
  total = recent(time_range).where.not(status: nil).count
  return 0.0 if total.zero?

  successful_count = recent(time_range).successful.count
  successful_count.to_f / total
end

Instance Method Details

#parsed_metadataObject

Parse JSON metadata field



69
70
71
72
73
74
75
# File 'lib/generators/decision_agent/install/templates/performance_metric.rb', line 69

def 
  return {} if .nil?

  JSON.parse(, symbolize_names: true)
rescue JSON::ParserError
  {}
end