class MemcacheSniffer

Attributes

metrics[RW]
semaphore[RW]

Public Class Methods

new(config) click to toggle source
# File lib/sniffer.rb, line 7
def initialize(config)
  @source  = config[:nic]
  @port    = config[:port]

  @metrics = {}
  @metrics[:calls]   = {}
  @metrics[:objsize] = {}
  @metrics[:reqsec]  = {}
  @metrics[:bw]    = {}
  @metrics[:stats]   = { :recv => 0, :drop => 0 }

  @semaphore = Mutex.new
end

Public Instance Methods

done() click to toggle source
# File lib/sniffer.rb, line 54
def done
  @done = true
end
start() click to toggle source
# File lib/sniffer.rb, line 21
def start
  cap = Pcap::Capture.open_live(@source, 1500)

  @metrics[:start_time] = Time.new.to_f

  @done    = false

  cap.setfilter("port #{@port}")
  cap.loop do |packet|
    @metrics[:stats] = cap.stats

    # parse key name, and size from VALUE responses
    if packet.raw_data =~ %rVALUE (\S+) \S+ (\S+)/
      key   = $1
      bytes = $2

      @semaphore.synchronize do
        if @metrics[:calls].has_key?(key)
          @metrics[:calls][key] += 1
        else
          @metrics[:calls][key] = 1
        end

        @metrics[:objsize][key] = bytes.to_i
      end
    end

    break if @done
  end

  cap.close
end