Class: Aidp::Harness::ProviderMetrics

Inherits:
Object
  • Object
show all
Includes:
RescueLogging
Defined in:
lib/aidp/harness/provider_metrics.rb

Overview

Persists provider metrics and rate limit information to disk Enables the provider dashboard to display real-time state

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from RescueLogging

__log_rescue_impl, log_rescue, #log_rescue

Constructor Details

#initialize(project_dir) ⇒ ProviderMetrics

Returns a new instance of ProviderMetrics.



16
17
18
19
20
21
# File 'lib/aidp/harness/provider_metrics.rb', line 16

def initialize(project_dir)
  @project_dir = project_dir
  @metrics_file = File.join(project_dir, ".aidp", "provider_metrics.yml")
  @rate_limit_file = File.join(project_dir, ".aidp", "provider_rate_limits.yml")
  ensure_directory
end

Instance Attribute Details

#metrics_fileObject (readonly)

Returns the value of attribute metrics_file.



14
15
16
# File 'lib/aidp/harness/provider_metrics.rb', line 14

def metrics_file
  @metrics_file
end

#project_dirObject (readonly)

Returns the value of attribute project_dir.



14
15
16
# File 'lib/aidp/harness/provider_metrics.rb', line 14

def project_dir
  @project_dir
end

#rate_limit_fileObject (readonly)

Returns the value of attribute rate_limit_file.



14
15
16
# File 'lib/aidp/harness/provider_metrics.rb', line 14

def rate_limit_file
  @rate_limit_file
end

Instance Method Details

#clearObject

Clear all persisted metrics



76
77
78
79
# File 'lib/aidp/harness/provider_metrics.rb', line 76

def clear
  File.delete(@metrics_file) if File.exist?(@metrics_file)
  File.delete(@rate_limit_file) if File.exist?(@rate_limit_file)
end

#load_metricsObject

Load provider metrics from disk



36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/aidp/harness/provider_metrics.rb', line 36

def load_metrics
  return {} unless File.exist?(@metrics_file)

  data = YAML.safe_load_file(@metrics_file, permitted_classes: [Time, Date, Symbol], aliases: true)
  return {} unless data.is_a?(Hash)

  # Convert ISO8601 strings back to Time objects
  deserialize_metrics(data)
rescue => e
  log_rescue(e, component: "provider_metrics", action: "load_metrics", fallback: {})
  {}
end

#load_rate_limitsObject

Load rate limit information from disk



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/aidp/harness/provider_metrics.rb', line 62

def load_rate_limits
  return {} unless File.exist?(@rate_limit_file)

  data = YAML.safe_load_file(@rate_limit_file, permitted_classes: [Time, Date, Symbol], aliases: true)
  return {} unless data.is_a?(Hash)

  # Convert ISO8601 strings back to Time objects
  deserialize_rate_limits(data)
rescue => e
  log_rescue(e, component: "provider_metrics", action: "load_rate_limits", fallback: {})
  {}
end

#save_metrics(metrics_hash) ⇒ Object

Save provider metrics to disk



24
25
26
27
28
29
30
31
32
33
# File 'lib/aidp/harness/provider_metrics.rb', line 24

def save_metrics(metrics_hash)
  return if metrics_hash.nil? || metrics_hash.empty?

  # Convert Time objects to ISO8601 strings for YAML serialization
  serializable_metrics = serialize_metrics(metrics_hash)

  File.write(@metrics_file, YAML.dump(serializable_metrics))
rescue => e
  log_rescue(e, component: "provider_metrics", action: "save_metrics", fallback: nil)
end

#save_rate_limits(rate_limit_hash) ⇒ Object

Save rate limit information to disk



50
51
52
53
54
55
56
57
58
59
# File 'lib/aidp/harness/provider_metrics.rb', line 50

def save_rate_limits(rate_limit_hash)
  return if rate_limit_hash.nil? || rate_limit_hash.empty?

  # Convert Time objects to ISO8601 strings for YAML serialization
  serializable_rate_limits = serialize_rate_limits(rate_limit_hash)

  File.write(@rate_limit_file, YAML.dump(serializable_rate_limits))
rescue => e
  log_rescue(e, component: "provider_metrics", action: "save_rate_limits", fallback: nil)
end