sensu 0.11.0.beta.1 → 0.11.0.beta.2

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/CHANGELOG.md CHANGED
@@ -15,8 +15,14 @@ You can specify the Sensu log severity level using the -L (--log_level)
15
15
  CLI argument, providing a valid level (eg. warn).
16
16
 
17
17
  You can specify custom sensitive Sensu client key/values to be redacted
18
- from log events and keepalives, eg. "client": { "redact":
19
- ["secret_access_key"] }.
18
+ from log events and keepalives, eg. "client": { "redact": [
19
+ "secret_access_key" ] }.
20
+
21
+ You can configure the Sensu client socket (UDP & TCP), bind & port, eg.
22
+ "client": { "socket": { "bind": "0.0.0.0", "port": 4040 } }.
23
+
24
+ You can choose to reconnect to RabbitMQ on initial TCP connection
25
+ failure, eg. "rabbitmq": { "on_failure": "reconnect" }.
20
26
 
21
27
  ### Other
22
28
 
@@ -29,8 +35,15 @@ UDP handler now binds to "0.0.0.0".
29
35
 
30
36
  Faster JSON parser.
31
37
 
38
+ AMQP connection heartbeats will no longer attempt to use a closed
39
+ channel.
40
+
32
41
  Missing AMQP connection heartbeats will result in a reconnect.
33
42
 
43
+ The keepalive & result queues will now auto-delete when there are no
44
+ active consumers. This change stops the creation of a keepalive/result
45
+ backlog, stale data that may overwhelm the recovering consumers.
46
+
34
47
  ## 0.10.2 - 2013-07-18
35
48
 
36
49
  ### Other
data/lib/sensu/api.rb CHANGED
@@ -188,6 +188,33 @@ module Sensu
188
188
  body ''
189
189
  end
190
190
 
191
+ def rabbitmq_info(&block)
192
+ info = {
193
+ :keepalives => {
194
+ :messages => nil,
195
+ :consumers => nil
196
+ },
197
+ :results => {
198
+ :messages => nil,
199
+ :consumers => nil
200
+ },
201
+ :connected => $rabbitmq.connected?
202
+ }
203
+ if $rabbitmq.connected?
204
+ $amq.queue('keepalives', :auto_delete => true).status do |messages, consumers|
205
+ info[:keepalives][:messages] = messages
206
+ info[:keepalives][:consumers] = consumers
207
+ $amq.queue('results', :auto_delete => true).status do |messages, consumers|
208
+ info[:results][:messages] = messages
209
+ info[:results][:consumers] = consumers
210
+ block.call(info)
211
+ end
212
+ end
213
+ else
214
+ block.call(info)
215
+ end
216
+ end
217
+
191
218
  def event_hash(event_json, client_name, check_name)
192
219
  Oj.load(event_json).merge(
193
220
  :client => client_name,
@@ -220,36 +247,16 @@ module Sensu
220
247
  end
221
248
 
222
249
  aget '/info' do
223
- response = {
224
- :sensu => {
225
- :version => VERSION
226
- },
227
- :rabbitmq => {
228
- :keepalives => {
229
- :messages => nil,
230
- :consumers => nil
231
- },
232
- :results => {
233
- :messages => nil,
234
- :consumers => nil
250
+ rabbitmq_info do |info|
251
+ response = {
252
+ :sensu => {
253
+ :version => VERSION
235
254
  },
236
- :connected => $rabbitmq.connected?
237
- },
238
- :redis => {
239
- :connected => $redis.connected?
255
+ :rabbitmq => info,
256
+ :redis => {
257
+ :connected => $redis.connected?
258
+ }
240
259
  }
241
- }
242
- if $rabbitmq.connected?
243
- $amq.queue('keepalives').status do |messages, consumers|
244
- response[:rabbitmq][:keepalives][:messages] = messages
245
- response[:rabbitmq][:keepalives][:consumers] = consumers
246
- $amq.queue('results').status do |messages, consumers|
247
- response[:rabbitmq][:results][:messages] = messages
248
- response[:rabbitmq][:results][:consumers] = consumers
249
- body Oj.dump(response)
250
- end
251
- end
252
- else
253
260
  body Oj.dump(response)
254
261
  end
255
262
  end
@@ -259,22 +266,16 @@ module Sensu
259
266
  healthy = Array.new
260
267
  min_consumers = integer_parameter(params[:consumers])
261
268
  max_messages = integer_parameter(params[:messages])
262
- $amq.queue('keepalives').status do |messages, consumers|
269
+ rabbitmq_info do |info|
263
270
  if min_consumers
264
- healthy << (consumers >= min_consumers)
271
+ healthy << (info[:keepalives][:consumers] >= min_consumers)
272
+ healthy << (info[:results][:consumers] >= min_consumers)
265
273
  end
266
274
  if max_messages
267
- healthy << (messages <= max_messages)
268
- end
269
- $amq.queue('results').status do |messages, consumers|
270
- if min_consumers
271
- healthy << (consumers >= min_consumers)
272
- end
273
- if max_messages
274
- healthy << (messages <= max_messages)
275
- end
276
- healthy.all? ? no_content! : unavailable!
275
+ healthy << (info[:keepalives][:messages] <= max_messages)
276
+ healthy << (info[:results][:messages] <= max_messages)
277
277
  end
278
+ healthy.all? ? no_content! : unavailable!
278
279
  end
279
280
  else
280
281
  unavailable!
data/lib/sensu/client.rb CHANGED
@@ -229,14 +229,18 @@ module Sensu
229
229
  end
230
230
 
231
231
  def setup_sockets
232
- @logger.debug('binding client tcp socket')
233
- EM::start_server('127.0.0.1', 3030, Socket) do |socket|
232
+ options = @settings[:client][:socket] || Hash.new
233
+ options[:bind] ||= '127.0.0.1'
234
+ options[:port] ||= 3030
235
+ @logger.debug('binding client tcp and udp sockets', {
236
+ :options => options
237
+ })
238
+ EM::start_server(options[:bind], options[:port], Socket) do |socket|
234
239
  socket.logger = @logger
235
240
  socket.settings = @settings
236
241
  socket.amq = @amq
237
242
  end
238
- @logger.debug('binding client udp socket')
239
- EM::open_datagram_socket('127.0.0.1', 3030, Socket) do |socket|
243
+ EM::open_datagram_socket(options[:bind], options[:port], Socket) do |socket|
240
244
  socket.logger = @logger
241
245
  socket.settings = @settings
242
246
  socket.amq = @amq
@@ -1,6 +1,6 @@
1
1
  module Sensu
2
2
  unless defined?(Sensu::VERSION)
3
- VERSION = '0.11.0.beta.1'
3
+ VERSION = '0.11.0.beta.2'
4
4
 
5
5
  LOG_LEVELS = [:debug, :info, :warn, :error, :fatal]
6
6
 
@@ -51,17 +51,22 @@ module Sensu
51
51
  error = RabbitMQError.new('cannot connect to rabbitmq')
52
52
  @on_error.call(error)
53
53
  end
54
- @connection = AMQP.connect(options, {
55
- :on_tcp_connection_failure => on_failure,
56
- :on_possible_authentication_failure => on_failure
57
- })
58
- @connection.logger = Logger.get
59
54
  reconnect = Proc.new do
60
55
  unless @connection.reconnecting?
61
56
  @before_reconnect.call
62
57
  @connection.periodically_reconnect(5)
63
58
  end
64
59
  end
60
+ if options.is_a?(Hash)
61
+ if options[:on_failure] == 'reconnect'
62
+ on_failure = reconnect
63
+ end
64
+ end
65
+ @connection = AMQP.connect(options, {
66
+ :on_tcp_connection_failure => on_failure,
67
+ :on_possible_authentication_failure => on_failure
68
+ })
69
+ @connection.logger = Logger.get
65
70
  @connection.on_tcp_connection_loss(&reconnect)
66
71
  @connection.on_skipped_heartbeats(&reconnect)
67
72
  @channel = AMQP::Channel.new(@connection)
data/lib/sensu/server.rb CHANGED
@@ -79,10 +79,12 @@ module Sensu
79
79
  @amq.prefetch(1)
80
80
  end
81
81
 
82
- def setup_keepalives
82
+ def setup_keepalives(&block)
83
83
  @logger.debug('subscribing to keepalives')
84
- @keepalive_queue = @amq.queue!('keepalives')
85
- @keepalive_queue.bind(@amq.direct('keepalives'))
84
+ @keepalive_queue = @amq.queue!('keepalives', :auto_delete => true)
85
+ @keepalive_queue.bind(@amq.direct('keepalives')) do
86
+ block.call if block
87
+ end
86
88
  @keepalive_queue.subscribe(:ack => true) do |header, payload|
87
89
  client = Oj.load(payload)
88
90
  @logger.debug('received keepalive', {
@@ -96,51 +98,45 @@ module Sensu
96
98
  end
97
99
  end
98
100
 
99
- def action_subdued?(check, handler=nil)
100
- subdue = false
101
- subdue_at = handler ? 'handler' : 'publisher'
102
- conditions = Array.new
103
- if check[:subdue]
104
- conditions << check[:subdue]
105
- end
106
- if handler && handler[:subdue]
107
- conditions << handler[:subdue]
108
- end
109
- conditions.each do |condition|
110
- if condition.has_key?(:begin) && condition.has_key?(:end)
111
- begin_time = Time.parse(condition[:begin])
112
- end_time = Time.parse(condition[:end])
113
- if end_time < begin_time
114
- if Time.now < end_time
115
- begin_time = Time.parse('12:00:00 AM')
116
- else
117
- end_time = Time.parse('11:59:59 PM')
118
- end
119
- end
120
- if Time.now >= begin_time && Time.now <= end_time
121
- subdue = true
101
+ def action_subdued?(condition)
102
+ subdued = false
103
+ if condition.has_key?(:begin) && condition.has_key?(:end)
104
+ begin_time = Time.parse(condition[:begin])
105
+ end_time = Time.parse(condition[:end])
106
+ if end_time < begin_time
107
+ if Time.now < end_time
108
+ begin_time = Time.parse('12:00:00 AM')
109
+ else
110
+ end_time = Time.parse('11:59:59 PM')
122
111
  end
123
112
  end
124
- if condition.has_key?(:days)
125
- days = condition[:days].map(&:downcase)
126
- if days.include?(Time.now.strftime('%A').downcase)
127
- subdue = true
128
- end
113
+ if Time.now >= begin_time && Time.now <= end_time
114
+ subdued = true
129
115
  end
130
- if subdue && condition.has_key?(:exceptions)
131
- subdue = condition[:exceptions].none? do |exception|
132
- Time.now >= Time.parse(exception[:begin]) && Time.now <= Time.parse(exception[:end])
133
- end
116
+ end
117
+ if condition.has_key?(:days)
118
+ days = condition[:days].map(&:downcase)
119
+ if days.include?(Time.now.strftime('%A').downcase)
120
+ subdued = true
134
121
  end
135
- if subdue
136
- if subdue_at == (condition[:at] || 'handler')
137
- break
138
- else
139
- subdue = false
140
- end
122
+ end
123
+ if subdued && condition.has_key?(:exceptions)
124
+ subdued = condition[:exceptions].none? do |exception|
125
+ Time.now >= Time.parse(exception[:begin]) && Time.now <= Time.parse(exception[:end])
141
126
  end
142
127
  end
143
- subdue
128
+ subdued
129
+ end
130
+
131
+ def handler_subdued?(handler, check)
132
+ subdued = Array.new
133
+ if handler[:subdue]
134
+ subdued << action_subdued?(handler[:subdue])
135
+ end
136
+ if check[:subdue] && check[:subdue][:at] != 'publisher'
137
+ subdued << action_subdued?(check[:subdue])
138
+ end
139
+ subdued.any?
144
140
  end
145
141
 
146
142
  def filter_attributes_match?(hash_one, hash_two)
@@ -208,8 +204,8 @@ module Sensu
208
204
  })
209
205
  next
210
206
  end
211
- if action_subdued?(event[:check], handler)
212
- @logger.info('action is subdued', {
207
+ if handler_subdued?(handler, event[:check])
208
+ @logger.info('handler is subdued', {
213
209
  :event => event,
214
210
  :handler => handler
215
211
  })
@@ -506,10 +502,12 @@ module Sensu
506
502
  end
507
503
  end
508
504
 
509
- def setup_results
505
+ def setup_results(&block)
510
506
  @logger.debug('subscribing to results')
511
- @result_queue = @amq.queue!('results')
512
- @result_queue.bind(@amq.direct('results'))
507
+ @result_queue = @amq.queue!('results', :auto_delete => true)
508
+ @result_queue.bind(@amq.direct('results')) do
509
+ block.call if block
510
+ end
513
511
  @result_queue.subscribe(:ack => true) do |header, payload|
514
512
  result = Oj.load(payload)
515
513
  @logger.debug('received result', {
@@ -522,6 +520,14 @@ module Sensu
522
520
  end
523
521
  end
524
522
 
523
+ def check_request_subdued?(check)
524
+ if check[:subdue] && check[:subdue][:at] == 'publisher'
525
+ action_subdued?(check[:subdue])
526
+ else
527
+ false
528
+ end
529
+ end
530
+
525
531
  def publish_check_request(check)
526
532
  payload = {
527
533
  :name => check[:name],
@@ -548,7 +554,7 @@ module Sensu
548
554
  @master_timers << EM::Timer.new(scheduling_delay) do
549
555
  interval = testing? ? 0.5 : check[:interval]
550
556
  @master_timers << EM::PeriodicTimer.new(interval) do
551
- unless action_subdued?(check)
557
+ unless check_request_subdued?(check)
552
558
  publish_check_request(check)
553
559
  else
554
560
  @logger.info('check request was subdued', {
@@ -394,6 +394,21 @@ module Sensu
394
394
  invalid('client subscriptions must each be a string')
395
395
  end
396
396
  end
397
+ if @settings[:client].has_key?(:socket)
398
+ unless @settings[:client][:socket].is_a?(Hash)
399
+ invalid('client socket must be a hash')
400
+ end
401
+ if @settings[:client][:socket].has_key?(:bind)
402
+ unless @settings[:client][:socket][:bind].is_a?(String)
403
+ invalid('client socket bind must be a string')
404
+ end
405
+ end
406
+ if @settings[:client][:socket].has_key?(:port)
407
+ unless @settings[:client][:socket][:port].is_a?(Integer)
408
+ invalid('client socket port must be an integer')
409
+ end
410
+ end
411
+ end
397
412
  if @settings[:client].has_key?(:keepalive)
398
413
  unless @settings[:client][:keepalive].is_a?(Hash)
399
414
  invalid('client keepalive must be a hash')
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu
3
3
  version: !ruby/object:Gem::Version
4
- hash: -2637871616
4
+ hash: 2750769037
5
5
  prerelease: true
6
6
  segments:
7
7
  - 0
8
8
  - 11
9
9
  - 0
10
10
  - beta
11
- - 1
12
- version: 0.11.0.beta.1
11
+ - 2
12
+ version: 0.11.0.beta.2
13
13
  platform: ruby
14
14
  authors:
15
15
  - Sean Porter
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2013-08-28 00:00:00 -07:00
21
+ date: 2013-09-15 00:00:00 -07:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency