Class: Sensu::Handler

Inherits:
Object
  • Object
show all
Includes:
Plugin::Utils
Defined in:
lib/sensu-handler.rb

Constant Summary collapse

@@autorun =

This works just like Plugin::CLI’s autorun.

self

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Plugin::Utils

#config_files, #load_config, #net_http_req_class, #read_event, #settings

Class Method Details

.method_added(name) ⇒ Object



30
31
32
33
34
# File 'lib/sensu-handler.rb', line 30

def method_added(name)
  if name == :handle
    @@autorun = self
  end
end

Instance Method Details

#api_request(method, path) {|req| ... } ⇒ Object

Yields:

  • (req)


51
52
53
54
55
56
57
58
59
# File 'lib/sensu-handler.rb', line 51

def api_request(method, path, &blk)
  http = Net::HTTP.new(settings['api']['host'], settings['api']['port'])
  req = net_http_req_class(method).new(path)
  if settings['api']['user'] && settings['api']['password']
    req.basic_auth(settings['api']['user'], settings['api']['password'])
  end
  yield(req) if block_given?
  http.request(req)
end

#bail(msg) ⇒ Object

Helpers and filters.



46
47
48
49
# File 'lib/sensu-handler.rb', line 46

def bail(msg)
  puts msg + ': ' + @event['client']['name'] + '/' + @event['check']['name']
  exit 0
end

#event_exists?(client, check) ⇒ Boolean

Returns:

  • (Boolean)


104
105
106
# File 'lib/sensu-handler.rb', line 104

def event_exists?(client, check)
  api_request(:GET, '/event/' + client + '/' + check).code == '200'
end

#filterObject

Filters exit the proccess if the event should not be handled. Implementation of the default filters is below.



19
20
21
22
23
24
# File 'lib/sensu-handler.rb', line 19

def filter
  filter_disabled
  filter_repeated
  filter_silenced
  filter_dependencies
end

#filter_dependenciesObject



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/sensu-handler.rb', line 108

def filter_dependencies
  if @event['check'].has_key?('dependencies')
    if @event['check']['dependencies'].is_a?(Array)
      @event['check']['dependencies'].each do |check|
        begin
          timeout(2) do
            if event_exists?(@event['client']['name'], check)
              bail 'check dependency event exists'
            end
          end
        rescue Timeout::Error
          puts 'timed out while attempting to query the sensu api for an event'
        end
      end
    end
  end
end

#filter_disabledObject



61
62
63
64
65
# File 'lib/sensu-handler.rb', line 61

def filter_disabled
  if @event['check']['alert'] == false
    bail 'alert disabled'
  end
end

#filter_repeatedObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/sensu-handler.rb', line 67

def filter_repeated
  occurrences = @event['check']['occurrences'] || 1
  interval    = @event['check']['interval']    || 30
  refresh     = @event['check']['refresh']     || 1800
  if @event['occurrences'] < occurrences
    bail 'not enough occurrences'
  end
  if @event['occurrences'] > occurrences && @event['action'] == 'create'
    number = refresh.fdiv(interval).to_i
    unless @event['occurrences'] % number == 0
      bail 'only handling every ' + number.to_s + ' occurrences'
    end
  end
end

#filter_silencedObject



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/sensu-handler.rb', line 86

def filter_silenced
  stashes = {
    'client' => '/silence/' + @event['client']['name'],
    'check'  => '/silence/' + @event['client']['name'] + '/' + @event['check']['name']
  }
  stashes.each do |scope, path|
    begin
      timeout(2) do
        if stash_exists?(path)
          bail scope + ' alerts silenced'
        end
      end
    rescue Timeout::Error
      puts 'timed out while attempting to query the sensu api for a stash'
    end
  end
end

#handleObject

Implementing classes should override this.



12
13
14
# File 'lib/sensu-handler.rb', line 12

def handle
  puts 'ignoring event -- no handler defined'
end

#stash_exists?(path) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
# File 'lib/sensu-handler.rb', line 82

def stash_exists?(path)
  api_request(:GET, '/stash' + path).code == '200'
end