sensu 0.9.6 → 0.9.7.beta
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/CHANGELOG.md +12 -0
- data/README.md +12 -0
- data/lib/sensu/constants.rb +1 -1
- data/lib/sensu/server.rb +67 -33
- data/lib/sensu/settings.rb +21 -17
- data/sensu.gemspec +1 -1
- metadata +14 -10
- data/README.org +0 -12
data/CHANGELOG.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
## 0.9.7 - TBD
|
2
|
+
|
3
|
+
### Features
|
4
|
+
|
5
|
+
Event data mutators, manipulate event data and its format prior to
|
6
|
+
sending to a handler.
|
7
|
+
|
8
|
+
### Non-backwards compatible changes
|
9
|
+
|
10
|
+
AMQP handlers can no longer use `"send_only_check_output": true`, but
|
11
|
+
instead have access to the built-in mutators `"mutator": "only_check_output"` and
|
12
|
+
`"mutator": "only_check_output_split"`.
|
data/README.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# Sensu
|
2
|
+
A monitoring framework that aims to be simple, malleable, and scalable.
|
3
|
+
|
4
|
+

|
5
|
+
|
6
|
+

|
7
|
+
|
8
|
+
## Documentation
|
9
|
+
Please refer to the [Sensu Wiki](https://github.com/sensu/sensu/wiki).
|
10
|
+
|
11
|
+
## License
|
12
|
+
Sensu is released under the [MIT license](https://raw.github.com/sensu/sensu/master/MIT-LICENSE.txt).
|
data/lib/sensu/constants.rb
CHANGED
data/lib/sensu/server.rb
CHANGED
@@ -154,6 +154,55 @@ module Sensu
|
|
154
154
|
end
|
155
155
|
end
|
156
156
|
|
157
|
+
def mutate_event_data(handler, event)
|
158
|
+
if handler.has_key?(:mutator)
|
159
|
+
mutated = nil
|
160
|
+
case handler[:mutator]
|
161
|
+
when /^only_check_output/
|
162
|
+
if handler[:type] == 'amqp' && handler[:mutator] =~ /split$/
|
163
|
+
mutated = Array.new
|
164
|
+
event[:check][:output].split(/\n+/).each do |line|
|
165
|
+
mutated.push(line)
|
166
|
+
end
|
167
|
+
else
|
168
|
+
mutated = event[:check][:output]
|
169
|
+
end
|
170
|
+
else
|
171
|
+
if @settings.mutator_exists?(handler[:mutator])
|
172
|
+
mutator = @settings[:mutators][handler[:mutator]]
|
173
|
+
begin
|
174
|
+
IO.popen(mutator[:command], 'r+') do |io|
|
175
|
+
io.write(event.to_json)
|
176
|
+
io.close_write
|
177
|
+
mutated = io.read
|
178
|
+
end
|
179
|
+
unless $?.exitstatus == 0
|
180
|
+
@logger.warn('mutator had a non-zero exit status', {
|
181
|
+
:event => event,
|
182
|
+
:mutator => mutator
|
183
|
+
})
|
184
|
+
end
|
185
|
+
rescue => error
|
186
|
+
@logger.error('mutator error', {
|
187
|
+
:event => event,
|
188
|
+
:mutator => mutator,
|
189
|
+
:error => error.to_s
|
190
|
+
})
|
191
|
+
end
|
192
|
+
else
|
193
|
+
@logger.error('unknown mutator', {
|
194
|
+
:mutator => {
|
195
|
+
:name => handler[:mutator]
|
196
|
+
}
|
197
|
+
})
|
198
|
+
end
|
199
|
+
end
|
200
|
+
mutated
|
201
|
+
else
|
202
|
+
event.to_json
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
157
206
|
def handle_event(event)
|
158
207
|
unless check_subdued?(event[:check], :handler)
|
159
208
|
handlers = check_handlers(event[:check])
|
@@ -167,27 +216,18 @@ module Sensu
|
|
167
216
|
when 'pipe'
|
168
217
|
execute = Proc.new do
|
169
218
|
begin
|
170
|
-
|
171
|
-
|
172
|
-
io
|
173
|
-
|
174
|
-
|
219
|
+
mutated_event_data = mutate_event_data(handler, event)
|
220
|
+
unless mutated_event_data.nil? || mutated_event_data.empty?
|
221
|
+
IO.popen(handler[:command] + ' 2>&1', 'r+') do |io|
|
222
|
+
io.write(mutated_event_data)
|
223
|
+
io.close_write
|
224
|
+
io.read.split(/\n+/).each do |line|
|
225
|
+
@logger.info(line)
|
226
|
+
end
|
175
227
|
end
|
176
228
|
end
|
177
|
-
rescue Errno::ENOENT => error
|
178
|
-
@logger.error('handler does not exist', {
|
179
|
-
:event => event,
|
180
|
-
:handler => handler,
|
181
|
-
:error => error.to_s
|
182
|
-
})
|
183
|
-
rescue Errno::EPIPE => error
|
184
|
-
@logger.error('broken pipe', {
|
185
|
-
:event => event,
|
186
|
-
:handler => handler,
|
187
|
-
:error => error.to_s
|
188
|
-
})
|
189
229
|
rescue => error
|
190
|
-
@logger.error('
|
230
|
+
@logger.error('handler error', {
|
191
231
|
:event => event,
|
192
232
|
:handler => handler,
|
193
233
|
:error => error.to_s
|
@@ -208,24 +248,18 @@ module Sensu
|
|
208
248
|
:event => event,
|
209
249
|
:exchange => handler[:exchange]
|
210
250
|
})
|
211
|
-
payloads =
|
212
|
-
|
213
|
-
if handler[:split_check_output]
|
214
|
-
event[:check][:output].split(/\n+/).each do |line|
|
215
|
-
payloads.push(line)
|
216
|
-
end
|
217
|
-
else
|
218
|
-
payloads.push(event[:check][:output])
|
219
|
-
end
|
220
|
-
else
|
221
|
-
payloads.push(event.to_json)
|
251
|
+
payloads = Proc.new do
|
252
|
+
Array(mutate_event_data(handler, event))
|
222
253
|
end
|
223
|
-
|
224
|
-
|
225
|
-
|
254
|
+
publish = Proc.new do |payloads|
|
255
|
+
payloads.each do |payload|
|
256
|
+
unless payload.empty?
|
257
|
+
@amq.method(exchange_type).call(exchange_name, exchange_options).publish(payload)
|
258
|
+
end
|
226
259
|
end
|
260
|
+
@handlers_in_progress -= 1
|
227
261
|
end
|
228
|
-
|
262
|
+
EM::defer(payloads, publish)
|
229
263
|
when 'set'
|
230
264
|
@logger.error('handler sets cannot be nested', {
|
231
265
|
:handler => handler
|
data/lib/sensu/settings.rb
CHANGED
@@ -5,7 +5,9 @@ module Sensu
|
|
5
5
|
def initialize
|
6
6
|
@logger = Cabin::Channel.get
|
7
7
|
@settings = Hash.new
|
8
|
-
|
8
|
+
[:checks, :handlers, :mutators].each do |key|
|
9
|
+
@settings[key] = Hash.new
|
10
|
+
end
|
9
11
|
@indifferent_access = false
|
10
12
|
@loaded_env = false
|
11
13
|
@loaded_files = Array.new
|
@@ -87,26 +89,18 @@ module Sensu
|
|
87
89
|
ENV['SENSU_CONFIG_FILES'] = @loaded_files.join(':')
|
88
90
|
end
|
89
91
|
|
90
|
-
|
91
|
-
|
92
|
-
|
92
|
+
[:checks, :handlers, :mutators].each do |key|
|
93
|
+
define_method(key) do
|
94
|
+
@settings[key].map do |name, details|
|
95
|
+
details.merge(:name => name.to_s)
|
96
|
+
end
|
93
97
|
end
|
94
|
-
end
|
95
98
|
|
96
|
-
|
97
|
-
|
98
|
-
handler_details.merge(:name => handler_name.to_s)
|
99
|
+
define_method((key.to_s.chop + '_exists?').to_sym) do |name|
|
100
|
+
@settings[key].has_key?(name.to_sym)
|
99
101
|
end
|
100
102
|
end
|
101
103
|
|
102
|
-
def check_exists?(check_name)
|
103
|
-
@settings[:checks].has_key?(check_name.to_sym)
|
104
|
-
end
|
105
|
-
|
106
|
-
def handler_exists?(handler_name)
|
107
|
-
@settings[:handlers].has_key?(handler_name.to_sym)
|
108
|
-
end
|
109
|
-
|
110
104
|
def validate
|
111
105
|
@logger.debug('validating settings')
|
112
106
|
validate_checks
|
@@ -322,7 +316,7 @@ module Sensu
|
|
322
316
|
|
323
317
|
def validate_server
|
324
318
|
unless @settings[:handlers].is_a?(Hash)
|
325
|
-
invalid('
|
319
|
+
invalid('handlers must be a hash')
|
326
320
|
end
|
327
321
|
unless @settings[:handlers].include?(:default)
|
328
322
|
invalid('missing default handler')
|
@@ -370,6 +364,16 @@ module Sensu
|
|
370
364
|
})
|
371
365
|
end
|
372
366
|
end
|
367
|
+
unless @settings[:mutators].is_a?(Hash)
|
368
|
+
invalid('mutators must be a hash')
|
369
|
+
end
|
370
|
+
mutators.each do |mutator|
|
371
|
+
unless mutator[:command].is_a?(String)
|
372
|
+
invalid('mutator is missing command', {
|
373
|
+
:mutator => mutator
|
374
|
+
})
|
375
|
+
end
|
376
|
+
end
|
373
377
|
end
|
374
378
|
end
|
375
379
|
end
|
data/sensu.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.add_development_dependency('em-spec')
|
25
25
|
s.add_development_dependency('em-http-request')
|
26
26
|
|
27
|
-
s.files = Dir.glob('{bin,lib}/**/*') + %w[sensu.gemspec README.
|
27
|
+
s.files = Dir.glob('{bin,lib}/**/*') + %w[sensu.gemspec README.md CHANGELOG.md MIT-LICENSE.txt]
|
28
28
|
s.executables = Dir.glob('bin/**/*').map { |file| File.basename(file) }
|
29
29
|
s.require_paths = ['lib']
|
30
30
|
end
|
metadata
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 31098133
|
5
|
+
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
|
9
|
+
- 7
|
10
|
+
- beta
|
11
|
+
version: 0.9.7.beta
|
11
12
|
platform: ruby
|
12
13
|
authors:
|
13
14
|
- Sean Porter
|
@@ -16,7 +17,7 @@ autorequire:
|
|
16
17
|
bindir: bin
|
17
18
|
cert_chain: []
|
18
19
|
|
19
|
-
date: 2012-07-
|
20
|
+
date: 2012-07-18 00:00:00 -07:00
|
20
21
|
default_executable:
|
21
22
|
dependencies:
|
22
23
|
- !ruby/object:Gem::Dependency
|
@@ -200,7 +201,8 @@ files:
|
|
200
201
|
- lib/sensu/socket.rb
|
201
202
|
- lib/sensu.rb
|
202
203
|
- sensu.gemspec
|
203
|
-
- README.
|
204
|
+
- README.md
|
205
|
+
- CHANGELOG.md
|
204
206
|
- MIT-LICENSE.txt
|
205
207
|
has_rdoc: true
|
206
208
|
homepage: https://github.com/sensu/sensu
|
@@ -223,12 +225,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
223
225
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
224
226
|
none: false
|
225
227
|
requirements:
|
226
|
-
- - "
|
228
|
+
- - ">"
|
227
229
|
- !ruby/object:Gem::Version
|
228
|
-
hash:
|
230
|
+
hash: 25
|
229
231
|
segments:
|
230
|
-
-
|
231
|
-
|
232
|
+
- 1
|
233
|
+
- 3
|
234
|
+
- 1
|
235
|
+
version: 1.3.1
|
232
236
|
requirements: []
|
233
237
|
|
234
238
|
rubyforge_project:
|
data/README.org
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
* Sensu
|
2
|
-
A monitoring framework that aims to be simple, malleable, and scalable.
|
3
|
-
|
4
|
-
[[https://github.com/sensu/sensu/raw/master/sensu-logo.png]]
|
5
|
-
|
6
|
-
[[https://secure.travis-ci.org/sensu/sensu.png]]
|
7
|
-
|
8
|
-
[[https://gemnasium.com/portertech/sensu.png]]
|
9
|
-
** Documentation
|
10
|
-
Please refer to the [[https://github.com/sensu/sensu/wiki][Sensu Wiki]].
|
11
|
-
** License
|
12
|
-
Sensu is released under the [[https://github.com/sensu/sensu/blob/master/MIT-LICENSE.txt][MIT license]].
|