File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -30,7 +30,6 @@ gem 'sinatra-contrib'
3030gem 'statsd-instrument' , '~> 3.11'
3131gem 'talentbox-delayed_job_sequel' , '~> 4.4.0'
3232gem 'uri' , '~> 1.1'
33- gem 'vmstat' , '~> 2.3'
3433
3534# Rails Components
3635gem 'actionpack' , '~> 8.1.2'
Original file line number Diff line number Diff line change 418418 unicode-emoji (4.2.0 )
419419 uri (1.1.1 )
420420 useragent (0.16.11 )
421- vmstat (2.3.1 )
422421 webmock (3.26.2 )
423422 addressable (>= 2.8.0 )
424423 crack (>= 0.3.2 )
@@ -503,7 +502,6 @@ DEPENDENCIES
503502 talentbox-delayed_job_sequel (~> 4.4.0 )
504503 timecop
505504 uri (~> 1.1 )
506- vmstat (~> 2.3 )
507505 webmock (> 2.3.1 )
508506 webrick (~> 1.9.2 )
509507
Original file line number Diff line number Diff line change 11require 'vcap/pid_file'
2- require 'vmstat'
32
43module VCAP
54 class Stats
@@ -16,21 +15,38 @@ def process_memory_bytes_and_cpu
1615 end
1716
1817 def memory_used_bytes
19- mem = Vmstat . memory
20- mem . active_bytes + mem . wired_bytes
18+ return 0 unless linux?
19+
20+ m = meminfo
21+ ( m [ 'MemTotal' ] - m [ 'Inactive' ] - m [ 'MemFree' ] ) * 1024
2122 end
2223
2324 def memory_free_bytes
24- mem = Vmstat . memory
25- mem . inactive_bytes + mem . free_bytes
25+ return 0 unless linux?
26+
27+ m = meminfo
28+ ( m [ 'Inactive' ] + m [ 'MemFree' ] ) * 1024
2629 end
2730
2831 def cpu_load_average
29- Vmstat . load_average . one_minute
32+ return 0 unless linux?
33+
34+ File . read ( '/proc/loadavg' ) . split . first . to_f
3035 end
3136
3237 private
3338
39+ def linux?
40+ RUBY_PLATFORM . match? ( /linux/ )
41+ end
42+
43+ def meminfo
44+ File . read ( '/proc/meminfo' ) . each_line . with_object ( { } ) do |line , h |
45+ k , v = line . split
46+ h [ k . chomp ( ':' ) ] = v . to_i if k && v
47+ end
48+ end
49+
3450 def ps_pid
3551 `ps -o rss=,pcpu= -p #{ Process . pid } `
3652 end
Original file line number Diff line number Diff line change 1313 expect ( pcpu ) . to eq ( 17 )
1414 end
1515 end
16+
17+ describe 'system metrics on Linux' do
18+ let ( :meminfo ) do
19+ <<~MEMINFO
20+ MemTotal: 16793990 kB
21+ MemFree: 10810368 kB
22+ MemAvailable: 13636608 kB
23+ Buffers: 455475 kB
24+ Cached: 2707660 kB
25+ Active: 920268 kB
26+ Inactive: 4609024 kB
27+ MEMINFO
28+ end
29+ let ( :loadavg ) { "1.37 1.21 1.05 2/512 12345\n " }
30+
31+ before do
32+ allow ( VCAP ::Stats ) . to receive ( :linux? ) . and_return ( true )
33+ allow ( File ) . to receive ( :read ) . and_call_original
34+ allow ( File ) . to receive ( :read ) . with ( '/proc/meminfo' ) . and_return ( meminfo )
35+ allow ( File ) . to receive ( :read ) . with ( '/proc/loadavg' ) . and_return ( loadavg )
36+ end
37+
38+ describe '#memory_free_bytes' do
39+ it 'returns (Inactive + MemFree) in bytes' do
40+ expect ( VCAP ::Stats . memory_free_bytes ) . to eq ( ( 4_609_024 + 10_810_368 ) * 1024 )
41+ end
42+ end
43+
44+ describe '#memory_used_bytes' do
45+ it 'returns (MemTotal - Inactive - MemFree) in bytes' do
46+ expect ( VCAP ::Stats . memory_used_bytes ) . to eq ( ( 16_793_990 - 4_609_024 - 10_810_368 ) * 1024 )
47+ end
48+ end
49+
50+ describe '#cpu_load_average' do
51+ it 'returns the one-minute load as a float' do
52+ expect ( VCAP ::Stats . cpu_load_average ) . to eq ( 1.37 )
53+ end
54+ end
55+ end
56+
57+ describe 'system metrics on non-Linux' do
58+ before do
59+ allow ( VCAP ::Stats ) . to receive ( :linux? ) . and_return ( false )
60+ end
61+
62+ it 'returns 0 for memory_used_bytes' do
63+ expect ( VCAP ::Stats . memory_used_bytes ) . to eq ( 0 )
64+ end
65+
66+ it 'returns 0 for memory_free_bytes' do
67+ expect ( VCAP ::Stats . memory_free_bytes ) . to eq ( 0 )
68+ end
69+
70+ it 'returns 0 for cpu_load_average' do
71+ expect ( VCAP ::Stats . cpu_load_average ) . to eq ( 0 )
72+ end
73+ end
1674end
You can’t perform that action at this time.
0 commit comments