monitr 0.0.1
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/ext/monitr/extconf.rb +55 -0
- data/test/test_behavior.rb +21 -0
- data/test/test_campfire.rb +41 -0
- data/test/test_condition.rb +50 -0
- data/test/test_conditions_disk_usage.rb +56 -0
- data/test/test_conditions_http_response_code.rb +109 -0
- data/test/test_conditions_process_running.rb +44 -0
- data/test/test_conditions_tries.rb +67 -0
- data/test/test_contact.rb +109 -0
- data/test/test_dependency_graph.rb +62 -0
- data/test/test_driver.rb +11 -0
- data/test/test_email.rb +45 -0
- data/test/test_event_handler.rb +80 -0
- data/test/test_handlers_kqueue_handler.rb +16 -0
- data/test/test_logger.rb +63 -0
- data/test/test_metric.rb +72 -0
- data/test/test_monitr.rb +598 -0
- data/test/test_process.rb +246 -0
- data/test/test_registry.rb +15 -0
- data/test/test_socket.rb +42 -0
- data/test/test_sugar.rb +42 -0
- data/test/test_system_portable_poller.rb +17 -0
- data/test/test_system_process.rb +30 -0
- data/test/test_task.rb +262 -0
- data/test/test_timeline.rb +37 -0
- data/test/test_trigger.rb +59 -0
- data/test/test_watch.rb +279 -0
- data/test/test_webhook.rb +17 -0
- metadata +90 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'mkmf'
|
|
2
|
+
|
|
3
|
+
fail = false
|
|
4
|
+
|
|
5
|
+
def create_dummy_makefile
|
|
6
|
+
File.open("Makefile", 'w') do |f|
|
|
7
|
+
f.puts "all:"
|
|
8
|
+
f.puts "install:"
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
case RUBY_PLATFORM
|
|
13
|
+
when /bsd/i, /darwin/i
|
|
14
|
+
unless have_header('sys/event.h')
|
|
15
|
+
puts
|
|
16
|
+
puts "Missing 'sys/event.h' header"
|
|
17
|
+
fail = true
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
if fail
|
|
21
|
+
puts
|
|
22
|
+
puts "Events handler could not be compiled (see above error). Your monitr installation will not support event conditions."
|
|
23
|
+
create_dummy_makefile
|
|
24
|
+
else
|
|
25
|
+
create_makefile 'kqueue_handler_ext'
|
|
26
|
+
end
|
|
27
|
+
when /linux/i
|
|
28
|
+
unless have_header('linux/netlink.h')
|
|
29
|
+
puts
|
|
30
|
+
puts "Missing 'linux/netlink.h' header(s)"
|
|
31
|
+
puts "You may need to install a header package for your system"
|
|
32
|
+
fail = true
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
unless have_header('linux/connector.h') && have_header('linux/cn_proc.h')
|
|
36
|
+
puts
|
|
37
|
+
puts "Missing 'linux/connector.h', or 'linux/cn_proc.h' header(s)"
|
|
38
|
+
puts "These are only available in Linux kernel 2.6.15 and later (run `uname -a` to find yours)"
|
|
39
|
+
puts "You may need to install a header package for your system"
|
|
40
|
+
fail = true
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
if fail
|
|
44
|
+
puts
|
|
45
|
+
puts "Events handler could not be compiled (see above error). Your monitr installation will not support event conditions."
|
|
46
|
+
create_dummy_makefile
|
|
47
|
+
else
|
|
48
|
+
create_makefile 'netlink_handler_ext'
|
|
49
|
+
end
|
|
50
|
+
else
|
|
51
|
+
puts
|
|
52
|
+
puts "Unsupported platform '#{RUBY_PLATFORM}'. Supported platforms are BSD, DARWIN, and LINUX."
|
|
53
|
+
puts "Your monitr installation will not support event conditions."
|
|
54
|
+
create_dummy_makefile
|
|
55
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
|
|
3
|
+
class TestBehavior < Test::Unit::TestCase
|
|
4
|
+
def test_generate_should_return_an_object_corresponding_to_the_given_type
|
|
5
|
+
assert_equal Behaviors::FakeBehavior, Behavior.generate(:fake_behavior, nil).class
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def test_generate_should_raise_on_invalid_type
|
|
9
|
+
assert_raise NoSuchBehaviorError do
|
|
10
|
+
Behavior.generate(:foo, nil)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_complain
|
|
15
|
+
Syslog.expects(:err).with('foo')
|
|
16
|
+
# Kernel.expects(:puts).with('foo')
|
|
17
|
+
no_stdout do
|
|
18
|
+
assert !Behavior.allocate.bypass.complain('foo')
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
require 'tinder'
|
|
3
|
+
|
|
4
|
+
class TestCampfire < Test::Unit::TestCase
|
|
5
|
+
def test_exists
|
|
6
|
+
Monitr::Contacts::Campfire
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# should notify
|
|
10
|
+
def test_campfire_delivery_method_for_notify
|
|
11
|
+
assert_nothing_raised do
|
|
12
|
+
|
|
13
|
+
room = mock()
|
|
14
|
+
room.expects(:speak).returns(nil)
|
|
15
|
+
|
|
16
|
+
g = Monitr::Contacts::Campfire.new
|
|
17
|
+
Monitr::Contacts::Campfire.format.expects(:call).with(:a,:e)
|
|
18
|
+
g.expects(:room).returns(room)
|
|
19
|
+
g.notify(:a, :b, :c, :d, :e)
|
|
20
|
+
assert_equal "notified campfire: ", g.info
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# should not establish a new connection because the older is alive
|
|
25
|
+
def test_campfire_room_method
|
|
26
|
+
assert_nothing_raised do
|
|
27
|
+
room = mock()
|
|
28
|
+
g = Monitr::Contacts::Campfire.new
|
|
29
|
+
g.instance_variable_set(:@room,room)
|
|
30
|
+
assert_equal g.send(:room), room
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# should raise because the connections parameters have not been set
|
|
35
|
+
def test_campfire_delivery_method_for_notify_without_campfire_params
|
|
36
|
+
LOG.expects(:log).times(3) # 3 calls: 2 debug (credentials, backtrace) + 1 info (failed message)
|
|
37
|
+
g = Monitr::Contacts::Campfire.new
|
|
38
|
+
g.notify(:a, :b, :c, :d, :e)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
|
|
3
|
+
class BadlyImplementedCondition < PollCondition
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
class TestCondition < Test::Unit::TestCase
|
|
7
|
+
|
|
8
|
+
# generate
|
|
9
|
+
|
|
10
|
+
def test_generate_should_return_an_object_corresponding_to_the_given_type
|
|
11
|
+
assert_equal Conditions::ProcessRunning, Condition.generate(:process_running, nil).class
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def test_generate_should_raise_on_invalid_type
|
|
15
|
+
assert_raise NoSuchConditionError do
|
|
16
|
+
Condition.generate(:foo, nil)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_generate_should_abort_on_event_condition_without_loaded_event_system
|
|
21
|
+
Monitr::EventHandler.stubs(:operational?).returns(false)
|
|
22
|
+
assert_abort do
|
|
23
|
+
Monitr::EventHandler.start
|
|
24
|
+
Condition.generate(:process_exits, nil).class
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_generate_should_return_a_good_error_message_for_invalid_types
|
|
29
|
+
emsg = "No Condition found with the class name Monitr::Conditions::FooBar"
|
|
30
|
+
rmsg = nil
|
|
31
|
+
|
|
32
|
+
begin
|
|
33
|
+
Condition.generate(:foo_bar, nil)
|
|
34
|
+
rescue => e
|
|
35
|
+
rmsg = e.message
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
assert_equal emsg, rmsg
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# test
|
|
42
|
+
|
|
43
|
+
def test_test_should_raise_if_not_defined_in_subclass
|
|
44
|
+
c = BadlyImplementedCondition.new
|
|
45
|
+
|
|
46
|
+
assert_raise AbstractMethodNotOverriddenError do
|
|
47
|
+
c.test
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
|
|
3
|
+
class TestConditionsDiskUsage < Test::Unit::TestCase
|
|
4
|
+
# valid?
|
|
5
|
+
|
|
6
|
+
def test_valid_should_return_false_if_no_above_given
|
|
7
|
+
c = Conditions::DiskUsage.new
|
|
8
|
+
c.mount_point = '/'
|
|
9
|
+
c.watch = stub(:name => 'foo')
|
|
10
|
+
|
|
11
|
+
no_stdout do
|
|
12
|
+
assert_equal false, c.valid?
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_valid_should_return_false_if_no_mount_point_given
|
|
17
|
+
c = Conditions::DiskUsage.new
|
|
18
|
+
c.above = 90
|
|
19
|
+
c.watch = stub(:name => 'foo')
|
|
20
|
+
|
|
21
|
+
no_stdout do
|
|
22
|
+
assert_equal false, c.valid?
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_valid_should_return_true_if_required_options_all_set
|
|
27
|
+
c = Conditions::DiskUsage.new
|
|
28
|
+
c.above = 90
|
|
29
|
+
c.mount_point = '/'
|
|
30
|
+
c.watch = stub(:name => 'foo')
|
|
31
|
+
|
|
32
|
+
assert_equal true, c.valid?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# test
|
|
36
|
+
|
|
37
|
+
def test_test_should_return_true_if_above_limit
|
|
38
|
+
c = Conditions::DiskUsage.new
|
|
39
|
+
c.above = 90
|
|
40
|
+
c.mount_point = '/'
|
|
41
|
+
|
|
42
|
+
c.expects(:`).returns('91')
|
|
43
|
+
|
|
44
|
+
assert_equal true, c.test
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_test_should_return_false_if_below_limit
|
|
48
|
+
c = Conditions::DiskUsage.new
|
|
49
|
+
c.above = 90
|
|
50
|
+
c.mount_point = '/'
|
|
51
|
+
|
|
52
|
+
c.expects(:`).returns('90')
|
|
53
|
+
|
|
54
|
+
assert_equal false, c.test
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
|
|
3
|
+
class TestHttpResponseCode < Test::Unit::TestCase
|
|
4
|
+
def valid_condition
|
|
5
|
+
c = Conditions::HttpResponseCode.new()
|
|
6
|
+
c.watch = stub(:name => 'foo')
|
|
7
|
+
c.host = 'localhost'
|
|
8
|
+
c.port = 8080
|
|
9
|
+
c.path = '/'
|
|
10
|
+
c.timeout = 10
|
|
11
|
+
c.code_is = 200
|
|
12
|
+
c.times = 1
|
|
13
|
+
yield(c) if block_given?
|
|
14
|
+
c.prepare
|
|
15
|
+
c
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# valid?
|
|
19
|
+
|
|
20
|
+
def test_valid_condition_is_valid
|
|
21
|
+
c = valid_condition
|
|
22
|
+
assert c.valid?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_valid_should_return_false_if_both_code_is_and_code_is_not_are_set
|
|
26
|
+
c = valid_condition do |cc|
|
|
27
|
+
cc.code_is_not = 500
|
|
28
|
+
end
|
|
29
|
+
no_stdout { assert !c.valid? }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_valid_should_return_false_if_no_host_set
|
|
33
|
+
c = valid_condition do |cc|
|
|
34
|
+
cc.host = nil
|
|
35
|
+
end
|
|
36
|
+
no_stdout { assert !c.valid? }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# test
|
|
40
|
+
|
|
41
|
+
def test_test_should_return_false_if_code_is_is_set_to_200_but_response_is_500
|
|
42
|
+
c = valid_condition
|
|
43
|
+
Net::HTTP.expects(:start).yields(stub(:read_timeout= => nil, :get => stub(:code => 500)))
|
|
44
|
+
assert_equal false, c.test
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def test_test_should_return_false_if_code_is_not_is_set_to_200_and_response_is_200
|
|
48
|
+
c = valid_condition do |cc|
|
|
49
|
+
cc.code_is = nil
|
|
50
|
+
cc.code_is_not = [200]
|
|
51
|
+
end
|
|
52
|
+
Net::HTTP.expects(:start).yields(stub(:read_timeout= => nil, :get => stub(:code => 200)))
|
|
53
|
+
assert_equal false, c.test
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_test_should_return_true_if_code_is_is_set_to_200_and_response_is_200
|
|
57
|
+
c = valid_condition
|
|
58
|
+
Net::HTTP.expects(:start).yields(stub(:read_timeout= => nil, :get => stub(:code => 200)))
|
|
59
|
+
assert_equal true, c.test
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_test_should_return_false_if_code_is_not_is_set_to_200_but_response_is_500
|
|
63
|
+
c = valid_condition do |cc|
|
|
64
|
+
cc.code_is = nil
|
|
65
|
+
cc.code_is_not = [200]
|
|
66
|
+
end
|
|
67
|
+
Net::HTTP.expects(:start).yields(stub(:read_timeout= => nil, :get => stub(:code => 500)))
|
|
68
|
+
assert_equal true, c.test
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def test_test_should_return_false_if_code_is_is_set_to_200_but_response_times_out
|
|
72
|
+
c = valid_condition
|
|
73
|
+
Net::HTTP.expects(:start).raises(Timeout::Error, '')
|
|
74
|
+
assert_equal false, c.test
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_test_should_return_true_if_code_is_not_is_set_to_200_and_response_times_out
|
|
78
|
+
c = valid_condition do |cc|
|
|
79
|
+
cc.code_is = nil
|
|
80
|
+
cc.code_is_not = [200]
|
|
81
|
+
end
|
|
82
|
+
Net::HTTP.expects(:start).raises(Timeout::Error, '')
|
|
83
|
+
assert_equal true, c.test
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def test_test_should_return_false_if_code_is_is_set_to_200_but_cant_connect
|
|
87
|
+
c = valid_condition
|
|
88
|
+
Net::HTTP.expects(:start).raises(Errno::ECONNREFUSED, '')
|
|
89
|
+
assert_equal false, c.test
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def test_test_should_return_true_if_code_is_not_is_set_to_200_and_cant_connect
|
|
93
|
+
c = valid_condition do |cc|
|
|
94
|
+
cc.code_is = nil
|
|
95
|
+
cc.code_is_not = [200]
|
|
96
|
+
end
|
|
97
|
+
Net::HTTP.expects(:start).raises(Errno::ECONNREFUSED, '')
|
|
98
|
+
assert_equal true, c.test
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_test_should_return_true_if_code_is_is_set_to_200_and_response_is_200_twice_for_times_two_of_two
|
|
102
|
+
c = valid_condition do |cc|
|
|
103
|
+
cc.times = [2, 2]
|
|
104
|
+
end
|
|
105
|
+
Net::HTTP.expects(:start).yields(stub(:read_timeout= => nil, :get => stub(:code => 200))).times(2)
|
|
106
|
+
assert_equal false, c.test
|
|
107
|
+
assert_equal true, c.test
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
|
|
3
|
+
class TestConditionsProcessRunning < Test::Unit::TestCase
|
|
4
|
+
def test_missing_pid_file_returns_opposite
|
|
5
|
+
[true, false].each do |r|
|
|
6
|
+
c = Conditions::ProcessRunning.new
|
|
7
|
+
c.running = r
|
|
8
|
+
|
|
9
|
+
c.stubs(:watch).returns(stub(:pid => 99999999, :name => 'foo'))
|
|
10
|
+
|
|
11
|
+
# no_stdout do
|
|
12
|
+
assert_equal !r, c.test
|
|
13
|
+
# end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_not_running_returns_opposite
|
|
18
|
+
[true, false].each do |r|
|
|
19
|
+
c = Conditions::ProcessRunning.new
|
|
20
|
+
c.running = r
|
|
21
|
+
|
|
22
|
+
File.stubs(:exist?).returns(true)
|
|
23
|
+
c.stubs(:watch).returns(stub(:pid => 123))
|
|
24
|
+
File.stubs(:read).returns('5')
|
|
25
|
+
System::Process.any_instance.stubs(:exists?).returns(false)
|
|
26
|
+
|
|
27
|
+
assert_equal !r, c.test
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_running_returns_same
|
|
32
|
+
[true, false].each do |r|
|
|
33
|
+
c = Conditions::ProcessRunning.new
|
|
34
|
+
c.running = r
|
|
35
|
+
|
|
36
|
+
File.stubs(:exist?).returns(true)
|
|
37
|
+
c.stubs(:watch).returns(stub(:pid => 123))
|
|
38
|
+
File.stubs(:read).returns('5')
|
|
39
|
+
System::Process.any_instance.stubs(:exists?).returns(true)
|
|
40
|
+
|
|
41
|
+
assert_equal r, c.test
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
|
2
|
+
|
|
3
|
+
class TestConditionsTries < Test::Unit::TestCase
|
|
4
|
+
# valid?
|
|
5
|
+
|
|
6
|
+
def test_valid_should_return_false_if_times_not_set
|
|
7
|
+
c = Conditions::Tries.new
|
|
8
|
+
c.watch = stub(:name => 'foo')
|
|
9
|
+
no_stdout { assert !c.valid? }
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TestConditionsTries < Test::Unit::TestCase
|
|
15
|
+
def setup
|
|
16
|
+
@c = Conditions::Tries.new
|
|
17
|
+
@c.times = 3
|
|
18
|
+
@c.prepare
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# prepare
|
|
22
|
+
|
|
23
|
+
def test_prepare_should_create_timeline
|
|
24
|
+
assert 3, @c.instance_variable_get(:@timeline).instance_variable_get(:@max_size)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# test
|
|
28
|
+
|
|
29
|
+
def test_test_should_return_true_if_called_three_times_within_one_second
|
|
30
|
+
assert !@c.test
|
|
31
|
+
assert !@c.test
|
|
32
|
+
assert @c.test
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# reset
|
|
36
|
+
|
|
37
|
+
def test_test_should_return_false_on_fourth_call_if_called_three_times_within_one_second
|
|
38
|
+
3.times { @c.test }
|
|
39
|
+
@c.reset
|
|
40
|
+
assert !@c.test
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class TestConditionsTriesWithin < Test::Unit::TestCase
|
|
46
|
+
def setup
|
|
47
|
+
@c = Conditions::Tries.new
|
|
48
|
+
@c.times = 3
|
|
49
|
+
@c.within = 1.seconds
|
|
50
|
+
@c.prepare
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# test
|
|
54
|
+
|
|
55
|
+
def test_test_should_return_true_if_called_three_times_within_one_second
|
|
56
|
+
assert !@c.test
|
|
57
|
+
assert !@c.test
|
|
58
|
+
assert @c.test
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_test_should_return_false_if_called_three_times_within_two_seconds
|
|
62
|
+
assert !@c.test
|
|
63
|
+
assert !@c.test
|
|
64
|
+
assert sleep(1.1)
|
|
65
|
+
assert !@c.test
|
|
66
|
+
end
|
|
67
|
+
end
|