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