sensu 0.12.6 → 0.13.0.alpha
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.
- 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
|