require 'role' require 'sinatra/base' require 'db_crap' class StatsRole < Role PORT = 9500 role 'stats' def initialize(manifest) super init_links 'db_read', @manifest['db_read'] init_links 'db_peer', @manifest['db_peer'] end def start start_server end def stop @http_server.shutdown end alias :enable :start alias :disable :stop private def start_server my_app = StatsApp.new(@active_links, @manifest) trap('INT') do @http_server.shutdown if @http_server exit end Thread.new { Rack::Handler::WEBrick.run(my_app, :Port => PORT.to_s) do |server| @http_server = server end } end class StatsApp < Sinatra::Base def initialize(active_links, manifest) @active_links = active_links @manifest = manifest super() end get '/stats' do stats_html end get '/ping' do 'pong' end private def stats_html resp = list key_count = resp.size last_updated = key_count > 0 ? resp.sort_by { |rec| rec['updated'] }[-1]['key'] : nil largest_value = key_count > 0 ? resp.sort_by { |rec| rec['value'].to_s.size }[-1]['key'] : nil <<-EOF