Sha256: c2f182461643938161d9e14504e47423370711c7d6581a5691a7ed8adf9463e7

Contents?: true

Size: 1.54 KB

Versions: 14

Compression:

Stored size: 1.54 KB

Contents

require 'thread'
require 'logger'


module Franz
  class Stats

    def initialize opts={}
      @logger = opts[:logger] || Logger.new(STDOUT)
      @interval = opts[:interval] || 300
      @stats = Hash.new
      @lock = Mutex.new
      @t = Thread.new do
        loop do
          sleep @interval
          report
          reset
        end
      end
    end


    def stop
      return state if @stop
      @stop = true
      @t.stop
      log.info event: 'stats stopped'
      return nil
    end


    def create name, default=nil
      with_lock do
        stats[name] = Hash.new { |h,k| h[k] = default }
      end
    end

    def delete name
      with_lock do
        stats.delete name
      end
    end

    def inc name, by=1
      with_lock do
        stats[name][:val] += by
      end
    end

    def dec name, by=1
      with_lock do
        stats[name][:val] -= by
      end
    end

    def set name, to
      with_lock do
        stats[name][:val] = to
      end
    end

    def get name
      with_lock do
        stats[name][:val]
      end
    end

  private
    attr_reader :stats

    def log ; @logger end

    def with_lock &block
      @lock.synchronize do
        yield
      end
    end

    def report
      ready_stats = with_lock do
        stats.map { |k,vhash| [ k, vhash[:val] ] }
      end
      log.info \
        event: 'stats',
        interval: @interval,
        stats: Hash[ready_stats]
    end

    def reset
      with_lock do
        stats.keys.each do |k|
          stats[k].delete :val
        end
      end
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
franz-2.2.2 lib/franz/stats.rb
franz-2.2.1 lib/franz/stats.rb
franz-2.2.0 lib/franz/stats.rb
franz-2.1.14 lib/franz/stats.rb
franz-2.1.13 lib/franz/stats.rb
franz-2.1.12 lib/franz/stats.rb
franz-2.1.11 lib/franz/stats.rb
franz-2.1.10 lib/franz/stats.rb
franz-2.1.9 lib/franz/stats.rb
franz-2.1.8 lib/franz/stats.rb
franz-2.1.7 lib/franz/stats.rb
franz-2.1.6 lib/franz/stats.rb
franz-2.1.5 lib/franz/stats.rb
franz-2.1.3 lib/franz/stats.rb