server_metrics 1.1.0.pre → 1.1.1.pre

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 1.1.1
2
+
3
+ * Handling Infinite and NaN Process CPU Usage.
4
+ * Case-insensitive process count grep, returning 1 processor vs. nil on rescue.
5
+
1
6
  ## 1.1.0
2
7
 
3
8
  * sys/proctable is no longer a dependency in the gemspec.
@@ -84,15 +84,7 @@ class ServerMetrics::Processes
84
84
  elapsed_jiffies = current_jiffies - @last_jiffies
85
85
  if elapsed_time >= 1
86
86
  processes.each do |p|
87
- if last_cpu = @last_process_list[p.pid]
88
- p.recent_cpu = p.combined_cpu - last_cpu
89
- else
90
- p.recent_cpu = p.combined_cpu # this process wasn't around last time, so just use the cumulative CPU time for its existence so far
91
- end
92
- # a) p.recent_cpu / elapsed_jiffies = the amount of CPU time this process has taken divided by the total "time slots" the CPU has available
93
- # b) * 100 ... this turns it into a percentage
94
- # b) / num_processors ... this normalizes for the the number of processors in the system, so it reflects the amount of CPU power avaiable as a whole
95
- p.recent_cpu_percentage = ((p.recent_cpu.to_f / elapsed_jiffies.to_f ) * 100.0) / num_processors.to_f
87
+ p.set_recent_cpu(@last_process_list[p.pid],elapsed_jiffies,num_processors)
96
88
  end
97
89
  end
98
90
  end
@@ -107,7 +99,7 @@ class ServerMetrics::Processes
107
99
  :cmdlines => []
108
100
  }
109
101
  grouped[proc.comm][:count] += 1
110
- grouped[proc.comm][:cpu] += proc.recent_cpu_percentage || 0
102
+ grouped[proc.comm][:cpu] += proc.recent_cpu_percentage
111
103
  if proc.has?(:rss) # mac doesn't return rss. Mac returns 0 for memory usage
112
104
  # converted to MB from bytes
113
105
  grouped[proc.comm][:memory] += (proc.rss.to_f*page_size) / 1024 / 1024
@@ -173,16 +165,36 @@ class ServerMetrics::Processes
173
165
  @pts=proctable_struct
174
166
  @recent_cpu = 0
175
167
  end
168
+
176
169
  # because apparently respond_to doesn't work through method_missing
177
170
  def has?(method_name)
178
171
  @pts.respond_to?(method_name)
179
172
  end
173
+
174
+ def set_recent_cpu(last_cpu,elapsed_jiffies,num_processors)
175
+ if last_cpu
176
+ self.recent_cpu = combined_cpu - last_cpu
177
+ else
178
+ self.recent_cpu = combined_cpu # this process wasn't around last time, so just use the cumulative CPU time for its existence so far
179
+ end
180
+ # a) self.recent_cpu / elapsed_jiffies = the amount of CPU time this process has taken divided by the total "time slots" the CPU has available
181
+ # b) * 100 ... this turns it into a percentage
182
+ # b) / num_processors ... this normalizes for the the number of processors in the system, so it reflects the amount of CPU power avaiable as a whole
183
+ self.recent_cpu_percentage = ((recent_cpu.to_f / elapsed_jiffies.to_f ) * 100.0) / num_processors.to_f
184
+ end
185
+
186
+ def recent_cpu_percentage
187
+ # On RaspberryPi, cpu % has been reported as both Infinite and NaN. Instead, 0 is reported.
188
+ (@recent_cpu_percentage and !@recent_cpu_percentage.infinite? and !@recent_cpu_percentage.nan?) ? @recent_cpu_percentage : 0
189
+ end
190
+
180
191
  def combined_cpu
181
192
  # best thread I've seen on cutime vs utime & cstime vs stime: https://www.ruby-forum.com/topic/93176
182
193
  # * cutime and cstime include CPUusage of child processes
183
194
  # * utime and stime don't include CPU usage of child processes
184
195
  (utime || 0) + (stime || 0) # utime and stime aren't available on mac. Result is %cpu is 0 on mac.
185
196
  end
197
+
186
198
  # delegate everything else to ProcTable::Struct
187
199
  def method_missing(sym, *args, &block)
188
200
  @pts.send sym, *args, &block
@@ -21,10 +21,10 @@ module ServerMetrics
21
21
  `sysctl -n hw.ncpu`.to_i
22
22
  elsif os =~ /linux/
23
23
  lines = `cat /proc/cpuinfo`.split("\n")
24
- lines.grep(/^processor\s*:/).size
24
+ lines.grep(/^processor\s*:/i).size
25
25
  end
26
26
  rescue
27
- nil
27
+ 1
28
28
  end
29
29
 
30
30
  def self.timezone
@@ -1,3 +1,3 @@
1
1
  module ServerMetrics
2
- VERSION = "1.1.0.pre"
2
+ VERSION = "1.1.1.pre"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: server_metrics
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0.pre
4
+ version: 1.1.1.pre
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2014-01-16 00:00:00.000000000 Z
14
+ date: 2014-01-21 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -157,9 +157,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
157
157
  - - ! '>='
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
- segments:
161
- - 0
162
- hash: 926714783005878761
163
160
  required_rubygems_version: !ruby/object:Gem::Requirement
164
161
  none: false
165
162
  requirements:
@@ -181,3 +178,4 @@ test_files:
181
178
  - test/test_basics.rb
182
179
  - test/test_helper.rb
183
180
  - test/test_with_fixtures.rb
181
+ has_rdoc: