/
cpu_usage.rb
80 lines (69 loc) · 2.15 KB
/
cpu_usage.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
module God
module Conditions
# Condition Symbol :cpu_usage
# Type: Poll
#
# Trigger when the percent of CPU use of a process is above a specified limit.
# On multi-core systems, this number could conceivably be above 100.
#
# Paramaters
# Required
# +pid_file+ is the pid file of the process in question. Automatically
# populated for Watches.
# +above+ is the percent CPU above which to trigger the condition. You
# may use #percent to clarify this amount (see examples).
#
# Examples
#
# Trigger if the process is using more than 25 percent of the cpu (from a Watch):
#
# on.condition(:cpu_usage) do |c|
# c.above = 25.percent
# end
#
# Non-Watch Tasks must specify a PID file:
#
# on.condition(:cpu_usage) do |c|
# c.above = 25.percent
# c.pid_file = "/var/run/mongrel.3000.pid"
# end
class CpuUsage < PollCondition
attr_accessor :above, :times, :pid_file
def initialize
super
self.above = nil
self.times = [1, 1]
end
def prepare
if self.times.kind_of?(Integer)
self.times = [self.times, self.times]
end
@timeline = Timeline.new(self.times[1])
end
def reset
@timeline.clear
end
def pid
self.pid_file ? File.read(self.pid_file).strip.to_i : self.watch.pid
end
def valid?
valid = true
valid &= complain("Attribute 'pid_file' must be specified", self) if self.pid_file.nil? && self.watch.pid_file.nil?
valid &= complain("Attribute 'above' must be specified", self) if self.above.nil?
valid
end
def test
process = System::Process.new(self.pid)
@timeline.push(process.percent_cpu)
self.info = []
history = "[" + @timeline.map { |x| "#{x > self.above ? '*' : ''}#{x}%%" }.join(", ") + "]"
if @timeline.select { |x| x > self.above }.size >= self.times.first
self.info = "cpu out of bounds #{history}"
return true
else
return false
end
end
end
end
end