procmon 0.0.3 → 0.0.4

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/README.md CHANGED
@@ -8,45 +8,53 @@ It's hosted on [rubygems.org][rubygems].
8
8
 
9
9
  sudo gem install procmon
10
10
 
11
- ## Example of how to use Procmon
12
-
13
- ```
14
- require 'procmon'
15
-
16
- notifier = Proc.new do
17
- puts "I NEED TO SEND OUT AN EMAIL"
18
- end
19
-
20
- notifier2 = Proc.new do
21
- puts "I NEED TO SEND OUT AN SMS"
22
- end
23
-
24
- # action can be a Proc object. You can define whatever you want to do
25
- Procmon.process("Mail") do |process|
26
- process.checks :mem_usage, :above => 100.megabytes, :actions => [notifier, notifier2]
27
- end
28
-
29
- # You can specify a code block as well
30
- Procmon.process("Mail") do |process|
31
- process.pid = 29124
32
- process.checks :mem_usage, :above => 100.megabytes do
33
- puts "I'm in your base"
34
- end
35
- end
36
-
37
- # Using built-in email notifier
38
- NOTIFICATION_TARGET='ddao@example.com'
39
- Procmon.process("Mail") do |process|
40
- process.checks :mem_usage, :above => 100.megabytes, :actions => [Procmon::Notifiers::Email]
41
- end
42
-
43
- # Would be nice if we can do this as well
44
- # Procmon.process("Mail") do |process|
45
- # process.checks :mem_usage, :above => 100.megabytes do |action|
46
- # action.perform(notifier)
47
- # action.perform(Procmon::Notifiers::Email, 'someone@example.com')
48
- # end
49
- # process.checks :mem_usage, :above => 100.megabytes, :actions => [notifier, notifier2]
50
- # process.checks :mem_usage, :above => 100.megabytes, :actions => [Procmon::Notifiers::Email]
51
- #end
11
+ ## Usage
12
+
13
+ ```ruby
14
+ require 'rubygems'
15
+ require 'procmon'
16
+
17
+ notifier = Proc.new do
18
+ puts "I NEED TO SEND OUT AN EMAIL"
19
+ end
20
+
21
+ notifier2 = Proc.new do
22
+ puts "I NEED TO SEND OUT AN SMS"
23
+ end
24
+
25
+ # action can be a Proc object. You can define whatever you want to do
26
+ Procmon.process("Mail") do |process|
27
+ process.checks :mem_usage, :above => 100.megabytes, :actions => [notifier, notifier2]
28
+ end
29
+
30
+ # You can specify a code block as well
31
+ Procmon.process("Mail") do |process|
32
+ process.pid = 29124
33
+ process.checks :mem_usage, :above => 100.megabytes do
34
+ puts "I'm in your base"
35
+ end
36
+ end
37
+
38
+ # Using built-in email notifier
39
+ NOTIFICATION_TARGET='ddao@example.com'
40
+ Procmon.process("Mail") do |process|
41
+ process.checks :mem_usage, :above => 100.megabytes, :actions => [Procmon::Notifiers::Email]
42
+ end
43
+
44
+ # Check if a process is alive
45
+ Procmon.process("libvirtd") do |process|
46
+ process.checks :process_health, :status => "down" do
47
+ puts "Oh no! My process is not running"
48
+ end
49
+ end
50
+
51
+ # Would be nice if we can do this as well
52
+ # Procmon.process("Mail") do |process|
53
+ # process.checks :mem_usage, :above => 100.megabytes do |action|
54
+ # action.perform(notifier)
55
+ # action.perform(Procmon::Notifiers::Email, 'someone@example.com')
56
+ # end
57
+ # process.checks :mem_usage, :above => 100.megabytes, :actions => [notifier, notifier2]
58
+ # process.checks :mem_usage, :above => 100.megabytes, :actions => [Procmon::Notifiers::Email]
59
+ #end
52
60
  ```
@@ -0,0 +1,38 @@
1
+ module Procmon
2
+ module ProcessConditions
3
+ class CpuUsage < ProcessCondition
4
+ def initialize(options = {})
5
+ super(options)
6
+ @below = options[:below]
7
+ @above = options[:above]
8
+ if @below && @above && @below < @above
9
+ raise "Invalid range for mem check condition"
10
+ elsif @below.nil? && @above.nil?
11
+ raise "Invalid range for mem check condition"
12
+ end
13
+ end
14
+
15
+ def run(pid)
16
+ System.cpu_usage(pid).to_f
17
+ end
18
+
19
+ def check(value)
20
+ if @below && @above
21
+ value < @below && value > @above
22
+ elsif @below
23
+ value < @below
24
+ elsif @above
25
+ value > @above
26
+ end
27
+ end
28
+
29
+ def description
30
+ ret = "Cpu usage is "
31
+ conditions = {}
32
+ conditions[:below] = @options[:below] if @options[:below]
33
+ conditions[:above] = @options[:above] if @options[:above]
34
+ ret += conditions.inspect
35
+ end
36
+ end
37
+ end
38
+ end
@@ -6,11 +6,8 @@ module Procmon
6
6
  MB_LABEL = "MB"
7
7
  KB_LABEL = "KB"
8
8
 
9
- attr_reader :actions
10
-
11
9
  def initialize(options = {})
12
- @options = options
13
- @actions = options[:actions]
10
+ super(options)
14
11
  @below = options[:below]
15
12
  @above = options[:above]
16
13
  if @below && @above && @below < @above
@@ -1,8 +1,10 @@
1
1
  module Procmon
2
2
  module ProcessConditions
3
3
  class ProcessCondition
4
+ attr_reader :actions
4
5
  def initialize(options = {})
5
6
  @options = options
7
+ @actions = options[:actions]
6
8
  end
7
9
 
8
10
  def run(pid)
@@ -0,0 +1,26 @@
1
+ module Procmon
2
+ module ProcessConditions
3
+ class ProcessHealth < ProcessCondition
4
+ def initialize(options = {})
5
+ super(options)
6
+ @status = options[:status]
7
+ if @status != "up" and @status != "down"
8
+ raise "Don't know what to do for process_health check. You need to specify :status => \"down\" or :status => \"up\""
9
+ end
10
+ end
11
+
12
+ def run(pid)
13
+ return false if pid.nil?
14
+ System.pid_alive?(pid)
15
+ end
16
+
17
+ def check(value)
18
+ !(value ^ (@status == "up"))
19
+ end
20
+
21
+ def description
22
+ "Checking to see if is_up = #{@is_up}"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -15,10 +15,23 @@ module Procmon
15
15
  @store ||= Hash.new
16
16
  end
17
17
 
18
+ def pid_alive?(pid)
19
+ begin
20
+ ::Process.kill(0, pid)
21
+ true
22
+ rescue Errno::ESRCH
23
+ false
24
+ end
25
+ end
26
+
18
27
  def memory_usage(pid)
19
28
  ps_axu[pid] && ps_axu[pid][IDX_MAP[:rss]].to_f
20
29
  end
21
30
 
31
+ def cpu_usage(pid)
32
+ ps_axu[pid] && ps_axu[pid][IDX_MAP[:pcpu]].to_f
33
+ end
34
+
22
35
  def ps_axu
23
36
  # TODO: need a mutex here
24
37
  store[:ps_axu] ||= begin
@@ -1,3 +1,3 @@
1
1
  module Procmon
2
- VERSION = "0.0.3".freeze
2
+ VERSION = "0.0.4".freeze
3
3
  end
@@ -1,6 +1,6 @@
1
1
  require 'procmon'
2
2
 
3
- NOTIFICATION_TARGET='ddao@example.com'
3
+ NOTIFICATION_TARGET='ddao@eharmony.com'
4
4
 
5
5
  notifier = Proc.new do
6
6
  puts "I NEED TO SEND OUT AN EMAIL"
@@ -11,7 +11,20 @@ notifier2 = Proc.new do
11
11
  end
12
12
 
13
13
  Procmon.process("Mail") do |process|
14
- process.pid = 29124
14
+ process.pid = 8264
15
+ process.checks :cpu_usage, :above => 3 do
16
+ puts "OOOO SHOOT"
17
+ end
18
+ end
19
+
20
+ Procmon.process("Mailerious") do |process|
21
+ process.checks :process_health, :status => "up" do
22
+ puts "OH SHOOT PROCESS IS UP"
23
+ end
24
+ end
25
+
26
+ Procmon.process("Mail") do |process|
27
+ # process.pid = 29124
15
28
  process.checks :mem_usage, :above => 100.megabytes do
16
29
  puts "I'm in your base"
17
30
  end
@@ -21,8 +34,12 @@ Procmon.process("Mail") do |process|
21
34
  process.checks :mem_usage, :above => 100.megabytes, :actions => [notifier, notifier2]
22
35
  end
23
36
 
37
+ #Procmon.process("Mail") do |process|
38
+ # process.checks :mem_usage, :above => 100.megabytes, :actions => [Procmon::Notifiers::Email]
39
+ #end
40
+
24
41
  Procmon.process("Mail") do |process|
25
- process.checks :mem_usage, :above => 100.megabytes, :actions => [Procmon::Notifiers::Email]
42
+ process.checks :mem_usage, :above => 100.megabytes, :actions => [notifier, notifier2]
26
43
  end
27
44
 
28
45
  # Would be nice if we can do this
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: procmon
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Darren Dao
@@ -70,8 +70,10 @@ files:
70
70
  - lib/procmon/notifiers/notifier.rb
71
71
  - lib/procmon/process.rb
72
72
  - lib/procmon/process_conditions.rb
73
+ - lib/procmon/process_conditions/cpu_usage.rb
73
74
  - lib/procmon/process_conditions/mem_usage.rb
74
75
  - lib/procmon/process_conditions/process_condition.rb
76
+ - lib/procmon/process_conditions/process_health.rb
75
77
  - lib/procmon/process_notification.rb
76
78
  - lib/procmon/system.rb
77
79
  - lib/procmon/version.rb
@@ -112,3 +114,4 @@ specification_version: 3
112
114
  summary: A process monitor written in Ruby. Concepts and design are based on Bluepill and God, but with emphasis on simplicity and extensibility.
113
115
  test_files: []
114
116
 
117
+ has_rdoc: