Commit 5f58ab9b authored by Paul Asmuth's avatar Paul Asmuth
Browse files

new widget api wip2

parent 1e3f65be
Loading
Loading
Loading
Loading
+3 −36
Original line number Diff line number Diff line
@@ -35,36 +35,14 @@ class FnordMetric::NumericGauge < FnordMetric::MultiGauge
      :height => 350
    )

    @overview_timeline.on(:values_at) do |_times, _tick|
      Hash[_times.map{ |_t| [_t, 23] }]
    end

    @overview_timeline.on(:values_at) do |_series, _ticks, _tick|
      Hash[_ticks.map{ |_t| [_t, 23] }]
    end


  def announce(event)
    sleep 2
    resp = if event["widget"] == "total_timeline"
      event.merge(
        :values => Hash[series_count_gauges.map do |_skey, _series|
          gauge = fetch_gauge(_series[event["tick"].to_i])
          vals = {}
          event["ticks"].each{ |_tick| vals[_tick.to_i] ||= 0 } 
          vals.merge!(gauge.values_at(event["ticks"]))
          [_skey, vals]
        end]
      )
  end

    if resp
      resp.merge!(
        "_class" => "response",
        "_sender" => @uuid
      )
      resp.delete("ticks")
      respond(resp)
    end
  end


  def incr(*args)
    ctx = args.delete_at(0)
@@ -94,17 +72,6 @@ class FnordMetric::NumericGauge < FnordMetric::MultiGauge
    end
  end


  def fetch_gauge(series, tick = nil)
    if series.is_a?(FnordMetric::Gauge)
      series
    elsif series.starts_with?("count-")
      series_count_gauges[series[6..-1].to_sym][tick]
    end.tap do |gauge|
      gauge.try(:add_redis, @opts[:redis])
    end
  end

private

  def series_count_gauges
+21 −9
Original line number Diff line number Diff line
@@ -25,22 +25,34 @@ class FnordMetric::MultiGauge < FnordMetric::RemoteGauge
  end

  def react(ev)
    render! if ev["_class"] == "render_request" && ev["__to_self"]
    #process!(ev)  if ev["_class"] == "widget_request"
    render_self!       if ev["_class"] == "render_request"
    render_widget!(ev) if ev["_class"] == "widget_request"
  end

  def render!
    respond(
      :_class => "render_response", 
      :payload => {
private

  def render_self!
    payload = {
      :title => title,
      :gauge_key => name,
      :widgets => Hash[@widgets.map{|k,w|[k,w.opts]}]
    }

    respond(
      :_class => "render_response", 
      :payload => payload
    )
  end

private
  def render_widget!(ev)
    puts ev.inspect

    if @widgets.has_key?(ev["widget_key"])
      respond(@widgets[ev["widget_key"]].react(ev).merge(
        :_class => "widget_response"
      ))
    end
  end

  def widget(klass, opts)
    opts[:gauge_key] ||= name
+2 −5
Original line number Diff line number Diff line
@@ -11,12 +11,9 @@ class FnordMetric::RemoteGauge
    FnordMetric.log "gauge '#{name}' started"

  	@backend.subscribe do |message|
      if message["_sender"] != @uuid 
        message["__to_self"] = (message["_channel"] == name.to_s)
      _react(message)
    end
  end
  end

  def hangup
    @backend.hangup
@@ -27,7 +24,7 @@ private

  def _react(ev)
    return discover!(ev) if ev["_class"] == "discover_request"
    react(ev)
    react(ev) if ev["_sender"] != @uuid
  end

  def discover!(event)
+15 −38
Original line number Diff line number Diff line
class FnordMetric::TimelineWidget  < FnordMetric::Widget
  
  def data
    @series_colors = ["#FACE4F", "#42436B", "#CD645A", "#2F635E"]
  @@series_colors = ["#FACE4F", "#42436B", "#CD645A", "#2F635E"]
  
    super.merge(
      :autoupdate => (@opts[:autoupdate] || 60),
      :include_current => !!@opts[:include_current],
      :plot_style => (@opts[:plot_style] || 'line'),
      :render_target => @opts[:render_target],
      :height => @opts[:height]
    ).tap do |dat|
      dat.merge!(
        :gauges => gauges.map(&:name),
        :gauge_titles => gauge_titles,
        :start_timestamp => ticks.first,
        :end_timestamp => ticks.last,
        :tick => tick
      ) if has_tick?
      dat.merge!(
        :gauges => @opts[:_gauges],
        :gauge_titles => @opts[:_gauge_titles],
        :tick => @opts[:ticks].first,
        :key_prefix => @opts[:key_prefix],
        :ticks => @opts[:ticks]
      ) unless has_tick?
    end
  end

  def gauge_titles
    {}.tap do |_hash|
      gauges.each do |gauge|
        _hash.merge!(gauge.name => gauge.title)
      end
    end
  end
  def react(ev)
    ev["ticks"] = ev["ticks"].map(&:to_i) if ev["ticks"]
    ev["tick"] = ev["tick"].to_i if ev["tick"]

  def has_tick?
    @opts[:multi_tick] ? false : true
    {
      :tick => ev["tick"],
      :values => Hash[@opts[:series].map{ |skey|
        vals =  call_handler(:values_at, skey, ev["ticks"], ev["tick"]) 
        ev["ticks"].each{ |_tick| vals[_tick.to_i] ||= 0 }
        [skey, vals]
      }]
    }
  end  

end
 No newline at end of file
+10 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ class FnordMetric::Widget
  attr_accessor  :key

  def initialize(opts={})
    @handlers = {}
    @opts = opts
    @key = rand(8**32).to_s(36)

@@ -12,6 +13,8 @@ class FnordMetric::Widget
  end

  def on(handler, &block)
    @handlers[handler.to_s] = block
    self
  end

  def opts
@@ -23,4 +26,11 @@ class FnordMetric::Widget
    }.merge(@opts)
  end

private

  def call_handler(handler, *args)
    raise "handler not defined" unless @handlers.has_key?(handler.to_s)
    @handlers[handler.to_s].call(*args)
  end

end
 No newline at end of file
Loading