Sha256: b4eba3e988626a24644aa76ce5ee06d408e0cd75611c3692645890a977abb301

Contents?: true

Size: 1.22 KB

Versions: 3

Compression:

Stored size: 1.22 KB

Contents

module Instrumentation
  # Reads data from system and process information and writes it to
  # websocket
  class Report
    attr_reader :memory, :loadavg
    attr_accessor :socket

    def initialize(pid)
      @pid = pid
      @sleep = 1
      @memory = BoundedArray.new(300)
      @loadavg = BoundedArray.new(300)
      @socket = nil
    end

    def start
      @thread = Thread.new do
        loop do
          read_data
          send_data if socket
          sleep @sleep
        end
      end
    end

    def read_data
      now = Time.now.strftime('%FT%T')
      @memory = @memory << [now, read_memory]
      @loadavg = @loadavg << [now, read_loadavg]
    rescue => error
      puts "Error when reading data: #{error.inspect}"
    end

    def send_data
      socket.send_data(event(:memory, @memory.items))
      socket.send_data(event(:loadavg, @loadavg.items))
    rescue => error
      puts "Error when sending data: #{error.inspect}"
    end

    def event(name, data)
      { data_type: name, data: data }.to_json
    end

    def read_memory
      Memory.new(@pid).read
    end

    def read_loadavg
      LoadAverage.new.read[:one]
    end

    def join
      @thread.join
    end

    def shutdown
      @thread.kill
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
process-instrumentation-0.1.3 lib/instrumentation/report.rb
process-instrumentation-0.1.2 lib/instrumentation/report.rb
process-instrumentation-0.1.1 lib/instrumentation/report.rb