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 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)
@@ -1,6 +1,6 @@
1
1
  module Sensu
2
2
  unless defined?(Sensu::VERSION)
3
- VERSION = '0.9.7'
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
- if subdue
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 check_handlers(check)
122
+ def event_handlers(event)
127
123
  handler_list = case
128
- when check.has_key?(:handler)
129
- [check[:handler]]
130
- when check.has_key?(:handlers)
131
- check[:handlers]
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.reject! do |handler_name|
145
- unless @settings.handler_exists?(handler_name)
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
- true
152
- else
153
- false
167
+ next
154
168
  end
155
169
  end
156
- handler_list.map do |handler_name|
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
- unless check_subdued?(event[:check], :handler)
212
- handlers = check_handlers(event[:check])
213
- handlers.each do |handler|
214
- log_level = event[:check][:type] == 'metric' ? :debug : :info
215
- @logger.send(log_level, 'handling event', {
216
- :event => event,
217
- :handler => handler
218
- })
219
- @handlers_in_progress_count += 1
220
- case handler[:type]
221
- when 'pipe'
222
- execute = Proc.new do
223
- begin
224
- mutated_event_data = mutate_event_data(handler, event)
225
- unless mutated_event_data.nil? || mutated_event_data.empty?
226
- IO.popen(handler[:command] + ' 2>&1', 'r+') do |io|
227
- io.write(mutated_event_data)
228
- io.close_write
229
- io.read.split(/\n+/).each do |line|
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
- complete = Proc.new do
243
- @handlers_in_progress_count -= 1
244
- end
245
- EM::defer(execute, complete)
246
- when 'tcp', 'udp'
247
- data = Proc.new do
248
- mutate_event_data(handler, event)
249
- end
250
- write = Proc.new do |data|
251
- begin
252
- case handler[:type]
253
- when 'tcp'
254
- EM::connect(handler[:socket][:host], handler[:socket][:port], nil) do |socket|
255
- socket.send_data(data)
256
- socket.close_connection_after_writing
257
- end
258
- when 'udp'
259
- EM::open_datagram_socket('127.0.0.1', 0, nil) do |socket|
260
- socket.send_datagram(data, handler[:socket][:host], handler[:socket][:port])
261
- socket.close_connection_after_writing
262
- end
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
- @handlers_in_progress_count -= 1
272
- end
273
- EM::defer(data, write)
274
- when 'amqp'
275
- exchange_name = handler[:exchange][:name]
276
- exchange_type = handler[:exchange].has_key?(:type) ? handler[:exchange][:type].to_sym : :direct
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
- publish = Proc.new do |payloads|
284
- payloads.each do |payload|
285
- unless payload.empty?
286
- @amq.method(exchange_type).call(exchange_name, exchange_options).publish(payload)
287
- end
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
- event = {
316
- :client => client,
317
- :check => check,
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
- event[:check][:history] = history
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.lpop(history_key)
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
- if check[:status] != 0
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[:check][:flapping] = is_flapping
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 is_flapping
377
- unless check[:auto_resolve] == false && !check[:force_resolve]
378
- @redis.hdel('events:' + client[:name], check[:name]).callback do
379
- unless check[:handle] == false
380
- event[:occurrences] = previous_occurrence[:occurrences]
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
@@ -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) && @settings[:client][:subscriptions].count > 0
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.7
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-20 00:00:00.000000000 Z
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: &10456340 !ruby/object:Gem::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: *10456340
25
+ version_requirements: *22192440
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: amqp
28
- requirement: &10455580 !ruby/object:Gem::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: *10455580
36
+ version_requirements: *22191880
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: json
39
- requirement: &10445140 !ruby/object:Gem::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: *10445140
47
+ version_requirements: *22191380
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: cabin
50
- requirement: &10444380 !ruby/object:Gem::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: *10444380
58
+ version_requirements: *22190740
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: ruby-redis
61
- requirement: &10443860 !ruby/object:Gem::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: *10443860
69
+ version_requirements: *22189740
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: async_sinatra
72
- requirement: &10443240 !ruby/object:Gem::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: *10443240
80
+ version_requirements: *22166160
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: thin
83
- requirement: &10442620 !ruby/object:Gem::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: *10442620
91
+ version_requirements: *22164620
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: rake
94
- requirement: &10441960 !ruby/object:Gem::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: *10441960
102
+ version_requirements: *22163460
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: em-spec
105
- requirement: &10441040 !ruby/object:Gem::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: *10441040
113
+ version_requirements: *22161740
114
114
  - !ruby/object:Gem::Dependency
115
115
  name: em-http-request
116
- requirement: &10439840 !ruby/object:Gem::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: *10439840
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: '0'
174
+ version: 1.3.1
175
175
  requirements: []
176
176
  rubyforge_project:
177
177
  rubygems_version: 1.8.11