Class: Aidp::Database::Repositories::ProviderMetricsRepository

Inherits:
Aidp::Database::Repository show all
Defined in:
lib/aidp/database/repositories/provider_metrics_repository.rb

Overview

Repository for provider_metrics and provider_rate_limits tables Replaces provider_metrics.yml and provider_rate_limits.yml

Instance Attribute Summary

Attributes inherited from Aidp::Database::Repository

#project_dir, #table_name

Instance Method Summary collapse

Constructor Details

#initialize(project_dir: Dir.pwd) ⇒ ProviderMetricsRepository

Returns a new instance of ProviderMetricsRepository.



11
12
13
# File 'lib/aidp/database/repositories/provider_metrics_repository.rb', line 11

def initialize(project_dir: Dir.pwd)
  super(project_dir: project_dir, table_name: "provider_metrics")
end

Instance Method Details

#clearObject

Clear all metrics and rate limits



153
154
155
156
157
158
159
# File 'lib/aidp/database/repositories/provider_metrics_repository.rb', line 153

def clear
  transaction do
    execute("DELETE FROM provider_metrics WHERE project_dir = ?", [project_dir])
    execute("DELETE FROM provider_rate_limits WHERE project_dir = ?", [project_dir])
  end
  Aidp.log_debug("provider_metrics_repository", "cleared")
end

#load_metricsHash

Load metrics for all providers

Returns:

  • (Hash)

    Map of provider_name => metrics hash



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/aidp/database/repositories/provider_metrics_repository.rb', line 40

def load_metrics
  # Get the latest metrics for each provider
  rows = query(
    <<~SQL,
      SELECT provider_name, model_name, metrics, recorded_at
      FROM provider_metrics
      WHERE project_dir = ?
      AND id IN (
        SELECT MAX(id) FROM provider_metrics
        WHERE project_dir = ?
        GROUP BY provider_name
      )
    SQL
    [project_dir, project_dir]
  )

  result = {}
  rows.each do |row|
    provider = row["provider_name"]
    metrics = deserialize_json(row["metrics"]) || {}
    result[provider] = symbolize_keys(metrics)
    result[provider][:recorded_at] = row["recorded_at"]
  end

  result
end

#load_provider_metrics(provider_name) ⇒ Hash

Load metrics for a specific provider

Parameters:

  • provider_name (String)

    Provider name

Returns:

  • (Hash)

    Metrics



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/aidp/database/repositories/provider_metrics_repository.rb', line 71

def load_provider_metrics(provider_name)
  row = query_one(
    <<~SQL,
      SELECT metrics, recorded_at
      FROM provider_metrics
      WHERE project_dir = ? AND provider_name = ?
      ORDER BY recorded_at DESC
      LIMIT 1
    SQL
    [project_dir, provider_name]
  )

  return {} unless row

  metrics = deserialize_json(row["metrics"]) || {}
  symbolize_keys(metrics)
end

#load_provider_rate_limits(provider_name) ⇒ Hash

Load rate limits for a specific provider

Parameters:

  • provider_name (String)

    Provider name

Returns:

  • (Hash)

    Rate limits



140
141
142
143
144
145
146
147
148
149
150
# File 'lib/aidp/database/repositories/provider_metrics_repository.rb', line 140

def load_provider_rate_limits(provider_name)
  row = query_one(
    "SELECT rate_limit_info, updated_at FROM provider_rate_limits WHERE project_dir = ? AND provider_name = ?",
    [project_dir, provider_name]
  )

  return {} unless row

  limits = deserialize_json(row["rate_limit_info"]) || {}
  symbolize_keys_deep(limits)
end

#load_rate_limitsHash

Load rate limits for all providers

Returns:

  • (Hash)

    Map of provider_name => rate limits hash



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/aidp/database/repositories/provider_metrics_repository.rb', line 120

def load_rate_limits
  rows = query(
    "SELECT provider_name, model_name, rate_limit_info, updated_at FROM provider_rate_limits WHERE project_dir = ?",
    [project_dir]
  )

  result = {}
  rows.each do |row|
    provider = row["provider_name"]
    limits = deserialize_json(row["rate_limit_info"]) || {}
    result[provider] = symbolize_keys_deep(limits)
  end

  result
end

#metrics_history(provider_name, metric_type = nil, limit: 100) ⇒ Array<Hash>

Get metrics history for a provider

Parameters:

  • provider_name (String)

    Provider name

  • metric_type (String, nil) (defaults to: nil)

    Metric type to extract (optional)

  • limit (Integer) (defaults to: 100)

    Max records

Returns:

  • (Array<Hash>)

    Historical values



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/aidp/database/repositories/provider_metrics_repository.rb', line 167

def metrics_history(provider_name, metric_type = nil, limit: 100)
  rows = query(
    <<~SQL,
      SELECT metrics, recorded_at
      FROM provider_metrics
      WHERE project_dir = ? AND provider_name = ?
      ORDER BY recorded_at DESC
      LIMIT ?
    SQL
    [project_dir, provider_name, limit]
  )

  rows.map do |row|
    metrics = deserialize_json(row["metrics"]) || {}
    if metric_type
      {value: metrics[metric_type.to_s] || metrics[metric_type.to_sym], recorded_at: row["recorded_at"]}
    else
      {metrics: symbolize_keys(metrics), recorded_at: row["recorded_at"]}
    end
  end
end

#save_metrics(provider_name, metrics, model_name: nil) ⇒ Object

Save metrics for a provider

Parameters:

  • provider_name (String)

    Provider name

  • metrics (Hash)

    Metrics data (success_count, error_count, avg_latency, etc.)

  • model_name (String, nil) (defaults to: nil)

    Optional model name



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/aidp/database/repositories/provider_metrics_repository.rb', line 20

def save_metrics(provider_name, metrics, model_name: nil)
  now = current_timestamp

  # Convert Time values to ISO8601 strings
  normalized = metrics.transform_values do |value|
    value.is_a?(Time) ? value.iso8601 : value
  end

  execute(
    insert_sql([:project_dir, :provider_name, :model_name, :metrics, :recorded_at]),
    [project_dir, provider_name, model_name, serialize_json(normalized), now]
  )

  Aidp.log_debug("provider_metrics_repository", "saved_metrics",
    provider: provider_name, metrics_count: metrics.size)
end

#save_rate_limits(provider_name, rate_limits, model_name: nil) ⇒ Object

Save rate limit info for a provider

Parameters:

  • provider_name (String)

    Provider name

  • rate_limits (Hash)

    Rate limit data

  • model_name (String, nil) (defaults to: nil)

    Optional model name



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/aidp/database/repositories/provider_metrics_repository.rb', line 94

def save_rate_limits(provider_name, rate_limits, model_name: nil)
  now = current_timestamp

  # Convert Time values to ISO8601 strings
  normalized = rate_limits.transform_values do |info|
    next info unless info.is_a?(Hash)

    info.transform_values do |value|
      value.is_a?(Time) ? value.iso8601 : value
    end
  end

  upsert_rate_limit(
    provider_name: provider_name,
    model_name: model_name,
    rate_limit_info: serialize_json(normalized),
    updated_at: now
  )

  Aidp.log_debug("provider_metrics_repository", "saved_rate_limits",
    provider: provider_name)
end