sensu 0.9.7 → 0.9.8.beta
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/sensu/api.rb +61 -0
- data/lib/sensu/constants.rb +5 -1
- data/lib/sensu/server.rb +185 -139
- data/lib/sensu/settings.rb +15 -1
- metadata +25 -25
data/lib/sensu/api.rb
CHANGED
@@ -399,6 +399,67 @@ module Sensu
|
|
399
399
|
end
|
400
400
|
end
|
401
401
|
|
402
|
+
aget '/aggregates' do
|
403
|
+
response = Array.new
|
404
|
+
$redis.smembers('aggregates').callback do |checks|
|
405
|
+
unless checks.empty?
|
406
|
+
checks.each_with_index do |check_name, index|
|
407
|
+
$redis.smembers('aggregates:' + check_name).callback do |aggregates|
|
408
|
+
collection = {
|
409
|
+
:check => check_name,
|
410
|
+
:issued => aggregates.sort.reverse.take(10)
|
411
|
+
}
|
412
|
+
response.push(collection)
|
413
|
+
if index == checks.size - 1
|
414
|
+
body response.to_json
|
415
|
+
end
|
416
|
+
end
|
417
|
+
end
|
418
|
+
else
|
419
|
+
body response.to_json
|
420
|
+
end
|
421
|
+
end
|
422
|
+
end
|
423
|
+
|
424
|
+
aget %r{/aggregates/([\w\.-]+)$} do |check_name|
|
425
|
+
$redis.smembers('aggregates:' + check_name).callback do |aggregates|
|
426
|
+
body aggregates.sort.reverse.take(10).to_json
|
427
|
+
end
|
428
|
+
end
|
429
|
+
|
430
|
+
aget %r{/aggregates?/([\w\.-]+)/([\w\.-]+)$} do |check_name, check_issued|
|
431
|
+
result_set = check_name + ':' + check_issued
|
432
|
+
$redis.hgetall('aggregate:' + result_set).callback do |aggregate|
|
433
|
+
unless aggregate.empty?
|
434
|
+
response = aggregate.inject(Hash.new) do |formatted, (status, count)|
|
435
|
+
formatted[status] = Integer(count)
|
436
|
+
formatted
|
437
|
+
end
|
438
|
+
if params[:summarize]
|
439
|
+
options = params[:summarize].split(',')
|
440
|
+
$redis.hgetall('aggregation:' + result_set).callback do |results|
|
441
|
+
formatted_results = results.inject(Hash.new) do |formatted, (client_name, check_json)|
|
442
|
+
formatted[client_name] = JSON.parse(check_json, :symbolize_names => true)
|
443
|
+
formatted
|
444
|
+
end
|
445
|
+
if options.include?('output')
|
446
|
+
outputs = Hash.new(0)
|
447
|
+
formatted_results.each do |client_name, check|
|
448
|
+
outputs[check[:output]] += 1
|
449
|
+
end
|
450
|
+
response[:outputs] = outputs
|
451
|
+
end
|
452
|
+
body response.to_json
|
453
|
+
end
|
454
|
+
else
|
455
|
+
body response.to_json
|
456
|
+
end
|
457
|
+
else
|
458
|
+
not_found!
|
459
|
+
end
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
402
463
|
apost %r{/stash(?:es)?/(.*)} do |path|
|
403
464
|
begin
|
404
465
|
post_body = JSON.parse(request.body.read)
|
data/lib/sensu/constants.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Sensu
|
2
2
|
unless defined?(Sensu::VERSION)
|
3
|
-
VERSION = '0.9.
|
3
|
+
VERSION = '0.9.8.beta'
|
4
4
|
end
|
5
5
|
|
6
6
|
unless defined?(Sensu::DEFAULT_OPTIONS)
|
@@ -9,4 +9,8 @@ module Sensu
|
|
9
9
|
:config_dir => '/etc/sensu/conf.d'
|
10
10
|
}
|
11
11
|
end
|
12
|
+
|
13
|
+
unless defined?(Sensu::SEVERITIES)
|
14
|
+
SEVERITIES = %w[ok warning critical unknown]
|
15
|
+
end
|
12
16
|
end
|
data/lib/sensu/server.rb
CHANGED
@@ -116,19 +116,15 @@ module Sensu
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
end
|
119
|
-
|
120
|
-
subdue_at == (check[:subdue][:at] || 'handler').to_sym
|
121
|
-
else
|
122
|
-
false
|
123
|
-
end
|
119
|
+
subdue && subdue_at == (check[:subdue][:at] || 'handler').to_sym
|
124
120
|
end
|
125
121
|
|
126
|
-
def
|
122
|
+
def event_handlers(event)
|
127
123
|
handler_list = case
|
128
|
-
when check.has_key?(:
|
129
|
-
[check[:
|
130
|
-
when check.has_key?(:
|
131
|
-
check[:
|
124
|
+
when event[:check].has_key?(:handlers)
|
125
|
+
event[:check][:handlers]
|
126
|
+
when event[:check].has_key?(:handler)
|
127
|
+
[event[:check][:handler]]
|
132
128
|
else
|
133
129
|
['default']
|
134
130
|
end
|
@@ -141,21 +137,37 @@ module Sensu
|
|
141
137
|
end
|
142
138
|
handler_list.flatten!
|
143
139
|
handler_list.uniq!
|
144
|
-
handler_list.
|
145
|
-
|
140
|
+
handlers = handler_list.map do |handler_name|
|
141
|
+
if @settings.handler_exists?(handler_name)
|
142
|
+
handler = @settings[:handlers][handler_name].merge(:name => handler_name)
|
143
|
+
if handler.has_key?(:severities)
|
144
|
+
event_severity = Sensu::SEVERITIES[event[:check][:status]] || 'unknown'
|
145
|
+
unless handler[:severities].include?(event_severity)
|
146
|
+
@logger.debug('handler does not handle event severity', {
|
147
|
+
:event => event,
|
148
|
+
:handler => handler
|
149
|
+
})
|
150
|
+
next
|
151
|
+
end
|
152
|
+
end
|
153
|
+
if check_subdued?(event[:check], :handler)
|
154
|
+
@logger.info('check is subdued at handler', {
|
155
|
+
:event => event,
|
156
|
+
:handler => handler
|
157
|
+
})
|
158
|
+
next
|
159
|
+
end
|
160
|
+
handler
|
161
|
+
else
|
146
162
|
@logger.warn('unknown handler', {
|
147
163
|
:handler => {
|
148
164
|
:name => handler_name
|
149
165
|
}
|
150
166
|
})
|
151
|
-
|
152
|
-
else
|
153
|
-
false
|
167
|
+
next
|
154
168
|
end
|
155
169
|
end
|
156
|
-
|
157
|
-
@settings[:handlers][handler_name].merge(:name => handler_name)
|
158
|
-
end
|
170
|
+
handlers.compact
|
159
171
|
end
|
160
172
|
|
161
173
|
def mutate_event_data(handler, event)
|
@@ -180,12 +192,6 @@ module Sensu
|
|
180
192
|
io.close_write
|
181
193
|
mutated = io.read
|
182
194
|
end
|
183
|
-
if $?.exitstatus != 0
|
184
|
-
@logger.warn('mutator had a non-zero exit status', {
|
185
|
-
:event => event,
|
186
|
-
:mutator => mutator
|
187
|
-
})
|
188
|
-
end
|
189
195
|
rescue => error
|
190
196
|
@logger.error('mutator error', {
|
191
197
|
:event => event,
|
@@ -193,6 +199,12 @@ module Sensu
|
|
193
199
|
:error => error.to_s
|
194
200
|
})
|
195
201
|
end
|
202
|
+
if $?.exitstatus != 0
|
203
|
+
@logger.warn('mutator had a non-zero exit status', {
|
204
|
+
:event => event,
|
205
|
+
:mutator => mutator
|
206
|
+
})
|
207
|
+
end
|
196
208
|
else
|
197
209
|
@logger.warn('unknown mutator', {
|
198
210
|
:mutator => {
|
@@ -208,93 +220,116 @@ module Sensu
|
|
208
220
|
end
|
209
221
|
|
210
222
|
def handle_event(event)
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
@logger.info(line)
|
231
|
-
end
|
223
|
+
handlers = event_handlers(event)
|
224
|
+
handlers.each do |handler|
|
225
|
+
log_level = event[:check][:type] == 'metric' ? :debug : :info
|
226
|
+
@logger.send(log_level, 'handling event', {
|
227
|
+
:event => event,
|
228
|
+
:handler => handler
|
229
|
+
})
|
230
|
+
@handlers_in_progress_count += 1
|
231
|
+
case handler[:type]
|
232
|
+
when 'pipe'
|
233
|
+
execute = Proc.new do
|
234
|
+
begin
|
235
|
+
event_data = mutate_event_data(handler, event)
|
236
|
+
unless event_data.nil? || event_data.empty?
|
237
|
+
IO.popen(handler[:command] + ' 2>&1', 'r+') do |io|
|
238
|
+
io.write(event_data)
|
239
|
+
io.close_write
|
240
|
+
io.read.split(/\n+/).each do |line|
|
241
|
+
@logger.info(line)
|
232
242
|
end
|
233
243
|
end
|
234
|
-
rescue => error
|
235
|
-
@logger.error('handler error', {
|
236
|
-
:event => event,
|
237
|
-
:handler => handler,
|
238
|
-
:error => error.to_s
|
239
|
-
})
|
240
244
|
end
|
245
|
+
rescue => error
|
246
|
+
@logger.error('handler error', {
|
247
|
+
:event => event,
|
248
|
+
:handler => handler,
|
249
|
+
:error => error.to_s
|
250
|
+
})
|
241
251
|
end
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
252
|
+
end
|
253
|
+
complete = Proc.new do
|
254
|
+
@handlers_in_progress_count -= 1
|
255
|
+
end
|
256
|
+
EM::defer(execute, complete)
|
257
|
+
when 'tcp', 'udp'
|
258
|
+
event_data = Proc.new do
|
259
|
+
mutate_event_data(handler, event)
|
260
|
+
end
|
261
|
+
write = Proc.new do |event_data|
|
262
|
+
begin
|
263
|
+
case handler[:type]
|
264
|
+
when 'tcp'
|
265
|
+
EM::connect(handler[:socket][:host], handler[:socket][:port], nil) do |socket|
|
266
|
+
socket.send_data(event_data)
|
267
|
+
socket.close_connection_after_writing
|
268
|
+
end
|
269
|
+
when 'udp'
|
270
|
+
EM::open_datagram_socket('127.0.0.1', 0, nil) do |socket|
|
271
|
+
socket.send_datagram(event_data, handler[:socket][:host], handler[:socket][:port])
|
272
|
+
socket.close_connection_after_writing
|
263
273
|
end
|
264
|
-
rescue => error
|
265
|
-
@logger.error('handler error', {
|
266
|
-
:event => event,
|
267
|
-
:handler => handler,
|
268
|
-
:error => error.to_s
|
269
|
-
})
|
270
274
|
end
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
exchange_options = handler[:exchange].reject do |key, value|
|
278
|
-
[:name, :type].include?(key)
|
279
|
-
end
|
280
|
-
payloads = Proc.new do
|
281
|
-
Array(mutate_event_data(handler, event))
|
275
|
+
rescue => error
|
276
|
+
@logger.error('handler error', {
|
277
|
+
:event => event,
|
278
|
+
:handler => handler,
|
279
|
+
:error => error.to_s
|
280
|
+
})
|
282
281
|
end
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
282
|
+
@handlers_in_progress_count -= 1
|
283
|
+
end
|
284
|
+
EM::defer(event_data, write)
|
285
|
+
when 'amqp'
|
286
|
+
exchange_name = handler[:exchange][:name]
|
287
|
+
exchange_type = handler[:exchange].has_key?(:type) ? handler[:exchange][:type].to_sym : :direct
|
288
|
+
exchange_options = handler[:exchange].reject do |key, value|
|
289
|
+
[:name, :type].include?(key)
|
290
|
+
end
|
291
|
+
payloads = Proc.new do
|
292
|
+
Array(mutate_event_data(handler, event))
|
293
|
+
end
|
294
|
+
publish = Proc.new do |payloads|
|
295
|
+
payloads.each do |payload|
|
296
|
+
unless payload.empty?
|
297
|
+
@amq.method(exchange_type).call(exchange_name, exchange_options).publish(payload)
|
288
298
|
end
|
289
|
-
@handlers_in_progress_count -= 1
|
290
299
|
end
|
291
|
-
EM::defer(payloads, publish)
|
292
|
-
when 'set'
|
293
|
-
@logger.error('handler sets cannot be nested', {
|
294
|
-
:handler => handler
|
295
|
-
})
|
296
300
|
@handlers_in_progress_count -= 1
|
297
301
|
end
|
302
|
+
EM::defer(payloads, publish)
|
303
|
+
when 'set'
|
304
|
+
@logger.error('handler sets cannot be nested', {
|
305
|
+
:handler => handler
|
306
|
+
})
|
307
|
+
@handlers_in_progress_count -= 1
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
def aggregate_result(result)
|
313
|
+
@logger.debug('adding result to aggregate', {
|
314
|
+
:result => result
|
315
|
+
})
|
316
|
+
check = result[:check]
|
317
|
+
result_set = check[:name] + ':' + check[:issued].to_s
|
318
|
+
@redis.hset('aggregation:' + result_set, result[:client], {
|
319
|
+
:output => check[:output],
|
320
|
+
:status => check[:status]
|
321
|
+
}.to_json).callback do
|
322
|
+
statuses = Sensu::SEVERITIES
|
323
|
+
statuses.each do |status|
|
324
|
+
@redis.hsetnx('aggregate:' + result_set, status, 0)
|
325
|
+
end
|
326
|
+
status = (statuses[check[:status]] || 'unknown')
|
327
|
+
@redis.hincrby('aggregate:' + result_set, status, 1).callback do
|
328
|
+
@redis.hincrby('aggregate:' + result_set, 'total', 1).callback do
|
329
|
+
@redis.sadd('aggregates:' + check[:name], check[:issued]).callback do
|
330
|
+
@redis.sadd('aggregates', check[:name])
|
331
|
+
end
|
332
|
+
end
|
298
333
|
end
|
299
334
|
end
|
300
335
|
end
|
@@ -312,22 +347,20 @@ module Sensu
|
|
312
347
|
else
|
313
348
|
result[:check]
|
314
349
|
end
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
:occurrences => 1
|
319
|
-
}
|
350
|
+
if check[:aggregate]
|
351
|
+
aggregate_result(result)
|
352
|
+
end
|
320
353
|
@redis.sadd('history:' + client[:name], check[:name])
|
321
354
|
history_key = 'history:' + client[:name] + ':' + check[:name]
|
322
355
|
@redis.rpush(history_key, check[:status]).callback do
|
323
356
|
@redis.lrange(history_key, -21, -1).callback do |history|
|
324
|
-
|
357
|
+
check[:history] = history
|
325
358
|
total_state_change = 0
|
326
359
|
unless history.count < 21
|
327
360
|
state_changes = 0
|
328
361
|
change_weight = 0.8
|
362
|
+
previous_status = history.first
|
329
363
|
history.each do |status|
|
330
|
-
previous_status ||= status
|
331
364
|
unless status == previous_status
|
332
365
|
state_changes += change_weight
|
333
366
|
end
|
@@ -335,7 +368,7 @@ module Sensu
|
|
335
368
|
previous_status = status
|
336
369
|
end
|
337
370
|
total_state_change = (state_changes.fdiv(20) * 100).to_i
|
338
|
-
@redis.
|
371
|
+
@redis.ltrim(history_key, -21, -1)
|
339
372
|
end
|
340
373
|
@redis.hget('events:' + client[:name], check[:name]).callback do |event_json|
|
341
374
|
previous_occurrence = event_json ? JSON.parse(event_json, :symbolize_names => true) : false
|
@@ -351,7 +384,12 @@ module Sensu
|
|
351
384
|
was_flapping
|
352
385
|
end
|
353
386
|
end
|
354
|
-
|
387
|
+
event = {
|
388
|
+
:client => client,
|
389
|
+
:check => check,
|
390
|
+
:occurrences => 1
|
391
|
+
}
|
392
|
+
if check[:status] != 0 || is_flapping
|
355
393
|
if previous_occurrence && check[:status] == previous_occurrence[:status]
|
356
394
|
event[:occurrences] = previous_occurrence[:occurrences] += 1
|
357
395
|
end
|
@@ -362,38 +400,17 @@ module Sensu
|
|
362
400
|
:flapping => is_flapping,
|
363
401
|
:occurrences => event[:occurrences]
|
364
402
|
}.to_json).callback do
|
365
|
-
unless check[:handle] == false
|
366
|
-
event[:
|
367
|
-
event[:action] = 'create'
|
403
|
+
unless check[:handle] == false || is_flapping
|
404
|
+
event[:action] = :create
|
368
405
|
handle_event(event)
|
369
|
-
else
|
370
|
-
@logger.debug('handling disabled', {
|
371
|
-
:event => event
|
372
|
-
})
|
373
406
|
end
|
374
407
|
end
|
375
408
|
elsif previous_occurrence
|
376
|
-
unless
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
event[:action] = 'resolve'
|
382
|
-
handle_event(event)
|
383
|
-
else
|
384
|
-
@logger.debug('handling disabled', {
|
385
|
-
:event => event
|
386
|
-
})
|
387
|
-
end
|
388
|
-
end
|
389
|
-
end
|
390
|
-
else
|
391
|
-
@logger.debug('check is flapping', {
|
392
|
-
:event => event
|
393
|
-
})
|
394
|
-
@redis.hset('events:' + client[:name], check[:name], previous_occurrence.merge(:flapping => true).to_json).callback do
|
395
|
-
if check[:type] == 'metric'
|
396
|
-
event[:check][:flapping] = is_flapping
|
409
|
+
unless check[:auto_resolve] == false && !check[:force_resolve]
|
410
|
+
@redis.hdel('events:' + client[:name], check[:name]).callback do
|
411
|
+
unless check[:handle] == false
|
412
|
+
event[:occurrences] = previous_occurrence[:occurrences]
|
413
|
+
event[:action] = :resolve
|
397
414
|
handle_event(event)
|
398
415
|
end
|
399
416
|
end
|
@@ -468,7 +485,6 @@ module Sensu
|
|
468
485
|
def setup_keepalive_monitor
|
469
486
|
@logger.debug('monitoring client keepalives')
|
470
487
|
@master_timers << EM::PeriodicTimer.new(30) do
|
471
|
-
@logger.debug('checking for stale client info')
|
472
488
|
@redis.smembers('clients').callback do |clients|
|
473
489
|
clients.each do |client_name|
|
474
490
|
@redis.get('client:' + client_name).callback do |client_json|
|
@@ -502,9 +518,39 @@ module Sensu
|
|
502
518
|
end
|
503
519
|
end
|
504
520
|
|
521
|
+
def setup_aggregation_pruner
|
522
|
+
@logger.debug('pruning aggregations')
|
523
|
+
@master_timers << EM::PeriodicTimer.new(20) do
|
524
|
+
@redis.smembers('aggregates').callback do |checks|
|
525
|
+
checks.each do |check_name|
|
526
|
+
@redis.smembers('aggregates:' + check_name).callback do |aggregates|
|
527
|
+
aggregates.sort!
|
528
|
+
until aggregates.size <= 10
|
529
|
+
check_issued = aggregates.shift
|
530
|
+
@redis.srem('aggregates:' + check_name, check_issued).callback do
|
531
|
+
result_set = check_name + ':' + check_issued.to_s
|
532
|
+
@redis.del('aggregate:' + result_set).callback do
|
533
|
+
@redis.del('aggregation:' + result_set).callback do
|
534
|
+
@logger.debug('pruned aggregation', {
|
535
|
+
:check => {
|
536
|
+
:name => check_name,
|
537
|
+
:issued => check_issued
|
538
|
+
}
|
539
|
+
})
|
540
|
+
end
|
541
|
+
end
|
542
|
+
end
|
543
|
+
end
|
544
|
+
end
|
545
|
+
end
|
546
|
+
end
|
547
|
+
end
|
548
|
+
end
|
549
|
+
|
505
550
|
def master_duties
|
506
551
|
setup_publisher
|
507
552
|
setup_keepalive_monitor
|
553
|
+
setup_aggregation_pruner
|
508
554
|
end
|
509
555
|
|
510
556
|
def request_master_election
|
@@ -514,7 +560,7 @@ module Sensu
|
|
514
560
|
@logger.info('i am the master')
|
515
561
|
master_duties
|
516
562
|
else
|
517
|
-
@redis.get('lock:master') do |timestamp|
|
563
|
+
@redis.get('lock:master').callback do |timestamp|
|
518
564
|
if Time.now.to_i - timestamp.to_i >= 60
|
519
565
|
@redis.getset('lock:master', Time.now.to_i).callback do |previous|
|
520
566
|
if previous == timestamp
|
data/lib/sensu/settings.rb
CHANGED
@@ -287,7 +287,7 @@ module Sensu
|
|
287
287
|
unless @settings[:client][:address].is_a?(String)
|
288
288
|
invalid('client must have an address')
|
289
289
|
end
|
290
|
-
unless @settings[:client][:subscriptions].is_a?(Array) &&
|
290
|
+
unless @settings[:client][:subscriptions].is_a?(Array) && !@settings[:client][:subscriptions].empty?
|
291
291
|
invalid('client must have subscriptions')
|
292
292
|
end
|
293
293
|
@settings[:client][:subscriptions].each do |subscription|
|
@@ -327,6 +327,20 @@ module Sensu
|
|
327
327
|
:handler => handler
|
328
328
|
})
|
329
329
|
end
|
330
|
+
if handler.has_key?(:severities)
|
331
|
+
unless handler[:severities].is_a?(Array) && !handler[:severities].empty?
|
332
|
+
invalid('handler severities must be an array and not empty', {
|
333
|
+
:handler => handler
|
334
|
+
})
|
335
|
+
end
|
336
|
+
handler[:severities].each do |severity|
|
337
|
+
unless Sensu::SEVERITIES.include?(severity)
|
338
|
+
invalid('handler severities are invalid', {
|
339
|
+
:handler => handler
|
340
|
+
})
|
341
|
+
end
|
342
|
+
end
|
343
|
+
end
|
330
344
|
case handler[:type]
|
331
345
|
when 'pipe'
|
332
346
|
unless handler[:command].is_a?(String)
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
5
|
-
prerelease:
|
4
|
+
version: 0.9.8.beta
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Sean Porter
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-09-
|
13
|
+
date: 2012-09-25 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: eventmachine
|
17
|
-
requirement: &
|
17
|
+
requirement: &22192440 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - =
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 1.0.0.rc.4
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *22192440
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: amqp
|
28
|
-
requirement: &
|
28
|
+
requirement: &22191880 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - =
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 0.9.7
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *22191880
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: json
|
39
|
-
requirement: &
|
39
|
+
requirement: &22191380 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *22191380
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: cabin
|
50
|
-
requirement: &
|
50
|
+
requirement: &22190740 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - =
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: 0.4.4
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *22190740
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: ruby-redis
|
61
|
-
requirement: &
|
61
|
+
requirement: &22189740 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - =
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: 0.0.2
|
67
67
|
type: :runtime
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *22189740
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: async_sinatra
|
72
|
-
requirement: &
|
72
|
+
requirement: &22166160 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - =
|
@@ -77,10 +77,10 @@ dependencies:
|
|
77
77
|
version: 1.0.0
|
78
78
|
type: :runtime
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *22166160
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: thin
|
83
|
-
requirement: &
|
83
|
+
requirement: &22164620 !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
86
86
|
- - =
|
@@ -88,10 +88,10 @@ dependencies:
|
|
88
88
|
version: 1.4.1
|
89
89
|
type: :runtime
|
90
90
|
prerelease: false
|
91
|
-
version_requirements: *
|
91
|
+
version_requirements: *22164620
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
93
|
name: rake
|
94
|
-
requirement: &
|
94
|
+
requirement: &22163460 !ruby/object:Gem::Requirement
|
95
95
|
none: false
|
96
96
|
requirements:
|
97
97
|
- - ! '>='
|
@@ -99,10 +99,10 @@ dependencies:
|
|
99
99
|
version: '0'
|
100
100
|
type: :development
|
101
101
|
prerelease: false
|
102
|
-
version_requirements: *
|
102
|
+
version_requirements: *22163460
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: em-spec
|
105
|
-
requirement: &
|
105
|
+
requirement: &22161740 !ruby/object:Gem::Requirement
|
106
106
|
none: false
|
107
107
|
requirements:
|
108
108
|
- - ! '>='
|
@@ -110,10 +110,10 @@ dependencies:
|
|
110
110
|
version: '0'
|
111
111
|
type: :development
|
112
112
|
prerelease: false
|
113
|
-
version_requirements: *
|
113
|
+
version_requirements: *22161740
|
114
114
|
- !ruby/object:Gem::Dependency
|
115
115
|
name: em-http-request
|
116
|
-
requirement: &
|
116
|
+
requirement: &22160720 !ruby/object:Gem::Requirement
|
117
117
|
none: false
|
118
118
|
requirements:
|
119
119
|
- - ! '>='
|
@@ -121,7 +121,7 @@ dependencies:
|
|
121
121
|
version: '0'
|
122
122
|
type: :development
|
123
123
|
prerelease: false
|
124
|
-
version_requirements: *
|
124
|
+
version_requirements: *22160720
|
125
125
|
description: A monitoring framework that aims to be simple, malleable, and scalable.
|
126
126
|
Uses the publish/subscribe model.
|
127
127
|
email:
|
@@ -169,9 +169,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
169
169
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
170
170
|
none: false
|
171
171
|
requirements:
|
172
|
-
- - ! '
|
172
|
+
- - ! '>'
|
173
173
|
- !ruby/object:Gem::Version
|
174
|
-
version:
|
174
|
+
version: 1.3.1
|
175
175
|
requirements: []
|
176
176
|
rubyforge_project:
|
177
177
|
rubygems_version: 1.8.11
|