lib/rorvswild/metrics/memory.rb
module RorVsWild class Metrics class Memory attr_reader :ram_total, :ram_free, :ram_available, :ram_buffers, :ram_cached attr_reader :swap_total, :swap_free attr_reader :storage_total, :storage_used def ram_used ram_total - ram_available end def swap_used swap_total - swap_free end PROC_MEMINFO = "/proc/meminfo".freeze MEM_TOTAL = "MemTotal" # Total usable RAM (i.e., physical RAM minus a few reserved bits and the kernel binary code). MEM_FREE = "MemFree" # The sum of LowFree+HighFree. MEM_AVAILABLE = "MemAvailable" # An estimate of how much memory is available for starting new applications, without swapping. BUFFERS = "Buffers" # Relatively temporary storage for raw disk blocks that shouldn't get tremendously large (20MB or so). CACHED = "Cached" # In-memory cache for files read from the disk (the page cache). Doesn't include SwapCached. SWAP_TOTAL = "SwapTotal" # Total amount of swap space available. SWAP_FREE = "SwapFree" # Amount of swap space that is currently unused. def update return unless info = read_meminfo @ram_total = convert_to_bytes(info[MEM_TOTAL]) @ram_free = convert_to_bytes(info[MEM_FREE]) @ram_available = convert_to_bytes(info[MEM_AVAILABLE]) @ram_buffers = convert_to_bytes(info[BUFFERS]) @ram_cached = convert_to_bytes(info[CACHED]) @swap_total = convert_to_bytes(info[SWAP_TOTAL]) @swap_free = convert_to_bytes(info[SWAP_FREE]) end private def units @units ||= {"kb" => 1000, "mb" => 1000 * 1000, "gb" => 1000 * 1000 * 1000}.freeze end def read_meminfo return unless File.readable?(PROC_MEMINFO) File.read(PROC_MEMINFO).split("\n").reduce({}) do |hash, line| name, value = line.split(":") hash[name] = value.strip hash end end def convert_to_bytes(string) value, unit = string.split value.to_i * units[unit.downcase] end end end end