Commit 1bfb30ba authored by Paul Asmuth's avatar Paul Asmuth
Browse files

timeseries handling

parent e6588e2d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -126,6 +126,7 @@ require "fnordmetric/gauges/distribution_gauge"
require "fnordmetric/gauges/eventfeed_gauge"
require "fnordmetric/context"
require "fnordmetric/histogram"
require "fnordmetric/timeseries"
require "fnordmetric/namespace"
require "fnordmetric/session"
require "fnordmetric/api"
+8 −0
Original line number Diff line number Diff line
@@ -23,3 +23,11 @@ end
class Symbol
  alias :intern :to_sym
end

class Range

  def size
    self.last - self.first
  end

end
+11 −19
Original line number Diff line number Diff line
@@ -20,30 +20,22 @@ class FnordMetric::TimeseriesGauge < FnordMetric::Gauge
    @series = Hash.new
    
    @opts[:series].each do |series|
      @series[series] = { :color => colors.unshift(colors.pop).first }
      ts = FnordMetric::Timeseries.new

      fraction_values_in(interval).each do |time, frac|
        ts.incr_fraction(time, *frac)
      end

    puts fraction_values_in(interval).inspect
      @series[series] = { 
        :color => colors.unshift(colors.pop).first,
        :data => [ ts.timeseries(interval, 3600), ts.timeseries(interval, tick) ],
        :data_block => lambda{ |c,d| c }
      }
    end

    @series_render = []
    @series_numbers = []

    # @series_render = series_gauges.map do |series, gauge|
    #   gauge_vals = gauge.values_in(interval).to_a

    #   @series_numbers[series][:total] = gauge_vals.inject(0) do |s, (t, v)|
    #     s += v.to_i
    #   end

    #   {
    #     :name  => series,
    #     :color => @series_colors[series],
    #     :data  => gauge_vals
    #       .sort{ |a,b| a[0] <=> b[0] }
    #       .map { |t,v| { :x => t, :y => v.to_i } }
    #   }
    # end

    render_page(:timeseries_gauge)
  end

+38 −4
Original line number Diff line number Diff line
class FnordMetric::Timeseries

  def initialize
  def initialize(timeline = {})
    @timeline = Hash.new{ |h,k| h[k] = [0,nil] }
    @timeline.merge!(timeline)
  end

  def incr_fraction(time, dividend, divisor)
  	incr_dividend(time, dividend) if dividend
  	incr_divisor(time, divisor) if divisor
  end

  def incr_dividend(time, value)
  	@timeline[time.to_i].first += value
  	@timeline[time.to_i][0] += value
  end

  def incr_divisor(time, value)
    @timeline[time.to_i].last ||= 0
    @timeline[time.to_i].last += value
    @timeline[time.to_i][-1] ||= 0
    @timeline[time.to_i][-1] += value
  end

  def timeseries(range, window, &block)
    res = Hash.new{ |h,k| h[k] = [0,0] }

    (((range.size)/window.to_f).ceil+1).times.map do |n| 
      res[((range.first+window*(n-1))/window.to_f).floor*window] = [0,0]
    end

    @timeline.each do |time, vals|
      next unless range.include?(time)
      wtime = (time/window.to_f).floor * window
      if block
        res[wtime] = block.call(*vals)
      else
        res[wtime][0] += vals[0]
        res[wtime][1] += vals[1]
      end
    end
    
    FnordMetric::Timeseries.new(res)
  end

  def to_json(&block)
    @timeline.to_a
      .sort{ |a,b| a[0] <=> b[0] }
      .map { |t,v| { :x => t, :y => block.call(*v), :v0 => v[0], :v1 => v[1] } }
      .to_json
  end

end
 No newline at end of file
+3 −1
Original line number Diff line number Diff line
@@ -49,5 +49,7 @@
    elem: $('.widget_timeseries'),
    height: 420,
    default_style: 'stack',
    series: #{@series_render.to_json}
    series: [#{@series.map{ |k,s| 
      "{ name: #{k.to_json}, color: '#{s[:color]}', data: #{s[:data][0].to_json(&s[:data_block])} }" 
    } * ","}]
  });