Module: Legion::DigitalWorker::ValueMetrics

Defined in:
lib/legion/digital_worker/value_metrics.rb

Constant Summary collapse

METRIC_TYPES =
%i[counter gauge duration].freeze

Class Method Summary collapse

Class Method Details

.for_worker(worker_id:, metric_name: nil, since: nil) ⇒ Object



43
44
45
46
47
48
49
50
# File 'lib/legion/digital_worker/value_metrics.rb', line 43

def self.for_worker(worker_id:, metric_name: nil, since: nil)
  return [] unless data_connected?

  ds = Legion::Data.connection[:value_metrics].where(worker_id: worker_id)
  ds = ds.where(metric_name: metric_name.to_s) if metric_name
  ds = ds.where { recorded_at >= since } if since
  ds.order(:recorded_at).all
end

.record(worker_id:, metric_name:, metric_type:, value:, metadata: {}) ⇒ Object

Raises:

  • (ArgumentError)


8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/legion/digital_worker/value_metrics.rb', line 8

def self.record(worker_id:, metric_name:, metric_type:, value:, metadata: {})
  raise ArgumentError, "invalid metric_type: #{metric_type}" unless METRIC_TYPES.include?(metric_type)

  record = {
    worker_id:   worker_id,
    metric_name: metric_name.to_s,
    metric_type: metric_type.to_s,
    value:       value.to_f,
    metadata:    Legion::JSON.dump(),
    recorded_at: Time.now.utc
  }

  Legion::Data.connection[:value_metrics].insert(record) if data_connected?

  Legion::Logging.debug "[value_metrics] recorded: worker=#{worker_id} #{metric_name}=#{value} (#{metric_type})"
  record
end

.summary(worker_id:) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/legion/digital_worker/value_metrics.rb', line 52

def self.summary(worker_id:)
  return {} unless data_connected?

  ds = Legion::Data.connection[:value_metrics].where(worker_id: worker_id)
  metrics = ds.select(:metric_name).distinct.select_map(:metric_name)

  metrics.each_with_object({}) do |name, acc|
    subset = ds.where(metric_name: name)
    acc[name] = {
      count:  subset.count,
      sum:    subset.sum(:value) || 0,
      avg:    subset.avg(:value)&.round(4) || 0,
      min:    subset.min(:value) || 0,
      max:    subset.max(:value) || 0,
      latest: latest_value(subset)
    }
  end
end