lib/heartbeat-client.rb in heartbeat-client-0.1.5 vs lib/heartbeat-client.rb in heartbeat-client-0.2.0

- old
+ new

@@ -19,31 +19,96 @@ def self.log Logger.new('/tmp/heartbeat.log') end def self.create(apikey) - cpu = 0; load_average = 0; memory_used = 0; memory_free = 0 + procs = {'total' => 0, 'running' => 0, 'stuck' => 0, 'sleeping' => 0, 'threads' => 0} + load_avg = [] + cpu_usage = {'user' => 0, 'sys' => 0, 'idle' => 0} + processes = [] if self.is_linux? - cpus = `iostat -c`.split - cpu = 100 - cpus.last.to_i + `top -b -n1 > /tmp/top.out` + else + `top -l 1 > /tmp/top.out` end - options = { - :body => { - :heartbeat => { - :apikey => apikey, - :host => `hostname`.chomp, - :timestamp => Time.now.to_i, - :values => { - :cpu => cpu, - :load_average => load_average, - :memory_used => memory_used, - :memory_free => memory_free + if File.exists?('/tmp/top.out') + counter = 0; proc_count = 0 + File.open("/tmp/top.out", "r") do |infile| + while (line = infile.gets) + processes(procs, line) if line.include?('Processes') + load_averages(load_avg, line) if line.include?('Load Avg') + cpu_usages(cpu_usage, line) if line.include?('CPU usage') + proc_count = counter + 1 if line.include?('PID') and line.include?('COMMAND') + process(processes, line) if proc_count > 0 and counter >= proc_count + counter += 1 + end + end + + options = { + :body => { + :heartbeat => { + :apikey => apikey, + :host => `hostname`.chomp, + :timestamp => Time.now.to_i, + :values => { + :process_stats => procs, + :load_avg => load_avg, + :cpu_usage => cpu_usage, + :processes => processes + } } } } - } - pp Heartbeat.post('/heartbeat', options) + # puts procs.inspect + # puts load_avg.inspect + # puts cpu_usage.inspect + # puts processes.inspect + + pp Heartbeat.post('/heartbeat', options) + else + put "No top output found." + end + end + + def self.processes(procs, str) + proc = str.split(':') + if proc and proc[0] and proc[0].include?('Processes') + proc[1].split(',').each do |pr| + procs['total'] = pr.split(' ')[0].strip.to_i if pr.include?('total') + procs['running'] = pr.split(' ')[0].strip.to_i if pr.include?('running') + procs['stuck'] = pr.split(' ')[0].strip.to_i if pr.include?('stuck') + procs['sleeping'] = pr.split(' ')[0].strip.to_i if pr.include?('sleeping') + procs['threads'] = pr.split(' ')[0].strip.to_i if pr.include?('threads') + end + end + end + + def self.load_averages(load_avg, str) + avg = str.split(':') + if avg and avg[0] and avg[0].include?('Load Avg') + avg[1].split(',').each do |a| + load_avg << a.strip.to_f + end + end + end + + def self.cpu_usages(cpu_usage, str) + cpu = str.split(':') + if cpu and cpu[0] and cpu[0].include?('CPU usage') + cpu[1].split(',').each do |cp| + cpu_usage['user'] = cp.split(' ')[0].strip.to_f if cp.include?('user') + cpu_usage['sys'] = cp.split(' ')[0].strip.to_f if cp.include?('sys') + cpu_usage['idle'] = cp.split(' ')[0].strip.to_f if cp.include?('idle') + end + end + end + + def self.process(processes, line) + procs = line.split(' ') + if procs and procs.size > 0 + processes << {'pid' => procs[0].strip.to_i, 'command' => procs[1].strip, 'cpu' => procs[2].strip.to_f} + end end end