systemstats 0.1.dev → 0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.DS_Store +0 -0
- data/Gemfile +1 -2
- data/Gemfile.lock +49 -0
- data/LICENSE.txt +1 -1
- data/bin/SystemStatsCollector +4 -0
- data/lib/systemstats.rb +4 -1
- data/lib/systemstats/capacity_collector.rb +108 -0
- data/lib/systemstats/cpu.rb +20 -0
- data/lib/systemstats/disk.rb +86 -0
- data/lib/systemstats/iostat_reader.rb +101 -11
- data/lib/systemstats/version.rb +9 -2
- data/spec/unit/iostat_linux_spec.rb +21 -17
- data/spec/unit/iostat_osx_spec.rb +4 -4
- data/systemstats.gemspec +1 -0
- metadata +142 -126
- data/.gitignore +0 -19
data/.DS_Store
ADDED
Binary file
|
data/Gemfile
CHANGED
data/Gemfile.lock
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
systemstats (0.3.dev)
|
5
|
+
activesupport
|
6
|
+
git
|
7
|
+
json
|
8
|
+
thor
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: https://rubygems.org/
|
12
|
+
specs:
|
13
|
+
activesupport (3.2.13)
|
14
|
+
i18n (= 0.6.1)
|
15
|
+
multi_json (~> 1.0)
|
16
|
+
columnize (0.3.6)
|
17
|
+
diff-lcs (1.1.3)
|
18
|
+
git (1.2.5)
|
19
|
+
i18n (0.6.1)
|
20
|
+
json (1.8.0)
|
21
|
+
linecache (0.46)
|
22
|
+
rbx-require-relative (> 0.0.4)
|
23
|
+
multi_json (1.7.4)
|
24
|
+
rake (10.0.3)
|
25
|
+
rbx-require-relative (0.0.9)
|
26
|
+
rspec (2.10.0)
|
27
|
+
rspec-core (~> 2.10.0)
|
28
|
+
rspec-expectations (~> 2.10.0)
|
29
|
+
rspec-mocks (~> 2.10.0)
|
30
|
+
rspec-core (2.10.1)
|
31
|
+
rspec-expectations (2.10.0)
|
32
|
+
diff-lcs (~> 1.1.3)
|
33
|
+
rspec-mocks (2.10.1)
|
34
|
+
ruby-debug (0.10.4)
|
35
|
+
columnize (>= 0.1)
|
36
|
+
ruby-debug-base (~> 0.10.4.0)
|
37
|
+
ruby-debug-base (0.10.4)
|
38
|
+
linecache (>= 0.3)
|
39
|
+
thor (0.18.1)
|
40
|
+
|
41
|
+
PLATFORMS
|
42
|
+
ruby
|
43
|
+
|
44
|
+
DEPENDENCIES
|
45
|
+
bundler (~> 1.3)
|
46
|
+
rake
|
47
|
+
rspec
|
48
|
+
ruby-debug
|
49
|
+
systemstats!
|
data/LICENSE.txt
CHANGED
data/lib/systemstats.rb
CHANGED
@@ -3,4 +3,7 @@ $LOAD_PATH << File.dirname(__FILE__)
|
|
3
3
|
|
4
4
|
require 'systemstats/iostat_reader'
|
5
5
|
require 'systemstats/os_detect'
|
6
|
-
require 'systemstats/
|
6
|
+
require 'systemstats/cpu'
|
7
|
+
require 'systemstats/disk'
|
8
|
+
require 'systemstats/version'
|
9
|
+
require 'systemstats/capacity_collector'
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
class SystemStats::CapacityCollector < Thor
|
4
|
+
desc "version", "Report the current version"
|
5
|
+
def version
|
6
|
+
puts SystemStats::VERSION
|
7
|
+
end
|
8
|
+
|
9
|
+
option :output_path, :required => true
|
10
|
+
option :output_file_prefix, :required => true
|
11
|
+
option :interval_seconds, :required => true, :type => :numeric
|
12
|
+
option :max_runtime, :required => true, :type => :numeric
|
13
|
+
option :start_delay, :required => false
|
14
|
+
option :store_to_mongo, :required => false, :type => :boolean
|
15
|
+
option :mongo_settings_yaml,:required => false
|
16
|
+
desc 'collect', "Start a system statistic collection."
|
17
|
+
def collect
|
18
|
+
file = get_output_file(options.output_path, options.output_file_prefix)
|
19
|
+
if options.start_delay
|
20
|
+
puts "Delaying collection start by #{options.start_delay} seconds"
|
21
|
+
sleep(options.start_delay)
|
22
|
+
end
|
23
|
+
start_capacity_collection(options.interval_seconds, options.max_runtime, file)
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
private
|
28
|
+
# Create the output file.
|
29
|
+
def get_output_file(path, prefix)
|
30
|
+
filename = File.join(path, "#{prefix}_#{Time.now.strftime('%m_%d_%y__%H_%M')}.csv")
|
31
|
+
file = nil
|
32
|
+
if File.exists? filename
|
33
|
+
puts "Error: file #{filename} already exists."
|
34
|
+
SystemExit
|
35
|
+
end
|
36
|
+
|
37
|
+
puts "Saving output to: #{filename}"
|
38
|
+
file = File.open(filename, "w+")
|
39
|
+
end
|
40
|
+
|
41
|
+
def start_capacity_collection(interval_in_seconds, max_runtime_in_seconds, output_file)
|
42
|
+
|
43
|
+
if interval_in_seconds.to_i < 1
|
44
|
+
puts "Error: The collection interval can't be less than 1 second"
|
45
|
+
SystemExit
|
46
|
+
end
|
47
|
+
|
48
|
+
collection_end_time = Time.now + max_runtime_in_seconds
|
49
|
+
seconds_elapsed = 0
|
50
|
+
while (Time.now < collection_end_time)
|
51
|
+
percentage = (seconds_elapsed * 100) / max_runtime_in_seconds
|
52
|
+
STDOUT.write "Collecting counters: #{percentage}% done...\r"
|
53
|
+
|
54
|
+
output_file.write(get_counter_values)
|
55
|
+
output_file.write("\n")
|
56
|
+
|
57
|
+
seconds_elapsed += interval_in_seconds
|
58
|
+
sleep(interval_in_seconds)
|
59
|
+
end
|
60
|
+
puts "Collection done."
|
61
|
+
end
|
62
|
+
|
63
|
+
#todo - make it dynamic to load a list of what to collect from a config.
|
64
|
+
#Retrieves the list of counter values from the counter dict.
|
65
|
+
def get_counter_values
|
66
|
+
line = ""
|
67
|
+
#cpu
|
68
|
+
if @cpu_counters.nil?
|
69
|
+
@cpu_counters = get_cpu_counter_list
|
70
|
+
end
|
71
|
+
@cpu_counters.each_key {|key| line += "#{SystemStats::CPU.send(@cpu_counters[key])}," }
|
72
|
+
|
73
|
+
#disk
|
74
|
+
if @disk_counters.nil?
|
75
|
+
@disk_counters = get_disk_counter_list
|
76
|
+
end
|
77
|
+
@disk_counters.each_key {|key| line += "#{SystemStats::Disk.send(@disk_counters[key])}," }
|
78
|
+
|
79
|
+
return line
|
80
|
+
end
|
81
|
+
|
82
|
+
# Returns the list of CPU counters to monitor
|
83
|
+
def get_cpu_counter_list
|
84
|
+
counters = Hash.new
|
85
|
+
counters[0] = "user_average"
|
86
|
+
counters[1] = "system_average"
|
87
|
+
counters[2] = "idle_average"
|
88
|
+
return counters
|
89
|
+
end
|
90
|
+
|
91
|
+
# Returns the list of Disk counters to monitor
|
92
|
+
def get_disk_counter_list
|
93
|
+
counters = Hash.new
|
94
|
+
counters[0] = "read_request_queue_merges"
|
95
|
+
counters[1] = "write_request_queue_merges"
|
96
|
+
counters[2] = "reads_per_second"
|
97
|
+
counters[3] = "writes_per_second"
|
98
|
+
counters[4] = "read_sectors_per_second"
|
99
|
+
counters[5] = "write_sectors_per_second"
|
100
|
+
counters[6] = "average_request_queue_size"
|
101
|
+
counters[7] = "average_queue_lenght"
|
102
|
+
counters[8] = "average_io_wait_in_millis"
|
103
|
+
counters[9] = "read_request_wait_in_millis"
|
104
|
+
counters[10] = "write_request_wait_in_millis"
|
105
|
+
counters[11] = "bandwidth_use_in_cpu_time_percentage"
|
106
|
+
return counters
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module SystemStats
|
3
|
+
class CPU
|
4
|
+
|
5
|
+
# Returns de User average cpu use percentage
|
6
|
+
def self.user_average
|
7
|
+
IoStatReader.cpu_user_average
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns the system Cpu average use percentage
|
11
|
+
def self.system_average
|
12
|
+
IoStatReader.cpu_system_average
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns the user Cpu average idle time percentage
|
16
|
+
def self.idle_average
|
17
|
+
IoStatReader.cpu_idle_average
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module SystemStats
|
3
|
+
class Disk
|
4
|
+
# Returns the user's Kilobytes per transfer
|
5
|
+
# Disk id is the numeric ID in osx, disk type in linux
|
6
|
+
# OSX: disk0 => '0', Linux => disk 0 => 'sda'
|
7
|
+
def self.kb_per_transfer_mac_only(disk_id)
|
8
|
+
IoStatReader.read_iostats(disk_id)[:disk][0]
|
9
|
+
end
|
10
|
+
|
11
|
+
# Returns the number of current transfers per second for a disk
|
12
|
+
# Disk id is the numeric ID in osx, disk type in linux
|
13
|
+
# OSX: disk0 => '0', Linux => disk 0 => 'sda'
|
14
|
+
def self.transfers_per_second_mac_only(disk_id)
|
15
|
+
IoStatReader.read_iostats(disk_id)[:disk][1]
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns the current number of megabytes transfered on a disk per second
|
19
|
+
# Disk id is the numeric ID in osx, disk type in linux
|
20
|
+
# OSX: disk0 => '0', Linux => disk 0 => 'sda'
|
21
|
+
def self.megabytes_per_second_mac_only(disk_id)
|
22
|
+
IoStatReader.read_iostats(disk_id)[:disk][2]
|
23
|
+
end
|
24
|
+
|
25
|
+
# Number of read requests merged into the device per second.
|
26
|
+
def self.read_request_queue_merges(disk_id = 'sda')
|
27
|
+
IoStatReader.read_iostats(disk_id)[:disk][0]
|
28
|
+
end
|
29
|
+
|
30
|
+
# Number of write requests merged into the device per second.
|
31
|
+
def self.write_request_queue_merges(disk_id = 'sda')
|
32
|
+
IoStatReader.read_iostats(disk_id)[:disk][1]
|
33
|
+
end
|
34
|
+
|
35
|
+
# Number of read requests after merge done on the device per second.
|
36
|
+
def self.reads_per_second(disk_id = 'sda')
|
37
|
+
IoStatReader.read_iostats(disk_id)[:disk][2]
|
38
|
+
end
|
39
|
+
|
40
|
+
# Number of write requests after merge done on the device per second.
|
41
|
+
def self.writes_per_second(disk_id = 'sda')
|
42
|
+
IoStatReader.read_iostats(disk_id)[:disk][3]
|
43
|
+
end
|
44
|
+
|
45
|
+
# Number of sectors read on the device per second.
|
46
|
+
def self.read_sectors_per_second(disk_id = 'sda')
|
47
|
+
IoStatReader.read_iostats(disk_id)[:disk][4]
|
48
|
+
end
|
49
|
+
|
50
|
+
# Number of secotrs written on the device per second
|
51
|
+
def self.write_sectors_per_second(disk_id = 'sda')
|
52
|
+
IoStatReader.read_iostats(disk_id)[:disk][5]
|
53
|
+
end
|
54
|
+
|
55
|
+
# Average size of the disk requests queue size
|
56
|
+
def self.average_request_queue_size(disk_id = 'sda')
|
57
|
+
IoStatReader.read_iostats(disk_id)[:disk][6]
|
58
|
+
end
|
59
|
+
|
60
|
+
# Average length of the disk request queue
|
61
|
+
def self.average_queue_lenght(disk_id = 'sda')
|
62
|
+
IoStatReader.read_iostats(disk_id)[:disk][7]
|
63
|
+
end
|
64
|
+
|
65
|
+
# Average time io requests wait to be served in milli seconds
|
66
|
+
def self.average_io_wait_in_millis(disk_id = 'sda')
|
67
|
+
IoStatReader.read_iostats(disk_id)[:disk][8]
|
68
|
+
end
|
69
|
+
|
70
|
+
# Average time read requests wait to be served in milli seconds
|
71
|
+
def self.read_request_wait_in_millis(disk_id = 'sda')
|
72
|
+
IoStatReader.read_iostats(disk_id)[:disk][9]
|
73
|
+
end
|
74
|
+
|
75
|
+
# Average time write requests wait to be served in milli seconds
|
76
|
+
def self.write_request_wait_in_millis(disk_id = 'sda')
|
77
|
+
IoStatReader.read_iostats(disk_id)[:disk][10]
|
78
|
+
end
|
79
|
+
|
80
|
+
# % of CPU used during the time IO requets were being served to the device.
|
81
|
+
# used to detect device saturation
|
82
|
+
def self.bandwidth_use_in_cpu_time_percentage(disk_id = 'sda')
|
83
|
+
IoStatReader.read_iostats(disk_id)[:disk][12]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -4,11 +4,11 @@ module SystemStats
|
|
4
4
|
class IoStatReader
|
5
5
|
|
6
6
|
IOSTAT_CMD_OSX = 'iostat -dC disk'
|
7
|
-
IOSTAT_CMD_LINUX = 'iostat -x'
|
7
|
+
IOSTAT_CMD_LINUX = 'iostat -x '
|
8
8
|
|
9
9
|
private
|
10
10
|
# Gets system statistics from iostats and parses the output
|
11
|
-
def read_iostats(disk)
|
11
|
+
def self.read_iostats(disk)
|
12
12
|
if OS::linux?
|
13
13
|
process_iostat_linux(disk)
|
14
14
|
elsif OS::mac?
|
@@ -19,9 +19,11 @@ module SystemStats
|
|
19
19
|
end
|
20
20
|
|
21
21
|
# Parse disk/cpu counters from iostat on osx.
|
22
|
-
def process_iostat_mac(disk_id = 0)
|
22
|
+
def self.process_iostat_mac(disk_id = 0)
|
23
23
|
output = IO.popen(IOSTAT_CMD_OSX + disk_id.to_s)
|
24
24
|
data = output.readlines
|
25
|
+
output.close
|
26
|
+
puts data
|
25
27
|
values = Hash.new
|
26
28
|
begin
|
27
29
|
values[:cpu] = data[2].split[3,3]
|
@@ -33,55 +35,143 @@ module SystemStats
|
|
33
35
|
end
|
34
36
|
|
35
37
|
# Parse disk/cpu counters from iostat on linux.
|
36
|
-
def process_iostat_linux(disk_id = 'sda1')
|
38
|
+
def self.process_iostat_linux(disk_id = 'sda1')
|
37
39
|
output = IO.popen(IOSTAT_CMD_LINUX + disk_id.to_s)
|
38
40
|
data = output.readlines
|
39
41
|
values = Hash.new
|
40
42
|
begin
|
41
43
|
values[:cpu] = [data[3].split[0] , data[3].split[2], data[3].split[5]]
|
42
|
-
values[:disk] = data[
|
44
|
+
values[:disk] = data[6].split[0,13]
|
43
45
|
rescue => parse_error
|
44
46
|
raise 'Error parsing IoStats output.'
|
45
47
|
end
|
46
48
|
values
|
47
49
|
end
|
48
50
|
|
51
|
+
def self.raise_if_not_linux
|
52
|
+
unless OS::linux?
|
53
|
+
raise "unsupported OS. Not Linux"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Raises an error when not running under linux
|
58
|
+
def self.raise_if_not_mac
|
59
|
+
unless OS::mac?
|
60
|
+
raise "unsupported OS. Not OSX"
|
61
|
+
end
|
62
|
+
end
|
49
63
|
public
|
50
64
|
|
51
65
|
# Returns the User Cpu average percentage
|
52
|
-
def cpu_user_average
|
66
|
+
def self.cpu_user_average
|
53
67
|
read_iostats(0)[:cpu][0]
|
54
68
|
end
|
55
69
|
|
56
70
|
# Returns the system Cpu average use percentage
|
57
|
-
def cpu_system_average
|
71
|
+
def self.cpu_system_average
|
58
72
|
read_iostats(0)[:cpu][1]
|
59
73
|
end
|
60
74
|
|
61
75
|
# Returns the user Cpu average idle time percentage
|
62
|
-
def cpu_idle_average
|
76
|
+
def self.cpu_idle_average
|
63
77
|
read_iostats(0)[:cpu][2]
|
64
78
|
end
|
65
79
|
|
66
80
|
# Returns the user's Kilobytes per transfer
|
67
81
|
# Disk id is the numeric ID in osx, disk type in linux
|
68
82
|
# OSX: disk0 => '0', Linux => disk 0 => 'sda'
|
69
|
-
def disk_kb_per_transfer(disk_id)
|
83
|
+
def self.disk_kb_per_transfer(disk_id)
|
84
|
+
raise_if_not_mac
|
70
85
|
read_iostats(disk_id)[:disk][0]
|
71
86
|
end
|
72
87
|
|
73
88
|
# Returns the number of current transfers per second for a disk
|
74
89
|
# Disk id is the numeric ID in osx, disk type in linux
|
75
90
|
# OSX: disk0 => '0', Linux => disk 0 => 'sda'
|
76
|
-
def disk_transfers_per_second(disk_id)
|
91
|
+
def self.disk_transfers_per_second(disk_id)
|
92
|
+
raise_if_not_mac
|
77
93
|
read_iostats(disk_id)[:disk][1]
|
78
94
|
end
|
79
95
|
|
80
96
|
# Returns the current number of megabytes transfered on a disk per second
|
81
97
|
# Disk id is the numeric ID in osx, disk type in linux
|
82
98
|
# OSX: disk0 => '0', Linux => disk 0 => 'sda'
|
83
|
-
def disk_megabytes_per_second(disk_id)
|
99
|
+
def self.disk_megabytes_per_second(disk_id)
|
100
|
+
raise_if_not_mac
|
84
101
|
read_iostats(disk_id)[:disk][2]
|
85
102
|
end
|
103
|
+
|
104
|
+
# Number of read requests merged into the device per second.
|
105
|
+
def self.disk_read_request_queue_merges(disk_id)
|
106
|
+
raise_if_not_linux
|
107
|
+
read_iostats(disk_id)[:disk][0]
|
108
|
+
end
|
109
|
+
|
110
|
+
# Number of write requests merged into the device per second.
|
111
|
+
def self.disk_write_request_queue_merges(disk_id)
|
112
|
+
raise_if_not_linux
|
113
|
+
read_iostats(disk_id)[:disk][1]
|
114
|
+
end
|
115
|
+
|
116
|
+
# Number of read requests after merge done on the device per second.
|
117
|
+
def self.disk_reads_per_second(disk_id)
|
118
|
+
raise_if_not_linux
|
119
|
+
read_iostats(disk_id)[:disk][2]
|
120
|
+
end
|
121
|
+
|
122
|
+
# Number of write requests after merge done on the device per second.
|
123
|
+
def self.disk_writes_per_second(disk_id)
|
124
|
+
raise_if_not_linux
|
125
|
+
read_iostats(disk_id)[:disk][3]
|
126
|
+
end
|
127
|
+
|
128
|
+
# Number of sectors read on the device per second.
|
129
|
+
def self.disk_read_sectors_per_second(disk_id)
|
130
|
+
raise_if_not_linux
|
131
|
+
read_iostats(disk_id)[:disk][4]
|
132
|
+
end
|
133
|
+
|
134
|
+
# Number of secotrs written on the device per second
|
135
|
+
def self.disk_write_sectors_per_second(disk_id)
|
136
|
+
raise_if_not_linux
|
137
|
+
read_iostats(disk_id)[:disk][5]
|
138
|
+
end
|
139
|
+
|
140
|
+
# Average size of the disk requests queue size
|
141
|
+
def self.disk_average_request_queue_size(disk_id)
|
142
|
+
raise_if_not_linux
|
143
|
+
read_iostats(disk_id)[:disk][6]
|
144
|
+
end
|
145
|
+
|
146
|
+
# Average length of the disk request queue
|
147
|
+
def self.disk_average_queue_lenght(disk_id)
|
148
|
+
raise_if_not_linux
|
149
|
+
read_iostats(disk_id)[:disk][7]
|
150
|
+
end
|
151
|
+
|
152
|
+
# Average time io requests wait to be served in milli seconds
|
153
|
+
def self.disk_average_io_wait_in_millis(disk_id)
|
154
|
+
raise_if_not_linux
|
155
|
+
read_iostats(disk_id)[:disk][8]
|
156
|
+
end
|
157
|
+
|
158
|
+
# Average time read requests wait to be served in milli seconds
|
159
|
+
def self.disk_read_request_wait_in_millis(disk_id)
|
160
|
+
raise_if_not_linux
|
161
|
+
read_iostats(disk_id)[:disk][9]
|
162
|
+
end
|
163
|
+
|
164
|
+
# Average time write requests wait to be served in milli seconds
|
165
|
+
def self.disk_write_request_wait_in_millis(disk_id)
|
166
|
+
raise_if_not_linux
|
167
|
+
read_iostats(disk_id)[:disk][10]
|
168
|
+
end
|
169
|
+
|
170
|
+
# % of CPU used during the time IO requets were being served to the device.
|
171
|
+
# used to detect device saturation
|
172
|
+
def self.disk_bandwidth_use_in_cpu_time_percentage(disk_id)
|
173
|
+
raise_if_not_linux
|
174
|
+
read_iostats(disk_id)[:disk][12]
|
175
|
+
end
|
86
176
|
end
|
87
177
|
end
|
data/lib/systemstats/version.rb
CHANGED
@@ -25,38 +25,42 @@ describe SystemStats::IoStatReader do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
it "creates a new instance" do
|
28
|
-
|
28
|
+
SystemStats::IoStatReader.any_instance.stub(:readlines).and_return(mock_iostat_output_linux)
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should return the average cpu_user_average for the current cpu" do
|
32
|
-
|
32
|
+
SystemStats::CPU.user_average.should == '0.01'
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should return the average cpu_system_average for the current cpu" do
|
36
|
-
|
36
|
+
SystemStats::CPU.system_average.should == '0.32'
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should return the average cpu_user_average for the current cpu" do
|
40
|
-
|
40
|
+
SystemStats::CPU.idle_average.should == '98.82'
|
41
41
|
end
|
42
42
|
|
43
43
|
it "should return the megabytes per second for disk 0" do
|
44
|
-
|
44
|
+
SystemStats::Disk.writes_per_second(sda1).should == '0.44'
|
45
45
|
end
|
46
46
|
|
47
|
-
it "should
|
48
|
-
|
49
|
-
end
|
47
|
+
# it "should return the megabytes per second for disk 0" do
|
48
|
+
# SystemStats::Disk.megabytes_per_second(0).should == '0.44'
|
49
|
+
# end
|
50
50
|
|
51
|
-
it "should fail on a
|
52
|
-
|
53
|
-
end
|
51
|
+
# it "should fail on a non existent disk" do
|
52
|
+
# SystemStats::Disk.megabytes_per_second(100).should_not == '0.27'
|
53
|
+
# end
|
54
54
|
|
55
|
-
it "should
|
56
|
-
|
57
|
-
end
|
55
|
+
# it "should fail on a random string as disk" do
|
56
|
+
# SystemStats::Disk.megabytes_per_second('randomdisk').should raise_error
|
57
|
+
# end
|
58
58
|
|
59
|
-
it "should return the transfer per second for disk 0" do
|
60
|
-
|
61
|
-
end
|
59
|
+
# it "should return the transfer per second for disk 0" do
|
60
|
+
# SystemStats::Disk.transfers_per_second(0) == '12'
|
61
|
+
# end
|
62
|
+
|
63
|
+
# it "should return the transfer per second for disk 0" do
|
64
|
+
# SystemStats::Disk.kb_per_transfer(0) == '23.41'
|
65
|
+
# end
|
62
66
|
end
|
@@ -39,19 +39,19 @@ describe SystemStats::IoStatReader do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should return the megabytes per second for disk 0" do
|
42
|
-
stats.
|
42
|
+
stats.disk_megabytes_per_second_mac_only(0).should == '0.27'
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should fail on a random string as disk" do
|
46
|
-
stats.
|
46
|
+
stats.disk_megabytes_per_second_mac_only('randomdisk').should raise_error
|
47
47
|
end
|
48
48
|
|
49
49
|
it "should return the transfer per second for disk 0" do
|
50
|
-
stats.
|
50
|
+
stats.disk_transfers_per_second_mac_only(0) == '12'
|
51
51
|
end
|
52
52
|
|
53
53
|
it "should return the transfer per second for disk 0" do
|
54
|
-
stats.
|
54
|
+
stats.disk_kb_per_transfer_mac_only(0) == '23.41'
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
data/systemstats.gemspec
CHANGED
metadata
CHANGED
@@ -1,137 +1,163 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: systemstats
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- dev
|
10
|
-
version: 0.1.dev
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.3'
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Ivan Marcin
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-07-11 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: json
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
hash: 3
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
32
22
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: git
|
36
23
|
prerelease: false
|
37
|
-
|
38
|
-
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: git
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
46
38
|
type: :runtime
|
47
|
-
|
48
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
49
47
|
name: activesupport
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
50
55
|
prerelease: false
|
51
|
-
|
52
|
-
none: false
|
53
|
-
requirements:
|
54
|
-
- -
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: thor
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
60
70
|
type: :runtime
|
61
|
-
version_requirements: *id003
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: bundler
|
64
71
|
prerelease: false
|
65
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: bundler
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
66
81
|
none: false
|
67
|
-
requirements:
|
82
|
+
requirements:
|
68
83
|
- - ~>
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
|
71
|
-
segments:
|
72
|
-
- 1
|
73
|
-
- 3
|
74
|
-
version: "1.3"
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '1.3'
|
75
86
|
type: :development
|
76
|
-
version_requirements: *id004
|
77
|
-
- !ruby/object:Gem::Dependency
|
78
|
-
name: rake
|
79
87
|
prerelease: false
|
80
|
-
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- -
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '1.3'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rake
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
89
102
|
type: :development
|
90
|
-
version_requirements: *id005
|
91
|
-
- !ruby/object:Gem::Dependency
|
92
|
-
name: rspec
|
93
103
|
prerelease: false
|
94
|
-
|
95
|
-
none: false
|
96
|
-
requirements:
|
97
|
-
- -
|
98
|
-
- !ruby/object:Gem::Version
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: rspec
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
103
118
|
type: :development
|
104
|
-
version_requirements: *id006
|
105
|
-
- !ruby/object:Gem::Dependency
|
106
|
-
name: ruby-debug
|
107
119
|
prerelease: false
|
108
|
-
|
109
|
-
none: false
|
110
|
-
requirements:
|
111
|
-
- -
|
112
|
-
- !ruby/object:Gem::Version
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: ruby-debug
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
117
134
|
type: :development
|
118
|
-
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
119
142
|
description: Retrieves machine stats, including cpu,memory,disk,io
|
120
|
-
email:
|
143
|
+
email:
|
121
144
|
- ivan.marcin@lookout.com
|
122
|
-
executables:
|
123
|
-
|
145
|
+
executables:
|
146
|
+
- SystemStatsCollector
|
124
147
|
extensions: []
|
125
|
-
|
126
148
|
extra_rdoc_files: []
|
127
|
-
|
128
|
-
|
129
|
-
- .gitignore
|
149
|
+
files:
|
150
|
+
- .DS_Store
|
130
151
|
- Gemfile
|
152
|
+
- Gemfile.lock
|
131
153
|
- LICENSE.txt
|
132
154
|
- README.md
|
133
155
|
- Rakefile
|
156
|
+
- bin/SystemStatsCollector
|
134
157
|
- lib/systemstats.rb
|
158
|
+
- lib/systemstats/capacity_collector.rb
|
159
|
+
- lib/systemstats/cpu.rb
|
160
|
+
- lib/systemstats/disk.rb
|
135
161
|
- lib/systemstats/iostat_reader.rb
|
136
162
|
- lib/systemstats/os_detect.rb
|
137
163
|
- lib/systemstats/version.rb
|
@@ -141,40 +167,30 @@ files:
|
|
141
167
|
- systemstats.gemspec
|
142
168
|
homepage: https://source.flexilis.local/gems/systemstats
|
143
169
|
licenses: []
|
144
|
-
|
145
170
|
post_install_message:
|
146
171
|
rdoc_options: []
|
147
|
-
|
148
|
-
require_paths:
|
172
|
+
require_paths:
|
149
173
|
- lib
|
150
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
174
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
151
175
|
none: false
|
152
|
-
requirements:
|
153
|
-
- -
|
154
|
-
- !ruby/object:Gem::Version
|
155
|
-
|
156
|
-
|
157
|
-
- 0
|
158
|
-
version: "0"
|
159
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - ! '>='
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: '0'
|
180
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
160
181
|
none: false
|
161
|
-
requirements:
|
162
|
-
- -
|
163
|
-
- !ruby/object:Gem::Version
|
164
|
-
|
165
|
-
segments:
|
166
|
-
- 1
|
167
|
-
- 3
|
168
|
-
- 1
|
169
|
-
version: 1.3.1
|
182
|
+
requirements:
|
183
|
+
- - ! '>='
|
184
|
+
- !ruby/object:Gem::Version
|
185
|
+
version: '0'
|
170
186
|
requirements: []
|
171
|
-
|
172
187
|
rubyforge_project:
|
173
|
-
rubygems_version: 1.8.
|
188
|
+
rubygems_version: 1.8.25
|
174
189
|
signing_key:
|
175
190
|
specification_version: 3
|
176
191
|
summary: Library to access a machine's performance stats
|
177
|
-
test_files:
|
192
|
+
test_files:
|
178
193
|
- spec/spec_helper.rb
|
179
194
|
- spec/unit/iostat_linux_spec.rb
|
180
195
|
- spec/unit/iostat_osx_spec.rb
|
196
|
+
has_rdoc:
|