sensu 0.9.7.beta → 0.9.7.beta.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -10,3 +10,13 @@ sending to a handler.
10
10
  AMQP handlers can no longer use `"send_only_check_output": true`, but
11
11
  instead have access to the built-in mutators `"mutator": "only_check_output"` and
12
12
  `"mutator": "only_check_output_split"`.
13
+
14
+ ### Other
15
+
16
+ Improved graceful process termination.
17
+
18
+ Improved client socket ping/pong.
19
+
20
+ Strict dependency version locking.
21
+
22
+ Adjusted logging level for metric check results and events.
data/lib/sensu/api.rb CHANGED
@@ -386,7 +386,9 @@ module Sensu
386
386
  $redis.sadd('stashes', 'test/test').callback do
387
387
  Thin::Logging.silent = true
388
388
  Thin::Server.start(self, $settings[:api][:port])
389
- block.call
389
+ EM::add_timer(0.5) do
390
+ block.call
391
+ end
390
392
  end
391
393
  end
392
394
  end
data/lib/sensu/base.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'rubygems'
2
2
 
3
- gem 'eventmachine', '~> 1.0.0.beta.4'
3
+ gem 'eventmachine', '1.0.0.rc.4'
4
4
 
5
5
  require 'optparse'
6
6
  require 'json'
data/lib/sensu/client.rb CHANGED
@@ -67,7 +67,13 @@ module Sensu
67
67
  :client => @settings[:client][:name],
68
68
  :check => check
69
69
  }
70
- @logger.info('publishing check result', {
70
+ log_level = :info
71
+ if @settings.check_exists?(check[:name])
72
+ if @settings[:checks][check[:name]][:type] == 'metric'
73
+ log_level = :debug
74
+ end
75
+ end
76
+ @logger.send(log_level, 'publishing check result', {
71
77
  :payload => payload
72
78
  })
73
79
  @amq.queue('results').publish(payload.to_json)
@@ -234,15 +240,10 @@ module Sensu
234
240
  def unsubscribe(&block)
235
241
  if @rabbitmq.connected?
236
242
  @logger.warn('unsubscribing from client subscriptions')
237
- @check_request_queue.unsubscribe do
238
- if block
239
- block.call
240
- end
241
- end
242
- else
243
- if block
244
- block.call
245
- end
243
+ @check_request_queue.unsubscribe
244
+ end
245
+ if block
246
+ block.call
246
247
  end
247
248
  end
248
249
 
@@ -250,14 +251,12 @@ module Sensu
250
251
  @logger.info('completing checks in progress', {
251
252
  :checks_in_progress => @checks_in_progress
252
253
  })
253
- complete = EM::tick_loop do
254
- if @checks_in_progress.empty?
255
- :stop
256
- end
257
- end
258
- complete.on_stop do
259
- if block
260
- block.call
254
+ if block
255
+ retry_until_true do
256
+ if @checks_in_progress.empty?
257
+ block.call
258
+ true
259
+ end
261
260
  end
262
261
  end
263
262
  end
@@ -283,5 +282,13 @@ module Sensu
283
282
  def testing?
284
283
  File.basename($0) == 'rake'
285
284
  end
285
+
286
+ def retry_until_true(wait=0.5, &block)
287
+ EM::add_timer(wait) do
288
+ unless block.call
289
+ retry_until_true(wait, &block)
290
+ end
291
+ end
292
+ end
286
293
  end
287
294
  end
@@ -1,6 +1,6 @@
1
1
  module Sensu
2
2
  unless defined?(Sensu::VERSION)
3
- VERSION = '0.9.7.beta'
3
+ VERSION = '0.9.7.beta.1'
4
4
  end
5
5
 
6
6
  unless defined?(Sensu::DEFAULT_OPTIONS)
data/lib/sensu/server.rb CHANGED
@@ -28,7 +28,7 @@ module Sensu
28
28
  base = Sensu::Base.new(options)
29
29
  @settings = base.settings
30
30
  @timers = Array.new
31
- @handlers_in_progress = 0
31
+ @handlers_in_progress_count = 0
32
32
  end
33
33
 
34
34
  def setup_redis
@@ -176,7 +176,7 @@ module Sensu
176
176
  io.close_write
177
177
  mutated = io.read
178
178
  end
179
- unless $?.exitstatus == 0
179
+ if $?.exitstatus != 0
180
180
  @logger.warn('mutator had a non-zero exit status', {
181
181
  :event => event,
182
182
  :mutator => mutator
@@ -211,7 +211,7 @@ module Sensu
211
211
  :event => event,
212
212
  :handler => handler
213
213
  })
214
- @handlers_in_progress += 1
214
+ @handlers_in_progress_count += 1
215
215
  case handler[:type]
216
216
  when 'pipe'
217
217
  execute = Proc.new do
@@ -235,19 +235,43 @@ module Sensu
235
235
  end
236
236
  end
237
237
  complete = Proc.new do
238
- @handlers_in_progress -= 1
238
+ @handlers_in_progress_count -= 1
239
239
  end
240
240
  EM::defer(execute, complete)
241
+ when 'tcp', 'udp'
242
+ data = Proc.new do
243
+ mutate_event_data(handler, event)
244
+ end
245
+ write = Proc.new do |data|
246
+ begin
247
+ case handler[:type]
248
+ when 'tcp'
249
+ EM::connect(handler[:socket][:host], handler[:socket][:port], nil) do |socket|
250
+ socket.send_data(data)
251
+ socket.close_connection_after_writing
252
+ end
253
+ when 'udp'
254
+ EM::open_datagram_socket('127.0.0.1', 0, nil) do |socket|
255
+ socket.send_datagram(data, handler[:socket][:host], handler[:socket][:port])
256
+ socket.close_connection_after_writing
257
+ end
258
+ end
259
+ rescue => error
260
+ @logger.error('handler error', {
261
+ :event => event,
262
+ :handler => handler,
263
+ :error => error.to_s
264
+ })
265
+ end
266
+ @handlers_in_progress_count -= 1
267
+ end
268
+ EM::defer(data, write)
241
269
  when 'amqp'
242
270
  exchange_name = handler[:exchange][:name]
243
271
  exchange_type = handler[:exchange].has_key?(:type) ? handler[:exchange][:type].to_sym : :direct
244
272
  exchange_options = handler[:exchange].reject do |key, value|
245
273
  [:name, :type].include?(key)
246
274
  end
247
- @logger.debug('publishing event to an amqp exchange', {
248
- :event => event,
249
- :exchange => handler[:exchange]
250
- })
251
275
  payloads = Proc.new do
252
276
  Array(mutate_event_data(handler, event))
253
277
  end
@@ -257,14 +281,14 @@ module Sensu
257
281
  @amq.method(exchange_type).call(exchange_name, exchange_options).publish(payload)
258
282
  end
259
283
  end
260
- @handlers_in_progress -= 1
284
+ @handlers_in_progress_count -= 1
261
285
  end
262
286
  EM::defer(payloads, publish)
263
287
  when 'set'
264
288
  @logger.error('handler sets cannot be nested', {
265
289
  :handler => handler
266
290
  })
267
- @handlers_in_progress -= 1
291
+ @handlers_in_progress_count -= 1
268
292
  end
269
293
  end
270
294
  end
@@ -504,8 +528,19 @@ module Sensu
504
528
  if @redis.connected? && @is_master
505
529
  @redis.del('lock:master').callback do
506
530
  @logger.warn('resigned as master')
507
- if block
508
- block.call
531
+ @is_master = false
532
+ end
533
+ if block
534
+ timestamp = Time.now.to_i
535
+ retry_until_true do
536
+ if !@is_master
537
+ block.call
538
+ true
539
+ elsif Time.now.to_i - timestamp >= 5
540
+ @logger.warn('failed to resign as master')
541
+ block.call
542
+ true
543
+ end
509
544
  end
510
545
  end
511
546
  else
@@ -549,11 +584,19 @@ module Sensu
549
584
  def unsubscribe(&block)
550
585
  if @rabbitmq.connected?
551
586
  @logger.warn('unsubscribing from keepalives')
552
- @keepalive_queue.unsubscribe do
553
- @logger.warn('unsubscribing from results')
554
- @result_queue.unsubscribe do
555
- if block
587
+ @keepalive_queue.unsubscribe
588
+ @logger.warn('unsubscribing from results')
589
+ @result_queue.unsubscribe
590
+ if block
591
+ timestamp = Time.now.to_i
592
+ retry_until_true do
593
+ if !@keepalive_queue.subscribed? && !@result_queue.subscribed?
594
+ block.call
595
+ true
596
+ elsif Time.now.to_i - timestamp >= 5
597
+ @logger.warn('failed to unsubscribe from keepalives and results')
556
598
  block.call
599
+ true
557
600
  end
558
601
  end
559
602
  end
@@ -566,16 +609,14 @@ module Sensu
566
609
 
567
610
  def complete_handlers_in_progress(&block)
568
611
  @logger.info('completing handlers in progress', {
569
- :handlers_in_progress => @handlers_in_progress
612
+ :handlers_in_progress_count => @handlers_in_progress_count
570
613
  })
571
- complete = EM::tick_loop do
572
- if @handlers_in_progress == 0
573
- :stop
574
- end
575
- end
576
- complete.on_stop do
577
- if block
578
- block.call
614
+ if block
615
+ retry_until_true do
616
+ if @handlers_in_progress_count == 0
617
+ block.call
618
+ true
619
+ end
579
620
  end
580
621
  end
581
622
  end
@@ -604,5 +645,13 @@ module Sensu
604
645
  def testing?
605
646
  File.basename($0) == 'rake'
606
647
  end
648
+
649
+ def retry_until_true(wait=0.5, &block)
650
+ EM::add_timer(wait) do
651
+ unless block.call
652
+ retry_until_true(wait, &block)
653
+ end
654
+ end
655
+ end
607
656
  end
608
657
  end
@@ -334,6 +334,22 @@ module Sensu
334
334
  :handler => handler
335
335
  })
336
336
  end
337
+ when 'tcp', 'udp'
338
+ unless handler[:socket].is_a?(Hash)
339
+ invalid('handler is missing socket hash', {
340
+ :handler => handler
341
+ })
342
+ end
343
+ unless handler[:socket][:host].is_a?(String)
344
+ invalid('handler is missing socket host', {
345
+ :handler => handler
346
+ })
347
+ end
348
+ unless handler[:socket][:port].is_a?(Integer)
349
+ invalid('handler is missing socket port', {
350
+ :handler => handler
351
+ })
352
+ end
337
353
  when 'amqp'
338
354
  unless handler[:exchange].is_a?(Hash)
339
355
  invalid('handler is missing exchange hash', {
data/lib/sensu/socket.rb CHANGED
@@ -9,7 +9,7 @@ module Sensu
9
9
  end
10
10
 
11
11
  def receive_data(data)
12
- if data == 'ping'
12
+ if data.strip == 'ping'
13
13
  @logger.debug('socket received ping')
14
14
  reply('pong')
15
15
  else
data/sensu.gemspec CHANGED
@@ -5,20 +5,20 @@ Gem::Specification.new do |s|
5
5
  s.version = Sensu::VERSION
6
6
  s.platform = Gem::Platform::RUBY
7
7
  s.authors = ['Sean Porter', 'Justin Kolberg']
8
- s.email = ['sean.porter@sonian.net', 'justin.kolberg@sonian.net']
8
+ s.email = ['portertech@gmail.com', 'justin.kolberg@sonian.net']
9
9
  s.homepage = 'https://github.com/sensu/sensu'
10
10
  s.summary = 'A monitoring framework'
11
11
  s.description = 'A monitoring framework that aims to be simple, malleable, and scalable. Uses the publish/subscribe model.'
12
12
  s.license = 'MIT'
13
13
  s.has_rdoc = false
14
14
 
15
- s.add_dependency('eventmachine', '~> 1.0.0.beta.4')
15
+ s.add_dependency('eventmachine', '1.0.0.rc.4')
16
16
  s.add_dependency('amqp', '0.7.4')
17
- s.add_dependency('json')
17
+ s.add_dependency('json', '1.7.3')
18
18
  s.add_dependency('cabin', '0.4.4')
19
- s.add_dependency('ruby-redis')
19
+ s.add_dependency('ruby-redis', '0.0.2')
20
20
  s.add_dependency('async_sinatra', '1.0.0')
21
- s.add_dependency('thin')
21
+ s.add_dependency('thin', '1.4.1')
22
22
 
23
23
  s.add_development_dependency('rake')
24
24
  s.add_development_dependency('em-spec')
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31098133
4
+ hash: 62196233
5
5
  prerelease: true
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
9
  - 7
10
10
  - beta
11
- version: 0.9.7.beta
11
+ - 1
12
+ version: 0.9.7.beta.1
12
13
  platform: ruby
13
14
  authors:
14
15
  - Sean Porter
@@ -17,7 +18,7 @@ autorequire:
17
18
  bindir: bin
18
19
  cert_chain: []
19
20
 
20
- date: 2012-07-18 00:00:00 -07:00
21
+ date: 2012-08-06 00:00:00 -07:00
21
22
  default_executable:
22
23
  dependencies:
23
24
  - !ruby/object:Gem::Dependency
@@ -26,16 +27,16 @@ dependencies:
26
27
  requirement: &id001 !ruby/object:Gem::Requirement
27
28
  none: false
28
29
  requirements:
29
- - - ~>
30
+ - - "="
30
31
  - !ruby/object:Gem::Version
31
- hash: 62196363
32
+ hash: 15424061
32
33
  segments:
33
34
  - 1
34
35
  - 0
35
36
  - 0
36
- - beta
37
+ - rc
37
38
  - 4
38
- version: 1.0.0.beta.4
39
+ version: 1.0.0.rc.4
39
40
  type: :runtime
40
41
  version_requirements: *id001
41
42
  - !ruby/object:Gem::Dependency
@@ -60,12 +61,14 @@ dependencies:
60
61
  requirement: &id003 !ruby/object:Gem::Requirement
61
62
  none: false
62
63
  requirements:
63
- - - ">="
64
+ - - "="
64
65
  - !ruby/object:Gem::Version
65
- hash: 3
66
+ hash: 13
66
67
  segments:
67
- - 0
68
- version: "0"
68
+ - 1
69
+ - 7
70
+ - 3
71
+ version: 1.7.3
69
72
  type: :runtime
70
73
  version_requirements: *id003
71
74
  - !ruby/object:Gem::Dependency
@@ -90,12 +93,14 @@ dependencies:
90
93
  requirement: &id005 !ruby/object:Gem::Requirement
91
94
  none: false
92
95
  requirements:
93
- - - ">="
96
+ - - "="
94
97
  - !ruby/object:Gem::Version
95
- hash: 3
98
+ hash: 27
96
99
  segments:
97
100
  - 0
98
- version: "0"
101
+ - 0
102
+ - 2
103
+ version: 0.0.2
99
104
  type: :runtime
100
105
  version_requirements: *id005
101
106
  - !ruby/object:Gem::Dependency
@@ -120,12 +125,14 @@ dependencies:
120
125
  requirement: &id007 !ruby/object:Gem::Requirement
121
126
  none: false
122
127
  requirements:
123
- - - ">="
128
+ - - "="
124
129
  - !ruby/object:Gem::Version
125
- hash: 3
130
+ hash: 5
126
131
  segments:
127
- - 0
128
- version: "0"
132
+ - 1
133
+ - 4
134
+ - 1
135
+ version: 1.4.1
129
136
  type: :runtime
130
137
  version_requirements: *id007
131
138
  - !ruby/object:Gem::Dependency
@@ -172,7 +179,7 @@ dependencies:
172
179
  version_requirements: *id010
173
180
  description: A monitoring framework that aims to be simple, malleable, and scalable. Uses the publish/subscribe model.
174
181
  email:
175
- - sean.porter@sonian.net
182
+ - portertech@gmail.com
176
183
  - justin.kolberg@sonian.net
177
184
  executables:
178
185
  - sensu-api