Class: Sensu::Handler
Constant Summary
collapse
- @@autorun =
This works just like Plugin::CLI’s autorun.
self
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
#config_files, #load_config, #net_http_req_class, #read_event, #settings
Constructor Details
#initialize(argv = ARGV) ⇒ Handler
Returns a new instance of Handler.
16
17
18
19
|
# File 'lib/sensu-handler.rb', line 16
def initialize(argv = ARGV)
super()
self.argv = parse_options(argv)
end
|
Instance Attribute Details
#argv ⇒ Object
Returns the value of attribute argv.
14
15
16
|
# File 'lib/sensu-handler.rb', line 14
def argv
@argv
end
|
Class Method Details
.disable_autorun ⇒ Object
48
49
50
|
# File 'lib/sensu-handler.rb', line 48
def self.disable_autorun
@@autorun = false
end
|
.method_added(name) ⇒ Object
41
42
43
44
45
|
# File 'lib/sensu-handler.rb', line 41
def method_added(name)
if name == :handle
@@autorun = self
end
end
|
Instance Method Details
#api_request(method, path) {|req| ... } ⇒ Object
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
# File 'lib/sensu-handler.rb', line 96
def api_request(method, path, &blk)
if api_settings.nil?
raise "api.json settings not found."
end
domain = api_settings['host'].start_with?('http') ? api_settings['host'] : 'http://' + api_settings['host']
uri = URI("#{domain}:#{api_settings['port']}#{path}")
req = net_http_req_class(method).new(uri)
if api_settings['user'] && api_settings['password']
req.basic_auth(api_settings['user'], api_settings['password'])
end
yield(req) if block_given?
res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https') do |http|
http.request(req)
end
res
end
|
#api_settings ⇒ Object
82
83
84
85
86
87
88
89
90
91
92
93
94
|
# File 'lib/sensu-handler.rb', line 82
def api_settings
@api_settings ||= if ENV['SENSU_API_URL']
uri = URI(ENV['SENSU_API_URL'])
{
'host' => uri.host,
'port' => uri.port,
'user' => uri.user,
'password' => uri.password
}
else
settings['api']
end
end
|
#bail(msg) ⇒ Object
75
76
77
78
79
80
|
# File 'lib/sensu-handler.rb', line 75
def bail(msg)
client_name = @event['client']['name'] || 'error:no-client-name'
check_name = @event['check']['name'] || 'error:no-check-name'
puts "#{msg}: #{client_name}/#{check_name}"
exit 0
end
|
#event_exists?(client, check) ⇒ Boolean
169
170
171
|
# File 'lib/sensu-handler.rb', line 169
def event_exists?(client, check)
api_request(:GET, '/event/' + client + '/' + check).code == '200'
end
|
#event_summary(trim_at = 100) ⇒ Object
63
64
65
66
67
68
69
70
71
72
73
|
# File 'lib/sensu-handler.rb', line 63
def event_summary(trim_at=100)
summary = @event['check']['notification'] || @event['check']['description']
if summary.nil?
source = @event['check']['source'] || @event['client']['name']
event_context = [source, @event['check']['name']].join('/')
output = @event['check']['output'].chomp
output = output.length > trim_at ? output[0..trim_at] + '...' : output
summary = [event_context, output].join(' : ')
end
summary
end
|
#filter ⇒ Object
Filters exit the proccess if the event should not be handled. Implementation of the default filters is below.
30
31
32
33
34
35
|
# File 'lib/sensu-handler.rb', line 30
def filter
filter_disabled
filter_repeated
filter_silenced
filter_dependencies
end
|
#filter_dependencies ⇒ Object
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
# File 'lib/sensu-handler.rb', line 173
def filter_dependencies
if @event['check'].has_key?('dependencies')
if @event['check']['dependencies'].is_a?(Array)
@event['check']['dependencies'].each do |dependency|
begin
Timeout.timeout(2) do
check, client = dependency.split('/').reverse
if event_exists?(client || @event['client']['name'], check)
bail 'check dependency event exists'
end
end
rescue Errno::ECONNREFUSED
puts 'connection refused attempting to query the sensu api for an event'
rescue Timeout::Error
puts 'timed out while attempting to query the sensu api for an event'
end
end
end
end
end
|
#filter_disabled ⇒ Object
113
114
115
116
117
|
# File 'lib/sensu-handler.rb', line 113
def filter_disabled
if @event['check']['alert'] == false
bail 'alert disabled'
end
end
|
#filter_repeated ⇒ Object
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
# File 'lib/sensu-handler.rb', line 119
def filter_repeated
defaults = {
'occurrences' => 1,
'interval' => 30,
'refresh' => 1800
}
if settings['sensu_plugin'].is_a?(Hash)
defaults.merge!(settings['sensu_plugin'])
end
occurrences = (@event['check']['occurrences'] || defaults['occurrences']).to_i
interval = (@event['check']['interval'] || defaults['interval']).to_i
refresh = (@event['check']['refresh'] || defaults['refresh']).to_i
if @event['occurrences'] < occurrences
bail 'not enough occurrences'
end
if @event['occurrences'] > occurrences && @event['action'] == 'create'
number = refresh.fdiv(interval).to_i
unless number == 0 || (@event['occurrences'] - occurrences) % number == 0
bail 'only handling every ' + number.to_s + ' occurrences'
end
end
end
|
#filter_silenced ⇒ Object
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
# File 'lib/sensu-handler.rb', line 148
def filter_silenced
stashes = [
['client', '/silence/' + @event['client']['name']],
['check', '/silence/' + @event['client']['name'] + '/' + @event['check']['name']],
['check', '/silence/all/' + @event['check']['name']]
]
stashes.each do |(scope, path)|
begin
Timeout.timeout(5) do
if stash_exists?(path)
bail scope + ' alerts silenced'
end
end
rescue Errno::ECONNREFUSED
puts 'connection refused attempting to query the sensu api for a stash'
rescue Timeout::Error
puts 'timed out while attempting to query the sensu api for a stash'
end
end
end
|
#handle ⇒ Object
Implementing classes should override this.
23
24
25
|
# File 'lib/sensu-handler.rb', line 23
def handle
puts 'ignoring event -- no handler defined'
end
|
#stash_exists?(path) ⇒ Boolean
144
145
146
|
# File 'lib/sensu-handler.rb', line 144
def stash_exists?(path)
api_request(:GET, '/stash' + path).code == '200'
end
|