Module: SystemInspector::Linux

Defined in:
lib/instrumental_tools/system_inspector/linux.rb

Class Method Summary collapse

Class Method Details

.cpuObject



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 34

def self.cpu
  agg_cpu_stat = File.read(cpu_file).lines.map { |line| line.split }.detect { |values| values.first == "cpu" }
  output       = {}

  if agg_cpu_stat
    categories = [:user, :nice, :system, :idle, :iowait]
    values     = agg_cpu_stat.slice(1, 5).map { |v| v.to_f }
    SystemInspector.memory.store(:cpu_values, values.dup)
    if previous_values = SystemInspector.memory.retrieve(:cpu_values)
      index = -1
      values.collect! { |value| (previous_values[index += 1] - value).abs }
    end

    data   = Hash[*categories.zip(values).flatten]
    total  = values.inject { |memo, value| memo + value }

    if previous_values
      data.each do |category, value|
        output["cpu.#{category}"] = value / total * 100
      end
    end

    output["cpu.in_use"] = 100 - data[:idle] / total * 100
  end

  output
end

.cpu_fileObject



10
11
12
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 10

def self.cpu_file
  "/proc/stat"
end

.disk_fileObject



18
19
20
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 18

def self.disk_file
  "/proc/diskstats"
end

.disk_ioObject



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 143

def self.disk_io
  output          = {}
  device_root     = "/dev/"
  mounted_devices = File.read(mount_file).lines.map { |l| l.split.first }.select { |device| device.index(device_root) }.map { |device| File.realpath(device) }
  diskstats_lines = File.read(disk_file).lines.map(&:split).select { |values| mounted_devices.include?(File.join(device_root, values[2])) }
  entries         = diskstats_lines.map do |values|
                      entry               = {}
                      entry[:time]        = Time.now
                      entry[:device]      = values[2]
                      entry[:utilization] = values[12].to_f
                      SystemInspector.memory.store("disk_stats_#{entry[:device]}".to_sym, entry)
                    end

  entries.each do |entry|
    if previous_entry = SystemInspector.memory.retrieve("disk_stats_#{entry[:device]}".to_sym)
      time_delta                                           = (entry[:time] - previous_entry[:time]) * 1000
      utilization_delta                                    = entry[:utilization] - previous_entry[:utilization]
      output["disk.#{entry[:device]}.percent_utilization"] = utilization_delta / time_delta * 100
    end
  end
  output
end

.disk_storageObject



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 121

def self.disk_storage
  output = {}
  `df -Pka`.lines.each do |line|
    device, total, used, available, capacity, mount = line.chomp.split
    if device == "tmpfs"
      names = ["tmpfs_#{mount.gsub(/[^[:alnum:]]/, "_")}".gsub(/_+/, "_")]
    elsif device =~ %r{/dev/}
      names = [File.basename(device)]
    else
      next
    end
    names << 'root' if mount == '/'
    names.each do |name|
      output["disk.#{name}.total_mb"]          = total.to_f / 1024
      output["disk.#{name}.used_mb"]           = used.to_f / 1024
      output["disk.#{name}.available_mb"]      = available.to_f / 1024
      output["disk.#{name}.available_percent"] = available.to_f / total.to_f * 100
    end
  end
  output
end

.filesystemObject



174
175
176
177
178
179
180
181
182
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 174

def self.filesystem
  allocated, unused, max = File.read(open_files_file).split.map(&:to_i)
  open_files             = allocated - unused
  {
    'filesystem.open_files'         => open_files,
    'filesystem.max_open_files'     => max,
    'filesystem.open_files_pct_max' => (open_files.to_f / max.to_f) * 100
  }
end

.load_cpuObject



3
4
5
6
7
8
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 3

def self.load_cpu
  output = { :gauges => {} }
  output[:gauges].merge!(cpu)
  output[:gauges].merge!(loadavg)
  output
end

.load_disksObject



110
111
112
113
114
115
116
117
118
119
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 110

def self.load_disks
  output = { :gauges => {} }
  if SystemInspector.command_present?('df', 'disk storage')
    output[:gauges].merge!(disk_storage)
  end
  if File.exists?(mount_file) && File.exists?(disk_file)
    output[:gauges].merge!(disk_io)
  end
  output
end

.load_fileObject



14
15
16
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 14

def self.load_file
  "/proc/loadavg"
end

.load_filesystemObject



166
167
168
169
170
171
172
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 166

def self.load_filesystem
  output = { :gauges => {} }
  if File.exists?(open_files_file)
    output[:gauges].merge!(filesystem)
  end
  output
end

.load_memoryObject



71
72
73
74
75
76
77
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 71

def self.load_memory
  output = { :gauges => {} }
  if File.exists?(memory_file)
    output[:gauges].merge!(memory)
  end
  output
end

.loadavgObject



62
63
64
65
66
67
68
69
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 62

def self.loadavg
  min_1, min_5, min_15 = File.read(load_file).split
  {
    'load.1min'  => min_1.to_f,
    'load.5min'  => min_5.to_f,
    'load.15min' => min_15.to_f
  }
end

.memoryObject



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 79

def self.memory
  memory_stats = Hash[File.read(memory_file).lines.map { |line| line.chomp.strip.split(/:\s+/) }.reject { |l| l.size != 2 } ]
  total        = memory_stats["MemTotal"].to_f
  free         = memory_stats["MemFree"].to_f
  used         = total - free
  buffers      = memory_stats["Buffers"].to_f
  cached       = memory_stats["Cached"].to_f
  swaptotal    = memory_stats["SwapTotal"].to_f
  swapfree     = memory_stats["SwapFree"].to_f
  swapused     = swaptotal - swapfree

  stats_to_record = {
    'memory.used_mb'      => used / 1024,
    'memory.free_mb'      => free / 1024,
    'memory.buffers_mb'   => buffers / 1024,
    'memory.cached_mb'    => cached / 1024,
    'memory.free_percent' => (free / total) * 100,

  }

  if swaptotal > 0
    stats_to_record.merge!({
                             'swap.used_mb'        => swapused / 1024,
                             'swap.free_mb'        => swapfree / 1024,
                             'swap.free_percent'   => (swapfree / swaptotal) * 100
                           })
  end

  stats_to_record
end

.memory_fileObject



30
31
32
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 30

def self.memory_file
  "/proc/meminfo"
end

.mount_fileObject



22
23
24
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 22

def self.mount_file
  "/proc/mounts"
end

.open_files_fileObject



26
27
28
# File 'lib/instrumental_tools/system_inspector/linux.rb', line 26

def self.open_files_file
  "/proc/sys/fs/file-nr"
end