sensu 0.12.6 → 0.13.0.alpha
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +41 -0
- data/lib/sensu/api.rb +145 -205
- data/lib/sensu/cli.rb +2 -1
- data/lib/sensu/client.rb +51 -119
- data/lib/sensu/constants.rb +1 -7
- data/lib/sensu/daemon.rb +221 -0
- data/lib/sensu/server.rb +105 -202
- data/lib/sensu/socket.rb +4 -4
- data/lib/sensu/utilities.rb +6 -29
- data/sensu.gemspec +10 -6
- metadata +223 -228
- data/lib/sensu/base.rb +0 -75
- data/lib/sensu/extensions.rb +0 -162
- data/lib/sensu/extensions/handlers/debug.rb +0 -17
- data/lib/sensu/extensions/mutators/only_check_output.rb +0 -17
- data/lib/sensu/io.rb +0 -98
- data/lib/sensu/logstream.rb +0 -93
- data/lib/sensu/process.rb +0 -48
- data/lib/sensu/rabbitmq.rb +0 -106
- data/lib/sensu/settings.rb +0 -483
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0e1b021d3461d4daef8432adea63250ae659bb10
|
4
|
+
data.tar.gz: b00ffdcb7989eba387b66777b5b6cd04abf1264d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d324be84c52252df92c88c1e1691a4917aba28c29c520a482ea27b4c46c7c3fcfe30a569cde6cd6464ecaecf631fee7f86b9cc99186ec5d6725cb27a8c9af7f0
|
7
|
+
data.tar.gz: 1c0d83d4bcf511709f0abed6624e293ad5037a32e3f221225c46247ebef1284fc5a332aaa3013b951b075b4233c85a9bdb3e94f9e1f60338a3a1f5da4ec07094
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,44 @@
|
|
1
|
+
## 0.13.0 - TBD
|
2
|
+
|
3
|
+
### Non-backwards compatible changes
|
4
|
+
|
5
|
+
API GET /events now provides all event data, the same data passed to event
|
6
|
+
handlers.
|
7
|
+
|
8
|
+
Standalone check results are no longer merged with check definitions
|
9
|
+
residing on the server(s).
|
10
|
+
|
11
|
+
Removed the generic extension type.
|
12
|
+
|
13
|
+
Extension stop() no longer takes a callback, and is called when the
|
14
|
+
eventmachine reactor is stopped.
|
15
|
+
|
16
|
+
### Features
|
17
|
+
|
18
|
+
Abstracted the transport layer, opening Sensu up to alternative messaging
|
19
|
+
services.
|
20
|
+
|
21
|
+
Event bridge extension type, allowing all events to be relayed to other
|
22
|
+
services.
|
23
|
+
|
24
|
+
Client keepalives now contain the Sensu version.
|
25
|
+
|
26
|
+
### Other
|
27
|
+
|
28
|
+
Clients now only load instances of check extensions, and servers load
|
29
|
+
everything but check extensions.
|
30
|
+
|
31
|
+
Fixed standalone check scheduling, no longer mutating definitions.
|
32
|
+
|
33
|
+
Fixed command token substitution, allowing for the use of colons.
|
34
|
+
|
35
|
+
Log events are flushed when the eventmachine reactor stops.
|
36
|
+
|
37
|
+
Dropped the Oj JSON parser, heap allocation issues and memory leaks.
|
38
|
+
|
39
|
+
Client RabbitMQ queues are no longer server named (bugs), they are now
|
40
|
+
composed of the client name, Sensu version, and the timestamp at creation.
|
41
|
+
|
1
42
|
## 0.12.6 - 2014-02-19
|
2
43
|
|
3
44
|
### Non-backwards compatible changes
|
data/lib/sensu/api.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require
|
2
|
-
require File.join(File.dirname(__FILE__), 'redis')
|
1
|
+
require 'sensu/daemon'
|
3
2
|
|
4
3
|
gem 'thin', '1.5.0'
|
5
4
|
gem 'sinatra', '1.3.5'
|
@@ -13,97 +12,45 @@ module Sensu
|
|
13
12
|
register Sinatra::Async
|
14
13
|
|
15
14
|
class << self
|
15
|
+
include Daemon
|
16
|
+
|
16
17
|
def run(options={})
|
18
|
+
bootstrap(options)
|
17
19
|
EM::run do
|
18
|
-
bootstrap(options)
|
19
20
|
start
|
20
|
-
|
21
|
+
setup_signal_traps
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
|
-
def bootstrap(options
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
if $settings[:api][:user] && $settings[:api][:password]
|
25
|
+
def bootstrap(options)
|
26
|
+
setup_logger(options)
|
27
|
+
set :logger, @logger
|
28
|
+
load_settings(options)
|
29
|
+
if @settings[:api][:user] && @settings[:api][:password]
|
30
30
|
use Rack::Auth::Basic do |user, password|
|
31
|
-
user ==
|
31
|
+
user == @settings[:api][:user] && password == @settings[:api][:password]
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
$logger.debug('connecting to redis', {
|
38
|
-
:settings => $settings[:redis]
|
39
|
-
})
|
40
|
-
$redis = Redis.connect($settings[:redis])
|
41
|
-
$redis.on_error do |error|
|
42
|
-
$logger.fatal('redis connection error', {
|
43
|
-
:error => error.to_s
|
44
|
-
})
|
45
|
-
stop
|
46
|
-
end
|
47
|
-
$redis.before_reconnect do
|
48
|
-
$logger.warn('reconnecting to redis')
|
49
|
-
end
|
50
|
-
$redis.after_reconnect do
|
51
|
-
$logger.info('reconnected to redis')
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def setup_rabbitmq
|
56
|
-
$logger.debug('connecting to rabbitmq', {
|
57
|
-
:settings => $settings[:rabbitmq]
|
58
|
-
})
|
59
|
-
$rabbitmq = RabbitMQ.connect($settings[:rabbitmq])
|
60
|
-
$rabbitmq.on_error do |error|
|
61
|
-
$logger.fatal('rabbitmq connection error', {
|
62
|
-
:error => error.to_s
|
63
|
-
})
|
64
|
-
stop
|
65
|
-
end
|
66
|
-
$rabbitmq.before_reconnect do
|
67
|
-
$logger.warn('reconnecting to rabbitmq')
|
68
|
-
end
|
69
|
-
$rabbitmq.after_reconnect do
|
70
|
-
$logger.info('reconnected to rabbitmq')
|
71
|
-
end
|
72
|
-
$amq = $rabbitmq.channel
|
34
|
+
set :checks, @settings[:checks]
|
35
|
+
set :all_checks, @settings.checks
|
36
|
+
setup_process(options)
|
73
37
|
end
|
74
38
|
|
75
39
|
def start
|
76
40
|
setup_redis
|
77
|
-
|
41
|
+
set :redis, @redis
|
42
|
+
setup_transport
|
43
|
+
set :transport, @transport
|
78
44
|
Thin::Logging.silent = true
|
79
|
-
bind =
|
80
|
-
Thin::Server.start(bind,
|
45
|
+
bind = @settings[:api][:bind] || '0.0.0.0'
|
46
|
+
Thin::Server.start(bind, @settings[:api][:port], self)
|
81
47
|
end
|
82
48
|
|
83
49
|
def stop
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
EM::stop_event_loop
|
89
|
-
end
|
90
|
-
|
91
|
-
def trap_signals
|
92
|
-
$signals = Array.new
|
93
|
-
STOP_SIGNALS.each do |signal|
|
94
|
-
Signal.trap(signal) do
|
95
|
-
$signals << signal
|
96
|
-
end
|
97
|
-
end
|
98
|
-
EM::PeriodicTimer.new(1) do
|
99
|
-
signal = $signals.shift
|
100
|
-
if STOP_SIGNALS.include?(signal)
|
101
|
-
$logger.warn('received signal', {
|
102
|
-
:signal => signal
|
103
|
-
})
|
104
|
-
stop
|
105
|
-
end
|
106
|
-
end
|
50
|
+
@logger.warn('stopping')
|
51
|
+
@redis.close
|
52
|
+
@transport.close
|
53
|
+
super
|
107
54
|
end
|
108
55
|
|
109
56
|
def test(options={})
|
@@ -127,7 +74,7 @@ module Sensu
|
|
127
74
|
|
128
75
|
helpers do
|
129
76
|
def request_log_line
|
130
|
-
|
77
|
+
settings.logger.info([env['REQUEST_METHOD'], env['REQUEST_PATH']].join(' '), {
|
131
78
|
:remote_address => env['REMOTE_ADDR'],
|
132
79
|
:user_agent => env['HTTP_USER_AGENT'],
|
133
80
|
:request_method => env['REQUEST_METHOD'],
|
@@ -160,7 +107,7 @@ module Sensu
|
|
160
107
|
end
|
161
108
|
|
162
109
|
def issued!
|
163
|
-
accepted!(
|
110
|
+
accepted!(MultiJson.dump(:issued => Time.now.to_i))
|
164
111
|
end
|
165
112
|
|
166
113
|
def no_content!
|
@@ -170,7 +117,7 @@ module Sensu
|
|
170
117
|
|
171
118
|
def read_data(rules={}, &block)
|
172
119
|
begin
|
173
|
-
data =
|
120
|
+
data = MultiJson.load(env['rack.input'].read)
|
174
121
|
valid = rules.all? do |key, rule|
|
175
122
|
data[key].is_a?(rule[:type]) || (rule[:nil_ok] && data[key].nil?)
|
176
123
|
end
|
@@ -179,7 +126,7 @@ module Sensu
|
|
179
126
|
else
|
180
127
|
bad_request!
|
181
128
|
end
|
182
|
-
rescue
|
129
|
+
rescue MultiJson::ParseError
|
183
130
|
bad_request!
|
184
131
|
end
|
185
132
|
end
|
@@ -192,7 +139,7 @@ module Sensu
|
|
192
139
|
limit = integer_parameter(params[:limit])
|
193
140
|
offset = integer_parameter(params[:offset]) || 0
|
194
141
|
unless limit.nil?
|
195
|
-
headers['X-Pagination'] =
|
142
|
+
headers['X-Pagination'] = MultiJson.dump(
|
196
143
|
:limit => limit,
|
197
144
|
:offset => offset,
|
198
145
|
:total => items.size
|
@@ -204,7 +151,7 @@ module Sensu
|
|
204
151
|
end
|
205
152
|
end
|
206
153
|
|
207
|
-
def
|
154
|
+
def transport_info(&block)
|
208
155
|
info = {
|
209
156
|
:keepalives => {
|
210
157
|
:messages => nil,
|
@@ -214,15 +161,13 @@ module Sensu
|
|
214
161
|
:messages => nil,
|
215
162
|
:consumers => nil
|
216
163
|
},
|
217
|
-
:connected =>
|
164
|
+
:connected => settings.transport.connected?
|
218
165
|
}
|
219
|
-
if
|
220
|
-
|
221
|
-
info[:keepalives]
|
222
|
-
|
223
|
-
|
224
|
-
info[:results][:messages] = messages
|
225
|
-
info[:results][:consumers] = consumers
|
166
|
+
if settings.transport.connected?
|
167
|
+
settings.transport.stats('keepalives') do |stats|
|
168
|
+
info[:keepalives] = stats
|
169
|
+
settings.transport.stats('results') do |stats|
|
170
|
+
info[:results] = stats
|
226
171
|
block.call(info)
|
227
172
|
end
|
228
173
|
end
|
@@ -231,35 +176,30 @@ module Sensu
|
|
231
176
|
end
|
232
177
|
end
|
233
178
|
|
234
|
-
def
|
235
|
-
|
236
|
-
|
237
|
-
:
|
179
|
+
def resolve_event(event_json)
|
180
|
+
event = MultiJson.load(event_json)
|
181
|
+
check = event[:check].merge(
|
182
|
+
:output => 'Resolving on request of the API',
|
183
|
+
:status => 0,
|
184
|
+
:issued => Time.now.to_i,
|
185
|
+
:executed => Time.now.to_i,
|
186
|
+
:force_resolve => true
|
238
187
|
)
|
239
|
-
|
240
|
-
|
241
|
-
def resolve_event(event)
|
188
|
+
check.delete(:history)
|
242
189
|
payload = {
|
243
|
-
:client => event[:client],
|
244
|
-
:check =>
|
245
|
-
:name => event[:check],
|
246
|
-
:output => 'Resolving on request of the API',
|
247
|
-
:status => 0,
|
248
|
-
:issued => Time.now.to_i,
|
249
|
-
:handlers => event[:handlers],
|
250
|
-
:force_resolve => true
|
251
|
-
}
|
190
|
+
:client => event[:client][:name],
|
191
|
+
:check => check
|
252
192
|
}
|
253
|
-
|
193
|
+
settings.logger.info('publishing check result', {
|
254
194
|
:payload => payload
|
255
195
|
})
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
196
|
+
settings.transport.publish(:direct, 'results', MultiJson.dump(payload)) do |info|
|
197
|
+
if info[:error]
|
198
|
+
settings.logger.error('failed to publish check result', {
|
199
|
+
:payload => payload,
|
200
|
+
:error => info[:error].to_s
|
201
|
+
})
|
202
|
+
end
|
263
203
|
end
|
264
204
|
end
|
265
205
|
end
|
@@ -270,26 +210,26 @@ module Sensu
|
|
270
210
|
end
|
271
211
|
|
272
212
|
aget '/info/?' do
|
273
|
-
|
213
|
+
transport_info do |info|
|
274
214
|
response = {
|
275
215
|
:sensu => {
|
276
216
|
:version => VERSION
|
277
217
|
},
|
278
|
-
:
|
218
|
+
:transport => info,
|
279
219
|
:redis => {
|
280
|
-
:connected =>
|
220
|
+
:connected => settings.redis.connected?
|
281
221
|
}
|
282
222
|
}
|
283
|
-
body
|
223
|
+
body MultiJson.dump(response)
|
284
224
|
end
|
285
225
|
end
|
286
226
|
|
287
227
|
aget '/health/?' do
|
288
|
-
if
|
228
|
+
if settings.redis.connected? && settings.transport.connected?
|
289
229
|
healthy = Array.new
|
290
230
|
min_consumers = integer_parameter(params[:consumers])
|
291
231
|
max_messages = integer_parameter(params[:messages])
|
292
|
-
|
232
|
+
transport_info do |info|
|
293
233
|
if min_consumers
|
294
234
|
healthy << (info[:keepalives][:consumers] >= min_consumers)
|
295
235
|
healthy << (info[:results][:consumers] >= min_consumers)
|
@@ -307,25 +247,25 @@ module Sensu
|
|
307
247
|
|
308
248
|
aget '/clients/?' do
|
309
249
|
response = Array.new
|
310
|
-
|
250
|
+
settings.redis.smembers('clients') do |clients|
|
311
251
|
clients = pagination(clients)
|
312
252
|
unless clients.empty?
|
313
253
|
clients.each_with_index do |client_name, index|
|
314
|
-
|
315
|
-
response <<
|
254
|
+
settings.redis.get('client:' + client_name) do |client_json|
|
255
|
+
response << MultiJson.load(client_json)
|
316
256
|
if index == clients.size - 1
|
317
|
-
body
|
257
|
+
body MultiJson.dump(response)
|
318
258
|
end
|
319
259
|
end
|
320
260
|
end
|
321
261
|
else
|
322
|
-
body
|
262
|
+
body MultiJson.dump(response)
|
323
263
|
end
|
324
264
|
end
|
325
265
|
end
|
326
266
|
|
327
267
|
aget %r{/clients?/([\w\.-]+)/?$} do |client_name|
|
328
|
-
|
268
|
+
settings.redis.get('client:' + client_name) do |client_json|
|
329
269
|
unless client_json.nil?
|
330
270
|
body client_json
|
331
271
|
else
|
@@ -336,16 +276,16 @@ module Sensu
|
|
336
276
|
|
337
277
|
aget %r{/clients/([\w\.-]+)/history/?$} do |client_name|
|
338
278
|
response = Array.new
|
339
|
-
|
279
|
+
settings.redis.smembers('history:' + client_name) do |checks|
|
340
280
|
unless checks.empty?
|
341
281
|
checks.each_with_index do |check_name, index|
|
342
282
|
history_key = 'history:' + client_name + ':' + check_name
|
343
|
-
|
283
|
+
settings.redis.lrange(history_key, -21, -1) do |history|
|
344
284
|
history.map! do |status|
|
345
285
|
status.to_i
|
346
286
|
end
|
347
287
|
execution_key = 'execution:' + client_name + ':' + check_name
|
348
|
-
|
288
|
+
settings.redis.get(execution_key) do |last_execution|
|
349
289
|
unless history.empty? || last_execution.nil?
|
350
290
|
item = {
|
351
291
|
:check => check_name,
|
@@ -356,38 +296,38 @@ module Sensu
|
|
356
296
|
response << item
|
357
297
|
end
|
358
298
|
if index == checks.size - 1
|
359
|
-
body
|
299
|
+
body MultiJson.dump(response)
|
360
300
|
end
|
361
301
|
end
|
362
302
|
end
|
363
303
|
end
|
364
304
|
else
|
365
|
-
body
|
305
|
+
body MultiJson.dump(response)
|
366
306
|
end
|
367
307
|
end
|
368
308
|
end
|
369
309
|
|
370
310
|
adelete %r{/clients?/([\w\.-]+)/?$} do |client_name|
|
371
|
-
|
311
|
+
settings.redis.get('client:' + client_name) do |client_json|
|
372
312
|
unless client_json.nil?
|
373
|
-
|
313
|
+
settings.redis.hgetall('events:' + client_name) do |events|
|
374
314
|
events.each do |check_name, event_json|
|
375
|
-
resolve_event(
|
315
|
+
resolve_event(event_json)
|
376
316
|
end
|
377
317
|
EM::Timer.new(5) do
|
378
|
-
client =
|
379
|
-
|
318
|
+
client = MultiJson.load(client_json)
|
319
|
+
settings.logger.info('deleting client', {
|
380
320
|
:client => client
|
381
321
|
})
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
322
|
+
settings.redis.srem('clients', client_name) do
|
323
|
+
settings.redis.del('client:' + client_name)
|
324
|
+
settings.redis.del('events:' + client_name)
|
325
|
+
settings.redis.smembers('history:' + client_name) do |checks|
|
386
326
|
checks.each do |check_name|
|
387
|
-
|
388
|
-
|
327
|
+
settings.redis.del('history:' + client_name + ':' + check_name)
|
328
|
+
settings.redis.del('execution:' + client_name + ':' + check_name)
|
389
329
|
end
|
390
|
-
|
330
|
+
settings.redis.del('history:' + client_name)
|
391
331
|
end
|
392
332
|
end
|
393
333
|
end
|
@@ -400,13 +340,13 @@ module Sensu
|
|
400
340
|
end
|
401
341
|
|
402
342
|
aget '/checks/?' do
|
403
|
-
body
|
343
|
+
body MultiJson.dump(settings.all_checks)
|
404
344
|
end
|
405
345
|
|
406
346
|
aget %r{/checks?/([\w\.-]+)/?$} do |check_name|
|
407
|
-
if
|
408
|
-
response =
|
409
|
-
body
|
347
|
+
if settings.checks[check_name]
|
348
|
+
response = settings.checks[check_name].merge(:name => check_name)
|
349
|
+
body MultiJson.dump(response)
|
410
350
|
else
|
411
351
|
not_found!
|
412
352
|
end
|
@@ -418,27 +358,27 @@ module Sensu
|
|
418
358
|
:subscribers => {:type => Array, :nil_ok => true}
|
419
359
|
}
|
420
360
|
read_data(rules) do |data|
|
421
|
-
if
|
422
|
-
check =
|
361
|
+
if settings.checks[data[:check]]
|
362
|
+
check = settings.checks[data[:check]]
|
423
363
|
subscribers = data[:subscribers] || check[:subscribers] || Array.new
|
424
364
|
payload = {
|
425
365
|
:name => data[:check],
|
426
366
|
:command => check[:command],
|
427
367
|
:issued => Time.now.to_i
|
428
368
|
}
|
429
|
-
|
369
|
+
settings.logger.info('publishing check request', {
|
430
370
|
:payload => payload,
|
431
371
|
:subscribers => subscribers
|
432
372
|
})
|
433
373
|
subscribers.uniq.each do |exchange_name|
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
374
|
+
settings.transport.publish(:fanout, exchange_name, MultiJson.dump(payload)) do |info|
|
375
|
+
if info[:error]
|
376
|
+
settings.logger.error('failed to publish check request', {
|
377
|
+
:exchange_name => exchange_name,
|
378
|
+
:payload => payload,
|
379
|
+
:error => info[:error].to_s
|
380
|
+
})
|
381
|
+
end
|
442
382
|
end
|
443
383
|
end
|
444
384
|
issued!
|
@@ -450,39 +390,39 @@ module Sensu
|
|
450
390
|
|
451
391
|
aget '/events/?' do
|
452
392
|
response = Array.new
|
453
|
-
|
393
|
+
settings.redis.smembers('clients') do |clients|
|
454
394
|
unless clients.empty?
|
455
395
|
clients.each_with_index do |client_name, index|
|
456
|
-
|
396
|
+
settings.redis.hgetall('events:' + client_name) do |events|
|
457
397
|
events.each do |check_name, event_json|
|
458
|
-
response <<
|
398
|
+
response << MultiJson.load(event_json)
|
459
399
|
end
|
460
400
|
if index == clients.size - 1
|
461
|
-
body
|
401
|
+
body MultiJson.dump(response)
|
462
402
|
end
|
463
403
|
end
|
464
404
|
end
|
465
405
|
else
|
466
|
-
body
|
406
|
+
body MultiJson.dump(response)
|
467
407
|
end
|
468
408
|
end
|
469
409
|
end
|
470
410
|
|
471
411
|
aget %r{/events/([\w\.-]+)/?$} do |client_name|
|
472
412
|
response = Array.new
|
473
|
-
|
413
|
+
settings.redis.hgetall('events:' + client_name) do |events|
|
474
414
|
events.each do |check_name, event_json|
|
475
|
-
response <<
|
415
|
+
response << MultiJson.load(event_json)
|
476
416
|
end
|
477
|
-
body
|
417
|
+
body MultiJson.dump(response)
|
478
418
|
end
|
479
419
|
end
|
480
420
|
|
481
421
|
aget %r{/events?/([\w\.-]+)/([\w\.-]+)/?$} do |client_name, check_name|
|
482
|
-
|
422
|
+
settings.redis.hgetall('events:' + client_name) do |events|
|
483
423
|
event_json = events[check_name]
|
484
424
|
unless event_json.nil?
|
485
|
-
body
|
425
|
+
body event_json
|
486
426
|
else
|
487
427
|
not_found!
|
488
428
|
end
|
@@ -490,9 +430,9 @@ module Sensu
|
|
490
430
|
end
|
491
431
|
|
492
432
|
adelete %r{/events?/([\w\.-]+)/([\w\.-]+)/?$} do |client_name, check_name|
|
493
|
-
|
433
|
+
settings.redis.hgetall('events:' + client_name) do |events|
|
494
434
|
if events.include?(check_name)
|
495
|
-
resolve_event(
|
435
|
+
resolve_event(events[check_name])
|
496
436
|
issued!
|
497
437
|
else
|
498
438
|
not_found!
|
@@ -506,9 +446,9 @@ module Sensu
|
|
506
446
|
:check => {:type => String, :nil_ok => false}
|
507
447
|
}
|
508
448
|
read_data(rules) do |data|
|
509
|
-
|
449
|
+
settings.redis.hgetall('events:' + data[:client]) do |events|
|
510
450
|
if events.include?(data[:check])
|
511
|
-
resolve_event(
|
451
|
+
resolve_event(events[data[:check]])
|
512
452
|
issued!
|
513
453
|
else
|
514
454
|
not_found!
|
@@ -519,10 +459,10 @@ module Sensu
|
|
519
459
|
|
520
460
|
aget '/aggregates/?' do
|
521
461
|
response = Array.new
|
522
|
-
|
462
|
+
settings.redis.smembers('aggregates') do |checks|
|
523
463
|
unless checks.empty?
|
524
464
|
checks.each_with_index do |check_name, index|
|
525
|
-
|
465
|
+
settings.redis.smembers('aggregates:' + check_name) do |aggregates|
|
526
466
|
aggregates.reverse!
|
527
467
|
aggregates.map! do |issued|
|
528
468
|
issued.to_i
|
@@ -533,18 +473,18 @@ module Sensu
|
|
533
473
|
}
|
534
474
|
response << item
|
535
475
|
if index == checks.size - 1
|
536
|
-
body
|
476
|
+
body MultiJson.dump(response)
|
537
477
|
end
|
538
478
|
end
|
539
479
|
end
|
540
480
|
else
|
541
|
-
body
|
481
|
+
body MultiJson.dump(response)
|
542
482
|
end
|
543
483
|
end
|
544
484
|
end
|
545
485
|
|
546
486
|
aget %r{/aggregates/([\w\.-]+)/?$} do |check_name|
|
547
|
-
|
487
|
+
settings.redis.smembers('aggregates:' + check_name) do |aggregates|
|
548
488
|
unless aggregates.empty?
|
549
489
|
aggregates.reverse!
|
550
490
|
aggregates.map! do |issued|
|
@@ -557,7 +497,7 @@ module Sensu
|
|
557
497
|
issued > timestamp
|
558
498
|
end
|
559
499
|
end
|
560
|
-
body
|
500
|
+
body MultiJson.dump(pagination(aggregates))
|
561
501
|
else
|
562
502
|
not_found!
|
563
503
|
end
|
@@ -565,15 +505,15 @@ module Sensu
|
|
565
505
|
end
|
566
506
|
|
567
507
|
adelete %r{/aggregates/([\w\.-]+)/?$} do |check_name|
|
568
|
-
|
508
|
+
settings.redis.smembers('aggregates:' + check_name) do |aggregates|
|
569
509
|
unless aggregates.empty?
|
570
510
|
aggregates.each do |check_issued|
|
571
511
|
result_set = check_name + ':' + check_issued
|
572
|
-
|
573
|
-
|
512
|
+
settings.redis.del('aggregation:' + result_set)
|
513
|
+
settings.redis.del('aggregate:' + result_set)
|
574
514
|
end
|
575
|
-
|
576
|
-
|
515
|
+
settings.redis.del('aggregates:' + check_name) do
|
516
|
+
settings.redis.srem('aggregates', check_name) do
|
577
517
|
no_content!
|
578
518
|
end
|
579
519
|
end
|
@@ -585,15 +525,15 @@ module Sensu
|
|
585
525
|
|
586
526
|
aget %r{/aggregates?/([\w\.-]+)/([\w\.-]+)/?$} do |check_name, check_issued|
|
587
527
|
result_set = check_name + ':' + check_issued
|
588
|
-
|
528
|
+
settings.redis.hgetall('aggregate:' + result_set) do |aggregate|
|
589
529
|
unless aggregate.empty?
|
590
530
|
response = aggregate.inject(Hash.new) do |totals, (status, count)|
|
591
531
|
totals[status] = Integer(count)
|
592
532
|
totals
|
593
533
|
end
|
594
|
-
|
534
|
+
settings.redis.hgetall('aggregation:' + result_set) do |results|
|
595
535
|
parsed_results = results.inject(Array.new) do |parsed, (client_name, check_json)|
|
596
|
-
check =
|
536
|
+
check = MultiJson.load(check_json)
|
597
537
|
parsed << check.merge(:client => client_name)
|
598
538
|
end
|
599
539
|
if params[:summarize]
|
@@ -609,7 +549,7 @@ module Sensu
|
|
609
549
|
if params[:results]
|
610
550
|
response[:results] = parsed_results
|
611
551
|
end
|
612
|
-
body
|
552
|
+
body MultiJson.dump(response)
|
613
553
|
end
|
614
554
|
else
|
615
555
|
not_found!
|
@@ -619,16 +559,16 @@ module Sensu
|
|
619
559
|
|
620
560
|
apost %r{/stash(?:es)?/(.*)/?} do |path|
|
621
561
|
read_data do |data|
|
622
|
-
|
623
|
-
|
624
|
-
created!(
|
562
|
+
settings.redis.set('stash:' + path, MultiJson.dump(data)) do
|
563
|
+
settings.redis.sadd('stashes', path) do
|
564
|
+
created!(MultiJson.dump(:path => path))
|
625
565
|
end
|
626
566
|
end
|
627
567
|
end
|
628
568
|
end
|
629
569
|
|
630
570
|
aget %r{/stash(?:es)?/(.*)/?} do |path|
|
631
|
-
|
571
|
+
settings.redis.get('stash:' + path) do |stash_json|
|
632
572
|
unless stash_json.nil?
|
633
573
|
body stash_json
|
634
574
|
else
|
@@ -638,10 +578,10 @@ module Sensu
|
|
638
578
|
end
|
639
579
|
|
640
580
|
adelete %r{/stash(?:es)?/(.*)/?} do |path|
|
641
|
-
|
581
|
+
settings.redis.exists('stash:' + path) do |stash_exists|
|
642
582
|
if stash_exists
|
643
|
-
|
644
|
-
|
583
|
+
settings.redis.srem('stashes', path) do
|
584
|
+
settings.redis.del('stash:' + path) do
|
645
585
|
no_content!
|
646
586
|
end
|
647
587
|
end
|
@@ -653,29 +593,29 @@ module Sensu
|
|
653
593
|
|
654
594
|
aget '/stashes/?' do
|
655
595
|
response = Array.new
|
656
|
-
|
596
|
+
settings.redis.smembers('stashes') do |stashes|
|
657
597
|
unless stashes.empty?
|
658
598
|
stashes.each_with_index do |path, index|
|
659
|
-
|
660
|
-
|
599
|
+
settings.redis.get('stash:' + path) do |stash_json|
|
600
|
+
settings.redis.ttl('stash:' + path) do |ttl|
|
661
601
|
unless stash_json.nil?
|
662
602
|
item = {
|
663
603
|
:path => path,
|
664
|
-
:content =>
|
604
|
+
:content => MultiJson.load(stash_json),
|
665
605
|
:expire => ttl
|
666
606
|
}
|
667
607
|
response << item
|
668
608
|
else
|
669
|
-
|
609
|
+
settings.redis.srem('stashes', path)
|
670
610
|
end
|
671
611
|
if index == stashes.size - 1
|
672
|
-
body
|
612
|
+
body MultiJson.dump(pagination(response))
|
673
613
|
end
|
674
614
|
end
|
675
615
|
end
|
676
616
|
end
|
677
617
|
else
|
678
|
-
body
|
618
|
+
body MultiJson.dump(response)
|
679
619
|
end
|
680
620
|
end
|
681
621
|
end
|
@@ -688,11 +628,11 @@ module Sensu
|
|
688
628
|
}
|
689
629
|
read_data(rules) do |data|
|
690
630
|
stash_key = 'stash:' + data[:path]
|
691
|
-
|
692
|
-
|
693
|
-
response =
|
631
|
+
settings.redis.set(stash_key, MultiJson.dump(data[:content])) do
|
632
|
+
settings.redis.sadd('stashes', data[:path]) do
|
633
|
+
response = MultiJson.dump(:path => data[:path])
|
694
634
|
if data[:expire]
|
695
|
-
|
635
|
+
settings.redis.expire(stash_key, data[:expire]) do
|
696
636
|
created!(response)
|
697
637
|
end
|
698
638
|
else
|