Commit 8cca8241 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

Merge branch 'stream_based' into v1.0

parents c231a3c3 56c2cbdc
Loading
Loading
Loading
Loading

exp/server.rb

0 → 100644
+57 −0
Original line number Diff line number Diff line
require "eventmachine"
require "em-websocket"
require "em-hiredis"
require "json"

EventMachine.run do

    @opts = {
      :host => "0.0.0.0", 
      :port => 8080, 
      :debug => true
    }

    sub_redis = EM::Hiredis.connect
    pub_redis = EM::Hiredis.connect

    sub_redis.subscribe('fnordmetric')

    @chan_feed     = EM::Channel.new
    @chan_upstream = EM::Channel.new

    sub_redis.on(:message) do |channel, message|
      @chan_feed.push(JSON.parse(message)) rescue nil
    end

    @chan_upstream.subscribe do |message|
      puts "PUBLISHING"
      pub_redis.publish('fnordmetric', message.to_json)
    end

    EventMachine::WebSocket.start(@opts) do |socket|

      socket.onopen do

        sid = @chan_feed.subscribe do |messsage| 
          socket.send(messsage.to_json)
        end
        
        socket.onmessage do |message|
          begin
            message = JSON.parse(message)
          rescue
          else
            message["_eid"] ||= (8**64).to_s(36)
            @chan_upstream.push(message)
          end
        end

        socket.onclose do
          @chan_feed.unsubscribe(sid)
        end

      end

    end

end

exp/test.html

0 → 100644
+17 −0
Original line number Diff line number Diff line
<html>
  <head>
    <title>fnord</title>
  </head>
  <body>
    fnord
    <script type="text/javascript">
      var ws = new WebSocket("ws://localhost:8080/");
      ws.onmessage = function(evt) { console.log("Message: " + evt.data); };
      ws.onclose = function() { console.log("socket closed"); };
      ws.onopen = function() {
        console.log("connected...");
        ws.send(JSON.stringify({ "fnord": "bar" }));
      }; 
    </script>
  </body>
</html>
+1 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
  s.add_dependency "sinatra", ">= 1.2.6"
  s.add_dependency "redis", ">= 2.2.2"
  s.add_dependency "eventmachine"
  s.add_dependency "em-websocket"
  s.add_dependency "em-hiredis"
  s.add_dependency "json"
  s.add_dependency "i18n"
+7 −1
Original line number Diff line number Diff line
@@ -7,6 +7,10 @@
    %script(type="text/javascript" src="#{path_prefix}/vendor/jquery-1.6.1.min.js")
    %script(type="text/javascript" src="#{path_prefix}/vendor/highcharts.js")

    %script(type="text/javascript" src="#{path_prefix}/vendor/raphael.min.js")
    %script(type="text/javascript" src="#{path_prefix}/vendor/raphael.util.js")


    %script(type="text/javascript" src="#{path_prefix}/fnordmetric.js")
    %script(type="text/javascript" src="#{path_prefix}/fnordmetric.util.js")
    %script(type="text/javascript" src="#{path_prefix}/fnordmetric.ui.js")
@@ -75,7 +79,7 @@
:javascript
  $(document).ready(function(){

    FnordMetric.init('#{current_namespace.token}', $('.viewport_inner'));
    FnordMetric.init('#{current_namespace.token}', $('.viewport_inner'), 'ws://localhost:4243');

    // fixpaul: move to FnordMetric.views.sidebar

@@ -116,6 +120,7 @@
      $('#tabs li:first').trigger('click');
    }

    window.setTimeout(function(){
    if(window.location.hash){
      if(!!window.location.hash.match(/^#dashboard\/[a-zA-Z_0-9-]+$/)) {
        $('#sidebar li.dashboard[rel="'+window.location.hash.slice(11)+'"]').trigger('click');
@@ -123,6 +128,7 @@
        $('#sidebar li.gauge[rel="'+window.location.hash.slice(7)+'"]').click();
      }
    }
    }, 200);

  });

+32 −7
Original line number Diff line number Diff line
@@ -72,6 +72,12 @@ module FnordMetric
  @@namespaces = {}
  @@server_configuration = nil

  @@firehose    = EM::Channel.new

  def self.backend
    FnordMetric::RedisBackend.new(options)
  end

  def self.namespace(key=nil, &block)
    @@namespaces[key] = block
  end
@@ -111,14 +117,25 @@ module FnordMetric

      if opts[:web_interface]
        server = opts[:web_interface_server].downcase

        unless ["thin", "hatetepe"].include? server
          raise "Need an EventMachine webserver, but #{server} isn't"
        end

        host, port = *opts[:web_interface]
        Rack::Server.start :app => app, :server => server,
                           :Host => host, :Port => port
        log "listening on http://#{host}:#{port}"

        Rack::Server.start(
          :app => app,
          :server => server,
          :Host => host, 
          :Port => port
        ) && log("listening on http://#{host}:#{port}")
        
        FnordMetric::WebSocket.new(
          :host => host, 
          :port => (port.to_i+1)
        ) && log("listening on ws://#{host}:#{port.to_i+1}")

      end
    end
  end
@@ -177,10 +194,12 @@ module FnordMetric
    end

    EM.next_tick do
      if opts[:start_worker]
        worker = Worker.new(@@namespaces.clone, opts)
        worker.ready!
      end

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

      if opts[:inbound_stream]
        inbound_class = opts[:inbound_protocol] == :udp ? InboundDatagram : InboundStream
@@ -205,6 +224,10 @@ module FnordMetric

end


require "fnordmetric/backends/redis_backend"
require "fnordmetric/backends/memory_backend"

require "fnordmetric/api"
require "fnordmetric/udp_client"
require "fnordmetric/inbound_stream"
@@ -222,10 +245,12 @@ 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"
require "fnordmetric/session"
require "fnordmetric/app"
require "fnordmetric/websocket"
require "fnordmetric/dashboard"
require "fnordmetric/event"
Loading