sensu 0.9.8 → 0.9.9.beta

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## 0.9.9 - TBD
2
+
3
+ ### Features
4
+
5
+ RabbitMQ keepalives & results queue message and consumer counts available
6
+ via the API (/info).
7
+
8
+ Aggregate results available via the API when using a parameter
9
+ (?results=true).
10
+
11
+ ### Other
12
+
13
+ Server is now using basic AMQP QoS (prefetch), just enough back pressure.
14
+
15
+ Fixed server execute command method error handling.
16
+
17
+ Events with a resolve action bypass handler severity filtering.
18
+
1
19
  ## 0.9.8 - 2012-11-15
2
20
 
3
21
  ### Features
data/lib/sensu/api.rb CHANGED
@@ -229,12 +229,34 @@ module Sensu
229
229
  :sensu => {
230
230
  :version => Sensu::VERSION
231
231
  },
232
+ :rabbitmq => {
233
+ :keepalives => {
234
+ :messages => nil,
235
+ :consumers => nil
236
+ },
237
+ :results => {
238
+ :messages => nil,
239
+ :consumers => nil
240
+ }
241
+ },
232
242
  :health => {
233
243
  :redis => $redis.connected? ? 'ok' : 'down',
234
244
  :rabbitmq => $rabbitmq.connected? ? 'ok' : 'down'
235
245
  }
236
246
  }
237
- body response.to_json
247
+ if $rabbitmq.connected?
248
+ $amq.queue('keepalives').status do |messages, consumers|
249
+ response[:rabbitmq][:keepalives][:messages] = messages
250
+ response[:rabbitmq][:keepalives][:consumers] = consumers
251
+ $amq.queue('results').status do |messages, consumers|
252
+ response[:rabbitmq][:results][:messages] = messages
253
+ response[:rabbitmq][:results][:consumers] = consumers
254
+ body response.to_json
255
+ end
256
+ end
257
+ else
258
+ body response.to_json
259
+ end
238
260
  end
239
261
 
240
262
  aget '/clients' do
@@ -449,27 +471,28 @@ module Sensu
449
471
  result_set = check_name + ':' + check_issued
450
472
  $redis.hgetall('aggregate:' + result_set).callback do |aggregate|
451
473
  unless aggregate.empty?
452
- response = aggregate.inject(Hash.new) do |formatted, (status, count)|
453
- formatted[status] = Integer(count)
454
- formatted
474
+ response = aggregate.inject(Hash.new) do |totals, (status, count)|
475
+ totals[status] = Integer(count)
476
+ totals
455
477
  end
456
- if params[:summarize]
457
- options = params[:summarize].split(',')
458
- $redis.hgetall('aggregation:' + result_set).callback do |results|
459
- formatted_results = results.inject(Hash.new) do |formatted, (client_name, check_json)|
460
- formatted[client_name] = JSON.parse(check_json, :symbolize_names => true)
461
- formatted
462
- end
478
+ $redis.hgetall('aggregation:' + result_set).callback do |results|
479
+ parsed_results = results.inject(Array.new) do |parsed, (client_name, check_json)|
480
+ check = JSON.parse(check_json, :symbolize_names => true)
481
+ parsed.push(check.merge(:client => client_name))
482
+ end
483
+ if params[:summarize]
484
+ options = params[:summarize].split(',')
463
485
  if options.include?('output')
464
486
  outputs = Hash.new(0)
465
- formatted_results.each do |client_name, check|
466
- outputs[check[:output]] += 1
487
+ parsed_results.each do |result|
488
+ outputs[result[:output]] += 1
467
489
  end
468
490
  response[:outputs] = outputs
469
491
  end
470
- body response.to_json
471
492
  end
472
- else
493
+ if params[:results]
494
+ response[:results] = parsed_results
495
+ end
473
496
  body response.to_json
474
497
  end
475
498
  else
data/lib/sensu/client.rb CHANGED
@@ -186,10 +186,10 @@ module Sensu
186
186
  def setup_standalone
187
187
  @logger.debug('scheduling standalone checks')
188
188
  standalone_check_count = 0
189
- stagger = testing? ? 0 : 7
189
+ stagger = testing? ? 0 : 2
190
190
  @settings.checks.each do |check|
191
191
  if check[:standalone]
192
- standalone_check_count += 1
192
+ standalone_check_count = (standalone_check_count + 1) % 30
193
193
  @timers << EM::Timer.new(stagger * standalone_check_count) do
194
194
  interval = testing? ? 0.5 : check[:interval]
195
195
  @timers << EM::PeriodicTimer.new(interval) do
@@ -1,6 +1,6 @@
1
1
  module Sensu
2
2
  unless defined?(Sensu::VERSION)
3
- VERSION = '0.9.8'
3
+ VERSION = '0.9.9.beta'
4
4
  end
5
5
 
6
6
  unless defined?(Sensu::DEFAULT_OPTIONS)
data/lib/sensu/server.rb CHANGED
@@ -76,6 +76,7 @@ module Sensu
76
76
  end
77
77
  @amq = AMQP::Channel.new(@rabbitmq)
78
78
  @amq.auto_recovery = true
79
+ @amq.prefetch(1)
79
80
  @amq.on_error do |channel, channel_close|
80
81
  @logger.fatal('rabbitmq channel closed', {
81
82
  :error => {
@@ -90,13 +91,15 @@ module Sensu
90
91
  def setup_keepalives
91
92
  @logger.debug('subscribing to keepalives')
92
93
  @keepalive_queue = @amq.queue('keepalives')
93
- @keepalive_queue.subscribe do |payload|
94
+ @keepalive_queue.subscribe(:ack => true) do |header, payload|
94
95
  client = JSON.parse(payload, :symbolize_names => true)
95
96
  @logger.debug('received keepalive', {
96
97
  :client => client
97
98
  })
98
99
  @redis.set('client:' + client[:name], client.to_json).callback do
99
- @redis.sadd('clients', client[:name])
100
+ @redis.sadd('clients', client[:name]).callback do
101
+ header.ack
102
+ end
100
103
  end
101
104
  end
102
105
  end
@@ -164,14 +167,16 @@ module Sensu
164
167
  handlers = derive_handlers(handler_list)
165
168
  event_severity = Sensu::SEVERITIES[event[:check][:status]] || 'unknown'
166
169
  handlers.select do |handler|
167
- if handler.has_key?(:severities) && !handler[:severities].include?(event_severity)
168
- @logger.debug('handler does not handle event severity', {
170
+ if check_subdued?(event[:check], :handler)
171
+ @logger.info('check is subdued at handler', {
169
172
  :event => event,
170
173
  :handler => handler
171
174
  })
172
175
  false
173
- elsif check_subdued?(event[:check], :handler)
174
- @logger.info('check is subdued at handler', {
176
+ elsif event[:action] == :resolve
177
+ true
178
+ elsif handler.has_key?(:severities) && !handler[:severities].include?(event_severity)
179
+ @logger.debug('handler does not handle event severity', {
175
180
  :event => event,
176
181
  :handler => handler
177
182
  })
@@ -183,10 +188,16 @@ module Sensu
183
188
  end
184
189
 
185
190
  def execute_command(command, data=nil, on_error=nil, &block)
191
+ on_error ||= Proc.new do |error|
192
+ @logger.error('failed to execute command', {
193
+ :command => command,
194
+ :data => data,
195
+ :error => error.to_s
196
+ })
197
+ end
186
198
  execute = Proc.new do
187
- output = ''
188
- status = 0
189
199
  begin
200
+ output = ''
190
201
  IO.popen(command + ' 2>&1', 'r+') do |io|
191
202
  unless data.nil?
192
203
  io.write(data.to_s)
@@ -195,16 +206,16 @@ module Sensu
195
206
  output = io.read
196
207
  end
197
208
  status = $?.exitstatus
209
+ [true, output, status]
198
210
  rescue => error
199
- status = 2
200
- if on_error.respond_to?(:call)
201
- on_error.call(error)
202
- end
211
+ on_error.call(error)
212
+ [false, nil, nil]
203
213
  end
204
- [output, status]
205
214
  end
206
- complete = Proc.new do |output, status|
207
- block.call(output, status)
215
+ complete = Proc.new do |success, output, status|
216
+ if success
217
+ block.call(output, status)
218
+ end
208
219
  end
209
220
  EM::defer(execute, complete)
210
221
  end
@@ -434,12 +445,15 @@ module Sensu
434
445
  def setup_results
435
446
  @logger.debug('subscribing to results')
436
447
  @result_queue = @amq.queue('results')
437
- @result_queue.subscribe do |payload|
448
+ @result_queue.subscribe(:ack => true) do |header, payload|
438
449
  result = JSON.parse(payload, :symbolize_names => true)
439
450
  @logger.debug('received result', {
440
451
  :result => result
441
452
  })
442
453
  process_result(result)
454
+ EM::next_tick do
455
+ header.ack
456
+ end
443
457
  end
444
458
  end
445
459
 
@@ -461,10 +475,10 @@ module Sensu
461
475
  def setup_publisher
462
476
  @logger.debug('scheduling check requests')
463
477
  check_count = 0
464
- stagger = testing? ? 0 : 7
478
+ stagger = testing? ? 0 : 2
465
479
  @settings.checks.each do |check|
466
480
  unless check[:publish] == false || check[:standalone]
467
- check_count += 1
481
+ check_count = (check_count + 1) % 30
468
482
  @master_timers << EM::Timer.new(stagger * check_count) do
469
483
  interval = testing? ? 0.5 : check[:interval]
470
484
  @master_timers << EM::PeriodicTimer.new(interval) do
@@ -388,6 +388,13 @@ module Sensu
388
388
  :handler => handler
389
389
  })
390
390
  end
391
+ handler[:handlers].each do |handler_name|
392
+ unless handler_name.is_a?(String)
393
+ invalid('handler set handlers must be strings', {
394
+ :handler => handler
395
+ })
396
+ end
397
+ end
391
398
  else
392
399
  invalid('unknown handler type', {
393
400
  :handler => handler
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu
3
3
  version: !ruby/object:Gem::Version
4
- hash: 43
5
- prerelease: false
4
+ hash: -1732117756
5
+ prerelease: true
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 8
10
- version: 0.9.8
9
+ - 9
10
+ - beta
11
+ version: 0.9.9.beta
11
12
  platform: ruby
12
13
  authors:
13
14
  - Sean Porter
@@ -16,7 +17,7 @@ autorequire:
16
17
  bindir: bin
17
18
  cert_chain: []
18
19
 
19
- date: 2012-11-15 00:00:00 -08:00
20
+ date: 2012-11-27 00:00:00 -08:00
20
21
  default_executable:
21
22
  dependencies:
22
23
  - !ruby/object:Gem::Dependency
@@ -224,12 +225,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
224
225
  required_rubygems_version: !ruby/object:Gem::Requirement
225
226
  none: false
226
227
  requirements:
227
- - - ">="
228
+ - - ">"
228
229
  - !ruby/object:Gem::Version
229
- hash: 3
230
+ hash: 25
230
231
  segments:
231
- - 0
232
- version: "0"
232
+ - 1
233
+ - 3
234
+ - 1
235
+ version: 1.3.1
233
236
  requirements: []
234
237
 
235
238
  rubyforge_project: