class ServerMetrics::Memory
Constants
- DARWIN_UNITS
reports darwin units as MB
Public Instance Methods
build_report()
click to toggle source
# File lib/server_metrics/collectors/memory.rb, line 10 def build_report if solaris? solaris_memory elsif darwin? darwin_memory else linux_memory end end
darwin?()
click to toggle source
True if on darwin. Only checked on the first run (assumes OS does not change).
# File lib/server_metrics/collectors/memory.rb, line 136 def darwin? darwin = if @memory.has_key?(:darwin) memory(:darwin) || false else darwin = false begin darwin = true if `uname` =~ /darwin/i rescue end end remember(:darwin => darwin) return darwin end
darwin_memory()
click to toggle source
Parses top output. Does not report swap usage.
# File lib/server_metrics/collectors/memory.rb, line 68 def darwin_memory report_data = Hash.new top_output = `top -l1 -n0 -u` mem = top_output[/^(?:Phys)?Mem:.+/i] mem.scan(/(\d+|\d+\.\d+)([bkmg])\s+(\w+)/i) do |amount, unit, label| case label when 'used' report_data[:used] = (amount.to_f * DARWIN_UNITS[unit.downcase]).round when 'free', 'unused' report_data[:avail] = (amount.to_f * DARWIN_UNITS[unit.downcase]).round end end report_data[:size] = report_data[:used]+report_data[:avail] report_data[:used_percent] = ((report_data[:used].to_f/report_data[:size])*100).to_i @data = report_data end
linux_memory()
click to toggle source
# File lib/server_metrics/collectors/memory.rb, line 20 def linux_memory mem_info = {} File.read("#{ServerMetrics::SystemInfo.proc_dir}/meminfo").each_line do |line| _, key, value = *line.match(/^(\w+):\s+(\d+)\s/) mem_info[key] = value.to_i end # memory info is empty - operating system may not support it (why doesn't an exception get raised earlier on mac osx?) if mem_info.empty? raise "No such file or directory" end mem_info['MemTotal'] ||= 0 mem_info['MemFree'] ||= 0 mem_info['Buffers'] ||= 0 mem_info['Cached'] ||= 0 mem_info['SwapTotal'] ||= 0 mem_info['SwapFree'] ||= 0 mem_total = mem_info['MemTotal'] / 1024 mem_free = (mem_info['MemFree'] + mem_info['Buffers'] + mem_info['Cached']) / 1024 mem_used = mem_total - mem_free mem_percent_used = (mem_used / mem_total.to_f * 100).to_i swap_total = mem_info['SwapTotal'] / 1024 swap_free = mem_info['SwapFree'] / 1024 swap_used = swap_total - swap_free unless swap_total == 0 swap_percent_used = (swap_used / swap_total.to_f * 100).to_i end # will be passed at the end to report to Scout report_data = Hash.new report_data[:size] = mem_total report_data[:used] = mem_used report_data[:avail] = mem_total - mem_used report_data[:used_percent] = mem_percent_used report_data[:swap_size] = swap_total report_data[:swap_used] = swap_used unless swap_total == 0 report_data[:swap_used_percent] = swap_percent_used end @data = report_data end
solaris?()
click to toggle source
True if on solaris. Only checked on the first run (assumes OS does not change).
# File lib/server_metrics/collectors/memory.rb, line 121 def solaris? solaris = if @memory.has_key?(:solaris) memory(:solaris) || false else solaris = false begin solaris = true if `uname` =~ /sunos/i rescue end end remember(:solaris => solaris) return solaris end
solaris_memory()
click to toggle source
Memory
Used and Swap Used come from the prstat command. Memory
Total comes from prtconf Swap Total comes from swap -s
# File lib/server_metrics/collectors/memory.rb, line 91 def solaris_memory report_data = Hash.new prstat = `prstat -c -Z 1 1` prstat =~ /(ZONEID[^\n]*)\n(.*)/ values = $2.split(' ') report_data[:used] = convert_to_mb(values[3]) report_data[:swap_used] = convert_to_mb(values[2]) prtconf = `/usr/sbin/prtconf | grep Memory` prtconf =~ /\d+/ report_data[:size] = $&.to_i report_data[:used_percent] = (report_data[:used] / report_data[:size].to_f * 100).to_i swap = `swap -s` swap =~ /\d+[a-zA-Z]\sused/ swap_used = convert_to_mb($&) swap =~ /\d+[a-zA-Z]\savailable/ swap_available = convert_to_mb($&) report_data[:swap_size] = swap_used+swap_available unless report_data[:swap_size] == 0 report_data[:swap_used_percent] = (report_data[:swap_used] / report_data[:swap_size].to_f * 100).to_i end @data = report_data end