Sha256: dfcc2ab94fbea8a924e54afa4e21465fd7b2847d5299740c43cd65d60d59ecb6

Contents?: true

Size: 1.06 KB

Versions: 4

Compression:

Stored size: 1.06 KB

Contents

module Salus
  class Counter < Metric
    INT32_MAX = 2**32
    def initialize(defaults={})
      super(defaults)
      option :maximum, Numeric
      validate(:maximum, @opts[:maximum]) if @opts.key?(:maximum)
    end

    def calc
      super
      @last_calced_value = nil

      if @values.length < STORAGE_DEPTH
        return
      elsif @values[0].expired?(@values[1].timestamp)
        return
      elsif !@values[0].value.is_a?(Numeric)
        return
      elsif !@values[1].value.is_a?(Numeric)
        return
      end

      @last_calced_value = begin
        dt = (@values[1].timestamp - @values[0].timestamp)
        dv = if @values[1].value < @values[0].value
          w = @values[0].value < INT32_MAX ? 32 : 64
          (2**w - @values[0].value + @values[1].value)
        else
          (@values[1].value - @values[0].value)
        end
        r = (dt == 0) ? nil : (dv / dt)
        if @opts.key?(:maximum) && !r.nil? && r > @opts[:maximum]
          nil
        else
          r
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
salus-0.2.1 lib/salus/metric/counter.rb
salus-0.2.0 lib/salus/metric/counter.rb
salus-0.1.3 lib/salus/metric/counter.rb
salus-0.1.2 lib/salus/metric/counter.rb