class Salus::Metric
Constants
- STORAGE_DEPTH
- Value
Public Class Methods
descendants()
click to toggle source
# File lib/salus/metric.rb, line 36 def self.descendants @@descendants || [] end
inherited(subclass)
click to toggle source
# File lib/salus/metric.rb, line 31 def self.inherited(subclass) @@descendants ||= [] @@descendants << subclass end
new(defaults={})
click to toggle source
# File lib/salus/metric.rb, line 40 def initialize(defaults={}) @values = Fifo.new(self.class::STORAGE_DEPTH) @opts = defaults.clone @attributes = {} @last_calced_value = nil @last_calced_ts = nil @needs_update = true option :mute, TrueClass, FalseClass option :value, Numeric option :timestamp, Numeric option :ttl, Numeric @opts.each do |k, v| validate(k, v) end end
Public Instance Methods
clear()
click to toggle source
# File lib/salus/metric.rb, line 147 def clear synchronize do @last_calced_value = nil @last_calced_ts = nil @needs_update = true @values.clear end end
expired?(ts=nil)
click to toggle source
# File lib/salus/metric.rb, line 107 def expired?(ts=nil) synchronize do if @values.empty? true else @values.last.expired?(ts) end end end
load(data)
click to toggle source
# File lib/salus/metric.rb, line 117 def load(data) return if data.nil? return if data.empty? return unless data.key?(:values) synchronize do if data.key?(:mute) @opts[:mute] = data[:mute] end data[:values].each do |v| @values << Value.new(v[:value], v[:timestamp], v[:ttl]) end @needs_update = true end end
mute?()
click to toggle source
# File lib/salus/metric.rb, line 58 def mute? synchronize { @opts[:mute] || false } end
push(opts={}) { || ... }
click to toggle source
# File lib/salus/metric.rb, line 62 def push(opts={}, &block) opts = {} unless opts.is_a?(Hash) synchronize do opts.each do |k, v| validate(k, v) @opts[k] = v unless [:value, :ttl, :timestamp].include?(k) end if block_given? v = begin yield rescue Exception => e log DEBUG, e nil end validate(:value, v) opts[:value] = v end @values << Value.new(opts[:value], opts[:timestamp] || Time.now.to_f, opts[:ttl] || @opts[:ttl]) @needs_update = true end end
save()
click to toggle source
# File lib/salus/metric.rb, line 132 def save to_h end
timestamp()
click to toggle source
# File lib/salus/metric.rb, line 87 def timestamp synchronize do calc if @needs_update @last_calced_ts end end
to_h()
click to toggle source
# File lib/salus/metric.rb, line 136 def to_h return {} if @values.empty? synchronize do { type: self.class.name.split('::').last, mute: mute?, values: @values.map { |x| x.to_h } } end end
ttl()
click to toggle source
# File lib/salus/metric.rb, line 101 def ttl synchronize do @values.empty? ? nil : @values.last.ttl end end
value()
click to toggle source
# File lib/salus/metric.rb, line 94 def value synchronize do calc if @needs_update @last_calced_value end end
Protected Instance Methods
calc()
click to toggle source
# File lib/salus/metric.rb, line 170 def calc if @values.empty? @last_calced_ts = nil @last_calced_value = nil @needs_update = true else @last_calced_ts = @values.last.timestamp @last_calced_value = @values.last.value @needs_update = false end end
option(key, *types)
click to toggle source
# File lib/salus/metric.rb, line 157 def option(key, *types) @attributes[key] = types end
validate(key, value)
click to toggle source
# File lib/salus/metric.rb, line 161 def validate(key, value) return if value.nil? return unless @attributes.key?(key) unless @attributes[key].any? { |t| value.is_a?(t) } raise ArgumentError, "Option #{key} should be #{@attributes[key].join(" or ")}" end value end