Commit 620e042c authored by Paul Asmuth's avatar Paul Asmuth
Browse files

core: implemented persistent zero config gauges

parent 17cbf2ee
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -19,9 +19,10 @@ class FnordMetric::Context
    @opts = opts
  end

  def call(event, redis)
  def call(event, redis, namespace)
    @redis = redis
    @event = event
    @namespace = namespace
    proxy.instance_eval(&@block)
  rescue Exception => e
    raise e if ENV['FNORDMETRIC_ENV'] == 'test'
@@ -34,12 +35,12 @@ class FnordMetric::Context
  end

  def namespace
    @opts[:namespace]
    @namespace
  end

  def dispatch(method, *args, &block)
    if args.size > 0 && @opts[:gauges][args[0]].try(:renderable?)
      @opts[:gauges][args.delete_at(0)].execute(method, *args.unshift(self), &block)
    if args.size > 0 && gauges[args[0]].try(:renderable?)
      gauges[args.delete_at(0)].execute(method, *args.unshift(self), &block)
    else
      send(method, *args, &block)
    end
@@ -75,10 +76,14 @@ private
    @event[:_type].to_sym
  end

  def gauges
    @namespace.gauges
  end

protected

  def fetch_gauge(_gauge)
    _gauge.is_a?(FnordMetric::Gauge) ? _gauge : @opts[:gauges].fetch(_gauge)
    _gauge.is_a?(FnordMetric::Gauge) ? _gauge : gauges.fetch(_gauge)
  rescue
    error! "error: gauge '#{_gauge}' is undefined"
  end
+2 −1
Original line number Diff line number Diff line
@@ -31,7 +31,8 @@ FnordMetric::ZERO_CONFIG_HANDLER = proc {
  else
    namespace.opt_gauge(gauge_key,
      :tick => data[:flush_interval].to_i,
      :average => (type == :_avg))
      :average => (type == :_avg),
      :zero_config => true)
  end

  case type
+31 −11
Original line number Diff line number Diff line
@@ -10,22 +10,19 @@ class FnordMetric::Namespace
  def initialize(key, opts)
    @gauges = Hash.new
    @dashboards = Hash.new
    @handlers = Hash.new.with_indifferent_access
    @flags = Hash.new
    @title = key
    @active_users_available = true
    @gauge_explorer_available = true
    @opts = opts
    @key = key

    @handlers = Hash.new.with_indifferent_access

    FnordMetric::ZERO_CONFIG_TYPES.each do |type|
      opt_event(type, &FnordMetric::ZERO_CONFIG_HANDLER)
    end
  end

  def ready!(redis)
  def ready!(redis, sync_redis = nil)
    @redis = redis
    @sync_redis = sync_redis
    load_gauges
    self
  end

@@ -39,11 +36,17 @@ class FnordMetric::Namespace
      event[:_session_key] = announce_to_session(event).session_key 
    end

    if FnordMetric::ZERO_CONFIG_TYPES.include?(event[:_type].to_sym)
      ctx = FnordMetric::Context.new(opts, FnordMetric::ZERO_CONFIG_HANDLER)
      ctx.call(event, @redis, self)
      return self
    end

    res = [
      @handlers[event[:_type].to_s],
      @handlers["*"]
    ].flatten.compact.each do |context|
      context.call(event, @redis)
      context.call(event, @redis, self)
    end.size

    if res == 0
@@ -132,7 +135,6 @@ class FnordMetric::Namespace
  end

  def opt_event(event_type, opts={}, &block)
    opts.merge!(:redis => @redis, :gauges => @gauges, :namespace => self)
    FnordMetric::Context.new(opts, block).tap do |context|
      @handlers[event_type.to_s] ||= []
      @handlers[event_type.to_s] << context
@@ -140,7 +142,9 @@ class FnordMetric::Namespace
  end

  def opt_gauge(gauge_key, opts={})
    opts.merge!(:key => gauge_key, :key_prefix => key_prefix)
    opts.merge!(:key => gauge_key)
    store_gauge(gauge_key, opts) if opts[:zero_config]
    opts.merge!(:key_prefix => key_prefix)
    klass = "FnordMetric::#{(opts[:type] || "").to_s.camelize}Gauge".constantize
    @gauges[gauge_key] ||= klass.new(opts)
  end
@@ -166,6 +170,22 @@ class FnordMetric::Namespace
    widget_klass.constantize.new(opts.merge(:gauges => _gauges))
  end

  def store_gauge(gauge_key, opts)
    gaugelist_key = key_prefix("zero-config-gauges")
    sync_redis.hset(gaugelist_key, gauge_key, opts.to_json)
  end

  def load_gauges
    gaugelist_key = key_prefix("zero-config-gauges")
    sync_redis.hgetall(gaugelist_key).each do |gauge_key, gauge_opts|
      opt_gauge(gauge_key.to_sym, JSON.parse(gauge_opts).symbolize_keys)
    end
  end

  def sync_redis
    @sync_redis || @redis
  end

  def extend_opts(opts)
    opts.merge(
      :namespace_prefix => key_prefix,
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ class FnordMetric::App < Sinatra::Base

  get '/:namespace' do
    pass unless current_namespace
    current_namespace.ready!(@redis)
    haml :app
  end

+2 −0
Original line number Diff line number Diff line
@@ -52,6 +52,8 @@ private
  end

  def discover(namespace)
    namespace.ready!(@redis)

    [namespace.dashboards.map do |dash_key, dash|
      { "type" => "discover_response", "gauge_key" => dash_key, "view" => "dashboard",
        "group" => dash.group }
Loading