sensu 0.9.7 → 0.9.8.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/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
|