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
- .for_worker(worker_id:, metric_name: nil, since: nil) ⇒ Object
- .record(worker_id:, metric_name:, metric_type:, value:, metadata: {}) ⇒ Object
- .summary(worker_id:) ⇒ Object
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
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 |