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

widget rpc wip

parent 287e4eb0
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -116,6 +116,9 @@ require "fnordmetric/acceptors/udp_acceptor"

require "fnordmetric/gauges/numeric_gauge"

require "fnordmetric/widgets/widget"
require "fnordmetric/widgets/timeline_widget"

require "fnordmetric/web/web"
require "fnordmetric/web/namespace"
require "fnordmetric/web/app"
@@ -126,14 +129,14 @@ require "fnordmetric/web/session"

require "fnordmetric/logger"


 # require "fnordmetric/context"

# require "fnordmetric/api"
# require "fnordmetric/udp_client"
# require "fnordmetric/worker"

# require "fnordmetric/widget"
# require "fnordmetric/timeline_widget"
# require "fnordmetric/"
# require "fnordmetric/numbers_widget"
# require "fnordmetric/bars_widget"
# require "fnordmetric/toplist_widget"
+19 −22
Original line number Diff line number Diff line
@@ -22,8 +22,26 @@ class FnordMetric::NumericGauge < FnordMetric::MultiGauge
    if opts[:series].size != opts[:series].uniq.size
      raise "numeric_gauge #{opts[:key]}: series are not unique"
    end


    @overview_timeline = timeline_widget(
      :tab => "Overview",
      :title => "Totals",
      :render_target => ".viewport_inner",
      :ticks => @opts[:ticks],
      :series => @opts[:series],
      :series_titles => Hash[@opts[:series].map{|s| [s, s]}],
      :include_current => true,
      :height => 350
    )

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

  end

 
  def announce(event)
    sleep 2
    resp = if event["widget"] == "total_timeline"
@@ -76,27 +94,6 @@ class FnordMetric::NumericGauge < FnordMetric::MultiGauge
    end
  end

  def render
    super.merge(
      :template => render_template(:numeric_gauge),
      :widgets => {
        :total_timeline => {
          :width => 100,
          :klass => "TimelineWidget",
          :title => "Totals",
          :multi_tick => true,
          :render_target => ".numgauge_widget_total_timeline",
          :ticks => @opts[:ticks],
          :series => @opts[:series],
          :series_titles => Hash[@opts[:series].map{|s| [s, s]}],
          :include_current => true,
          :channel => name,
          :widget_key => "total_timeline",
          :height => 350
        }
      }
    )
  end

  def fetch_gauge(series, tick = nil)
    if series.is_a?(FnordMetric::Gauge)
+23 −23
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ class FnordMetric::MultiGauge < FnordMetric::RemoteGauge
  def initialize(opts)
    opts.fetch(:key)
    @opts = opts
    @widgets = {}

    FnordMetric.register(self)
  end
@@ -23,40 +24,39 @@ class FnordMetric::MultiGauge < FnordMetric::RemoteGauge
    ["FIXPAUL-KEYPREFIX", "multigauge", name, _append].flatten.compact.join("-")
  end

  def render
    {
      :title => title,
      :gauge_key => name,
      :template => "--- not yet implemented ---",
      :widgets => {}
    }
  def react(ev)
    render! if ev["_class"] == "render_request" && ev["__to_self"]
    #process!(ev)  if ev["_class"] == "widget_request"
  end

  def render!
    respond(
      :_class => "render_response", 
      :payload => render
      :payload => {
        :title => title,
        :gauge_key => name,
        :widgets => Hash[@widgets.map{|k,w|[k,w.opts]}]
      }
    )
  end

  def method_missing(method, *args, &block)
    if (m = method.to_s.match(/cmd_([a-zA-Z_]+)/))
      method = m[1]
      unless @cmds.try(:include?, method.to_sym)
        return !!(puts "error: unknown command: #{method}")
      else
        return send(method, *args, &block)
      end
private

  def widget(klass, opts)
    opts[:gauge_key] ||= name

    [
      "FnordMetric",
      "#{klass.to_s.capitalize}Widget"
    ].join("::").constantize.new(opts).tap do |w|
      @widgets[w.key] = w
    end
    puts "error: method '#{method}' missing"
    raise NoMethodError.new(method)
  end

private

  def render_template(template_name)
    tpl = File.read(::File.expand_path("../../../haml/#{template_name}.haml", __FILE__))
    Haml::Engine.new(tpl).render(binding)
  %w(timeline).each do |wid|
    define_method("#{wid}_widget") do |options|
      widget(wid, options)
    end
  end

end
 No newline at end of file
+4 −5
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ class FnordMetric::RemoteGauge
  	@backend.subscribe do |message|
      if message["_sender"] != @uuid 
        message["__to_self"] = (message["_channel"] == name.to_s)
        react(message)
        _react(message)
      end
    end
  end
@@ -25,10 +25,9 @@ class FnordMetric::RemoteGauge

private

  def react(ev)
    render!       if ev["_class"] == "render_request" && ev["__to_self"]
    discover!(ev) if ev["_class"] == "discover_request"
    process!(ev)  if ev["_class"] == "request"
  def _react(ev)
    return discover!(ev) if ev["_class"] == "discover_request"
    react(ev)
  end

  def discover!(event)

lib/fnordmetric/widget.rb

deleted100644 → 0
+0 −86
Original line number Diff line number Diff line
class FnordMetric::Widget

  attr_accessor :gauges, :tick

  def initialize(opts={})
    @opts = opts

    unless opts.has_key?(:title)
      error! "widget can't be initialized without a title"
    end

    add_gauges(opts.delete(:gauges))
  end

  def title
    @opts[:title]
  end

  def key_nouns
    @opts[:key_nouns] || ["Key", "Keys"]
  end

  def token
    token = title.to_s.gsub(/[\W]/, '').downcase
    token = Digest::SHA1.hexdigest(title.to_s) if token.empty?
    token
  end

  def add_gauges(gauges)
    if gauges.blank? && has_tick?
      error! "initializing a widget without gauges is void"
    else
      @gauges = gauges
    end
    
    if !!self.try(:has_tick?) && (ticks = gauges.map{ |g| g.tick }).uniq.length == 1
      @tick = ticks.first
    elsif !!self.try(:has_tick?)
      error! "you can't add gauges with different ticks to the same widget"
    end
  end

  def error!(msg)
    FnordMetric.error!(msg)
  end

  def range
    ensure_has_tick!
    #@opts[:range] || default_range # FIXME: allow custom ranges, but assure that the range-start is 'on a tick'
    default_range
  end

  def ticks
    ensure_has_tick!
    range.step(@tick)
  end

  def default_range(now=Time.now)
    ensure_has_tick!
    te = gauges.first.tick_at(now.to_i)
    te -= @tick unless include_current?
    rs = (@opts[:ticks] || (@tick == 1.hour.to_i ? 24 : 30)).to_i
    (te-(@tick*rs)..te)
  end

  def include_current?
    !(@opts[:include_current] == false)
  end
    
  def data
    { 
      :title => @opts[:title], 
      :width => @opts[:width] || 100,
      :klass => self.class.name.split("::").last 
    }
  end

  def render
    data
  end

  def ensure_has_tick!
    error! "widget does not have_tick" unless has_tick?
  end

end
 No newline at end of file
Loading