Class: Railswatch::Pruner

Inherits:
Object
  • Object
show all
Defined in:
lib/railswatch/pruner.rb

Constant Summary collapse

DEFAULT_BATCH_SIZE =
1_000
MODEL_TYPES =
{
  requests: 'RequestRecord',
  sidekiq: 'SidekiqRecord',
  delayed_job: 'DelayedJobRecord',
  grape: 'GrapeRecord',
  rake: 'RakeRecord',
  custom: 'CustomRecord',
  resources: 'ResourceRecord',
  traces: 'TraceRecord',
  events: 'EventRecord'
}.freeze

Class Method Summary collapse

Class Method Details

.call(batch_size: DEFAULT_BATCH_SIZE) ⇒ Object



19
20
21
22
23
24
# File 'lib/railswatch/pruner.rb', line 19

def self.call(batch_size: DEFAULT_BATCH_SIZE)
  MODEL_TYPES.each_with_object({}) do |(type, class_name), results|
    deleted = deleted_records(type, class_name, batch_size)
    results[type] = deleted unless deleted.nil?
  end
end

.delete_in_batches(model, threshold, batch_size) ⇒ Object



36
37
38
39
40
41
42
43
44
45
# File 'lib/railswatch/pruner.rb', line 36

def self.delete_in_batches(model, threshold, batch_size)
  deleted = 0

  loop do
    ids = model.where('occurred_at < ?', threshold).limit(batch_size).pluck(:id)
    break deleted if ids.empty?

    deleted += model.where(id: ids).delete_all
  end
end

.deleted_records(type, class_name, batch_size) ⇒ Object



26
27
28
29
30
31
32
33
34
# File 'lib/railswatch/pruner.rb', line 26

def self.deleted_records(type, class_name, batch_size)
  retention = Railswatch.retention[type]
  return if retention.nil?

  model = Railswatch::Models.const_get(class_name)
  threshold = Railswatch::Utils.kind_of_now - retention

  delete_in_batches(model, threshold, batch_size)
end