Commit 4bce3280 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

simple gauge discovery

parent 5d190eb5
Loading
Loading
Loading
Loading
+9 −60
Original line number Diff line number Diff line
@@ -88,23 +88,6 @@ module FnordMetric
    end
  end

  def self.connect_redis(redis_url)
    EM::Hiredis.connect(redis_url)
  end

  def self.print_stats(opts, redis) # FIXME: refactor this mess
    keys = [:events_received, :events_processed]
    redis.llen("#{opts[:redis_prefix]}-queue") do |queue_length|
      redis.hmget("#{opts[:redis_prefix]}-stats", *keys) do |data|
        data_human = keys.size.times.map{|n|"#{keys[n]}: #{data[n]}"}
        log "#{data_human.join(", ")}, queue_length: #{queue_length}"
      end
    end
  end




  # LEGACY / BACKWARDS COMPATBILE STUFF

  def self.server_configuration=(configuration)
@@ -115,42 +98,14 @@ module FnordMetric
    FnordMetric::Web.namespace(*args, &block)
  end



  def self.standalone
    require "fnordmetric/standalone"
end

  # returns a Rack app which can be mounted under any path.
  # `:start_worker`   starts a worker
  # `:inbound_stream` starts the TCP interface
  # `:print_stats`    periodicaly prints worker stats
  def self.embedded(opts={})
    opts = options(opts)
    app  = nil

    EM.next_tick do

      # FIXPAUL: this is re-instantiating all gauges. why?
      #if opts[:start_worker]
      #  worker = Worker.new(@@namespaces.clone, opts)
      #  worker.ready!
      #end

      if opts[:print_stats]
        redis = connect_redis(opts[:redis_url])
        EM::PeriodicTimer.new(opts[:print_stats]) do
          print_stats(opts, redis)
        end
      end

    end

    app
  end

end

require "fnordmetric/gauge_modifiers"
require "fnordmetric/gauge_calculations"
require "fnordmetric/gauge"
require "fnordmetric/remote_gauge"
require "fnordmetric/multi_gauge"

require "fnordmetric/backends/redis_backend"
require "fnordmetric/backends/memory_backend"
@@ -159,6 +114,8 @@ require "fnordmetric/acceptors/acceptor"
require "fnordmetric/acceptors/tcp_acceptor"
require "fnordmetric/acceptors/udp_acceptor"

require "fnordmetric/gauges/numeric_gauge"

require "fnordmetric/web/web"
require "fnordmetric/web/namespace"
require "fnordmetric/web/app"
@@ -169,9 +126,7 @@ require "fnordmetric/web/session"

require "fnordmetric/logger"




 # require "fnordmetric/context"

# require "fnordmetric/api"
# require "fnordmetric/udp_client"
@@ -186,12 +141,6 @@ require "fnordmetric/logger"
# require "fnordmetric/html_widget"

# require "fnordmetric/namespace"
# require "fnordmetric/gauge_modifiers"
# require "fnordmetric/gauge_calculations"
# require "fnordmetric/context"
# require "fnordmetric/gauge"

# require "fnordmetric/remote_gauge"
# require "fnordmetric/multi_gauge"
# require "fnordmetric/numeric_gauge"
# require "fnordmetric/toplist_gauge"
+1 −6
Original line number Diff line number Diff line
@@ -24,12 +24,7 @@ class FnordMetric::NumericGauge < FnordMetric::MultiGauge
    end
  end

  def react(event)
    render! if event["_class"] == "render_request"
    process!(event) if event["_class"] == "request"
  end

  def process!(event)
  def announce(event)
    sleep 2
    resp = if event["widget"] == "total_timeline"
      event.merge(
+3 −7
Original line number Diff line number Diff line
class FnordMetric::MultiGauge < FnordMetric::RemoteGauge

  def initialize(opts)
    opts.fetch(:key) && opts.fetch(:key_prefix)
    opts.fetch(:key)
    @opts = opts

    super(opts)
    FnordMetric.register(self)
  end

  def name
@@ -20,11 +20,7 @@ class FnordMetric::MultiGauge < FnordMetric::RemoteGauge
  end
  
  def key(_append=nil)
    [@opts[:key_prefix], "multigauge", name, _append].flatten.compact.join("-")
  end

  def add_redis(_redis)
    @opts[:redis] = _redis
    ["FIXPAUL-KEYPREFIX", "multigauge", name, _append].flatten.compact.join("-")
  end

  def render
+24 −11
Original line number Diff line number Diff line
class FnordMetric::RemoteGauge

  def initialize(opts)
  def name
    raise NotYetImplementedError
  end

  def initialized
    @backend = FnordMetric.backend
    @uuid = "gauge-#{rand(8**64).to_s(36)}"

    FnordMetric.log "gauge '#{name}' started"

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

  def name
    raise NotYetImplementedError
  end

  def react(event)
    raise NotYetImplementedError
  end

  def hangup
    @backend.hangup
    @backend = nil
@@ -26,10 +25,24 @@ 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"
  end

  def discover!(event)
    respond(
      :_channel  => event["_channel"],
      :_class    => "discover_response",
      :gauge_key => name
    )
  end

  def respond(message)
  	message["_channel"] ||= name
    message["_sender"] ||= @uuid
    @backend.publish(message)
  	#FnordMetric.firehose.push(message)
  end

end
 No newline at end of file
+7 −0
Original line number Diff line number Diff line


gauge discovery:

  { "_class":"discover_request"}
  { "_class":"discover_response", "gauge_key":"gauge123" }




render a gauge (request):