Sha256: ed00db759ef5ee0cd32cadd427046c608d0e0180ef628da2f43dd6bfad5c544d

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

require "rubygems"
require "sinatra/base"
require "rrd"
require "active_support/all"

class GangliaJSCharts
  class << self
    attr_accessor :charts_root
  end

  class Server < Sinatra::Base
    set :public, File.expand_path(File.dirname(__FILE__) + "/../public")
    set :dump_errors, true

    get "/clusters.json" do
      Dir[charts_root + "/*"].select { |f| File.directory?(f) }.map { |f| f.gsub(charts_root, "").delete("/") }.to_json
    end

    get "/:cluster/servers.json" do
      cluster_root = charts_root + "/#{params[:cluster]}"
      Dir["#{cluster_root}/*"].select { |f| File.directory?(f) }.map { |f| f.gsub(cluster_root, "").delete("/") }.to_json
    end

    get "/:cluster/:server/metrics.json" do
      server_root = charts_root + "/#{params[:cluster]}/#{params[:server]}"
      Dir["#{server_root}/*"].reject { |f| File.directory?(f) }.map { |f| f.gsub(server_root, "").delete("/").gsub(".rrd", "") }.to_json
    end

    get "/:cluster/:server/:metric.json" do
      # NOTE: This is dangerous, but this isn't designed to be public-facing
      length, unit = params[:time_window].split(".")
      start        = length.to_i.send(unit).ago

      rrd = RRD::Base.new(charts_root + "/" + [params[:cluster], params[:server], params[:metric]].join("/") + ".rrd")
      results = rrd.fetch(:average, :start => start.to_i, :end => Time.new.to_i)
      results[1..results.length].map { |n| n.last.nan? ? [n.first, 0] : n }.to_json
    end

    get "/" do
      File.read(File.expand_path(File.dirname(__FILE__) + "/../public/index.html"))
    end

    get "/graphs.json" do
      if File.exist?(charts_root + "/graphs.json")
        File.read(charts_root + "/graphs.json")
      else
        ""
      end
    end

    post "/graphs.json" do
      File.open(charts_root + "/graphs.json", "w") { |f| f << params[:json] }
      ""
    end

    private
      def charts_root
        GangliaJSCharts.charts_root
      end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ganglia_js_charts-0.0.1 lib/ganglia_js_charts.rb