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 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