sensu-plugin 0.0.3 → 0.0.5

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/lib/sensu-handler.rb CHANGED
@@ -1,29 +1,22 @@
1
+ require 'net/http'
1
2
  require 'json'
2
- require 'sensu/config'
3
3
 
4
4
  module Sensu
5
5
  class Handler
6
6
 
7
7
  # Implementing classes should override this.
8
8
 
9
- def handle(event)
9
+ def handle
10
10
  puts 'ignoring event -- no handler defined'
11
11
  end
12
12
 
13
- # Overriding filtering logic is optional. Returns truthy if the
14
- # event should be handled and falsy if it should not.
13
+ # Filters exit the proccess if the event should not be handled.
14
+ # Implementation of the default filters is below.
15
15
 
16
- def filter(event)
17
- if event['check']['alert'] == false
18
- puts 'alert disabled -- filtered event ' + short_name(event)
19
- exit 0
20
- end
21
- refresh = (60.fdiv(event['check']['interval']) * 30).to_i
22
- event['occurrences'] == 1 || event['occurrences'] % refresh == 0
23
- end
24
-
25
- def short_name(event)
26
- event['client']['name'] + '/' + event['check']['name']
16
+ def filter
17
+ filter_disabled
18
+ filter_repeated
19
+ filter_silenced
27
20
  end
28
21
 
29
22
  # This works just like Plugin::CLI's autorun.
@@ -50,11 +43,68 @@ module Sensu
50
43
  @settings ||= CONFIGS.map {|f| load_config(f) }.reduce {|a, b| a.deep_merge(b) }
51
44
  end
52
45
 
46
+ def read_event(file)
47
+ begin
48
+ @event = ::JSON.parse(file.read)
49
+ @event['occurrences'] ||= 1
50
+ @event['check'] ||= Hash.new
51
+ @event['client'] ||= Hash.new
52
+ rescue
53
+ puts 'Error reading event'
54
+ exit 0
55
+ end
56
+ end
57
+
53
58
  at_exit do
54
59
  handler = @@autorun.new
55
- event = ::JSON.parse(STDIN.read)
56
- if handler.filter(event)
57
- handler.handle(event)
60
+ handler.read_event(STDIN)
61
+ handler.filter
62
+ handler.handle
63
+ end
64
+
65
+ # Helpers and filters
66
+
67
+ def bail(msg)
68
+ puts msg + ': ' + @event['client']['name'] + '/' + @event['check']['name']
69
+ exit 0
70
+ end
71
+
72
+ def api_request(*path)
73
+ http = Net::HTTP.new(settings['api']['host'], settings['api']['port'])
74
+ http.request(Net::HTTP::Get.new(path.join('/')))
75
+ end
76
+
77
+ def filter_disabled
78
+ if @event['check']['alert'] == false
79
+ bail 'alert disabled'
80
+ end
81
+ end
82
+
83
+ def filter_repeated
84
+ occurrences = @event['check']['occurrences'] || 1
85
+ interval = @event['check']['interval'] || 30
86
+ refresh = @event['check']['refresh'] || 1800
87
+ if @event['occurrences'] < occurrences
88
+ bail 'not enough occurrences'
89
+ end
90
+ if @event['occurrences'] > occurrences
91
+ n = refresh.fdiv(interval).to_i
92
+ bail 'only repeating alert every' + n + 'occurrences' unless @event['occurrences'] % n == 0
93
+ end
94
+ end
95
+
96
+ def filter_silenced
97
+ begin
98
+ timeout(3) do
99
+ if api_request('/stash/silence', @event['client']['name']).code == '200'
100
+ bail 'client alerts silenced'
101
+ end
102
+ if api_request('/stash/silence', @event['client']['name'], @event['check']['name']).code == '200'
103
+ bail 'check alerts silenced'
104
+ end
105
+ end
106
+ rescue Timeout::Error
107
+ puts 'Timed out while attempting to query the Sensu API for stashes'
58
108
  end
59
109
  end
60
110
 
data/lib/sensu-plugin.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Sensu
2
2
  module Plugin
3
- VERSION = "0.0.3"
3
+ VERSION = "0.0.5"
4
4
  EXIT_CODES = {
5
5
  'OK' => 0,
6
6
  'WARNING' => 1,
@@ -3,34 +3,40 @@
3
3
  require 'rubygems'
4
4
  require 'minitest/autorun'
5
5
 
6
- class TestCheck < MiniTest::Unit::TestCase
6
+ class TestCheckExternal < MiniTest::Unit::TestCase
7
7
 
8
8
  def setup
9
- @script = File.join(File.dirname(__FILE__), 'checks/check-options')
9
+ @script = File.join(File.dirname(__FILE__), 'external/check-options')
10
+ end
11
+
12
+ def run_script(*args)
13
+ IO.popen([@script] + args, 'r+') do |child|
14
+ child.read
15
+ end
10
16
  end
11
17
 
12
18
  def test_ok
13
- system @script, '-o'
19
+ run_script '-o'
14
20
  assert $?.exitstatus == 0
15
21
  end
16
22
 
17
23
  def test_warning
18
- system @script, '-w'
24
+ run_script '-w'
19
25
  assert $?.exitstatus == 1
20
26
  end
21
27
 
22
28
  def test_critical
23
- system @script, '-c'
29
+ run_script '-c'
24
30
  assert $?.exitstatus == 2
25
31
  end
26
32
 
27
33
  def test_unknown
28
- system @script, '-u'
34
+ run_script '-u'
29
35
  assert $?.exitstatus == 3
30
36
  end
31
37
 
32
38
  def test_fallthrough
33
- system @script
39
+ run_script
34
40
  assert $?.exitstatus == 1
35
41
  end
36
42
 
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'minitest/autorun'
5
+ require 'json'
6
+
7
+ class TestHandlerExternal < MiniTest::Unit::TestCase
8
+
9
+ def setup
10
+ @script = File.join(File.dirname(__FILE__), 'external/handle-nofilter')
11
+ end
12
+
13
+ def run_script(event)
14
+ output = IO.popen(@script, 'r+') do |child|
15
+ child.puts JSON.generate(event)
16
+ child.close_write
17
+ child.read
18
+ end
19
+ end
20
+
21
+ def test_handled
22
+ event = {
23
+ 'client' => { 'name' => 'test' },
24
+ 'check' => { 'name' => 'test' },
25
+ 'occurrences' => 1,
26
+ }
27
+ output = run_script(event)
28
+ assert $?.exitstatus == 0 && output =~ /Event:.*test/
29
+ end
30
+
31
+ def test_missing_keys
32
+ event = {}
33
+ output = run_script(event)
34
+ assert $?.exitstatus == 0 && output =~ /Event:/
35
+ end
36
+
37
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-plugin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-19 00:00:00.000000000 Z
12
+ date: 2011-12-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
16
- requirement: &70160334903060 !ruby/object:Gem::Requirement
16
+ requirement: &70106722973320 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70160334903060
24
+ version_requirements: *70106722973320
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: mixlib-cli
27
- requirement: &70160334902480 !ruby/object:Gem::Requirement
27
+ requirement: &70106722972800 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: 1.1.0
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70160334902480
35
+ version_requirements: *70106722972800
36
36
  description: Plugins and helper libraries for Sensu, a monitoring framework
37
37
  email:
38
38
  - decklin@red-bean.com
@@ -46,7 +46,8 @@ files:
46
46
  - lib/sensu-plugin/metric/cli.rb
47
47
  - lib/sensu-plugin/util/procs.rb
48
48
  - lib/sensu-plugin.rb
49
- - test/check.rb
49
+ - test/external_check_test.rb
50
+ - test/external_handler_test.rb
50
51
  homepage: https://github.com/sonian/sensu-plugin
51
52
  licenses:
52
53
  - MIT
@@ -73,4 +74,5 @@ signing_key:
73
74
  specification_version: 3
74
75
  summary: Sensu Plugins
75
76
  test_files:
76
- - test/check.rb
77
+ - test/external_check_test.rb
78
+ - test/external_handler_test.rb