sensu 0.9.5 → 0.9.6.beta

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,8 @@
1
+ module Sensu
2
+ VERSION = '0.9.6.beta'
3
+
4
+ DEFAULT_OPTIONS = {
5
+ :config_file => '/etc/sensu/config.json',
6
+ :config_dir => '/etc/sensu/conf.d'
7
+ }
8
+ end
@@ -0,0 +1,39 @@
1
+ module Sensu
2
+ class Logger
3
+ def initialize(options={})
4
+ @logger = Cabin::Channel.get
5
+ @logger.subscribe(STDOUT)
6
+ @logger.level = options[:verbose] ? :debug : options[:log_level] || :info
7
+ reopen(options)
8
+ setup_traps(options)
9
+ end
10
+
11
+ def reopen(options={})
12
+ unless options[:log_file].nil?
13
+ if File.writable?(options[:log_file]) ||
14
+ !File.exist?(options[:log_file]) && File.writable?(File.dirname(options[:log_file]))
15
+ STDOUT.reopen(options[:log_file], 'a')
16
+ STDERR.reopen(STDOUT)
17
+ STDOUT.sync = true
18
+ else
19
+ @logger.error('log file is not writable', {
20
+ :log_file => options[:log_file]
21
+ })
22
+ end
23
+ end
24
+ end
25
+
26
+ def setup_traps(options={})
27
+ if Signal.list.include?('USR1')
28
+ Signal.trap('USR1') do
29
+ @logger.level = @logger.level == :info ? :debug : :info
30
+ end
31
+ end
32
+ if Signal.list.include?('USR2')
33
+ Signal.trap('USR2') do
34
+ reopen(options)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,85 +1,9 @@
1
- class Array
2
- def deep_merge(other_array, &merger)
3
- concat(other_array).uniq
4
- end
5
- end
6
-
7
1
  class Hash
8
- def symbolize_keys(item=self)
9
- case item
10
- when Array
11
- item.map do |i|
12
- symbolize_keys(i)
13
- end
14
- when Hash
15
- Hash[
16
- item.map do |key, value|
17
- new_key = key.is_a?(String) ? key.to_sym : key
18
- new_value = symbolize_keys(value)
19
- [new_key, new_value]
20
- end
21
- ]
2
+ def method_missing(method, *arguments, &block)
3
+ if has_key?(method)
4
+ self[method]
22
5
  else
23
- item
24
- end
25
- end
26
-
27
- def deep_diff(hash)
28
- (self.keys | hash.keys).inject(Hash.new) do |diff, key|
29
- unless self[key] == hash[key]
30
- if self[key].is_a?(Hash) && hash[key].is_a?(Hash)
31
- diff[key] = self[key].deep_diff(hash[key])
32
- else
33
- diff[key] = [self[key], hash[key]]
34
- end
35
- end
36
- diff
37
- end
38
- end
39
-
40
- def deep_merge(other_hash, &merger)
41
- merger ||= proc do |key, oldval, newval|
42
- oldval.deep_merge(newval, &merger) rescue newval
43
- end
44
- merge(other_hash, &merger)
45
- end
46
- end
47
-
48
- module Process
49
- def self.write_pid(pid_file)
50
- if pid_file.nil?
51
- raise('a pid file path must be provided')
52
- end
53
- begin
54
- File.open(pid_file, 'w') do |file|
55
- file.write(self.pid.to_s + "\n")
56
- end
57
- rescue
58
- raise('could not write to pid file: ' + pid_file)
59
- end
60
- end
61
-
62
- def self.daemonize
63
- srand
64
- fork and exit
65
- unless session_id = self.setsid
66
- raise('cannot detach from controlling terminal')
67
- end
68
- trap 'SIGHUP', 'IGNORE'
69
- if pid = fork
70
- exit
71
- end
72
- Dir.chdir('/')
73
- ObjectSpace.each_object(IO) do |io|
74
- unless [STDIN, STDOUT, STDERR].include?(io)
75
- begin
76
- unless io.closed?
77
- io.close
78
- end
79
- rescue
80
- end
81
- end
6
+ super
82
7
  end
83
- return session_id
84
8
  end
85
9
  end
@@ -0,0 +1,57 @@
1
+ module Sensu
2
+ class Process
3
+ def initialize(options={})
4
+ @logger = Cabin::Channel.get
5
+ if options[:daemonize]
6
+ daemonize
7
+ end
8
+ if options[:pid_file]
9
+ write_pid(options[:pid_file])
10
+ end
11
+ setup_eventmachine
12
+ end
13
+
14
+ def write_pid(pid_file)
15
+ begin
16
+ File.open(pid_file, 'w') do |file|
17
+ file.puts(::Process.pid)
18
+ end
19
+ rescue
20
+ @logger.fatal('could not write to pid file', {
21
+ :pid_file => pid_file
22
+ })
23
+ exit 2
24
+ end
25
+ end
26
+
27
+ def daemonize
28
+ srand
29
+ if fork
30
+ exit
31
+ end
32
+ unless ::Process.setsid
33
+ @logger.fatal('cannot detach from controlling terminal')
34
+ exit 2
35
+ end
36
+ Signal.trap('SIGHUP', 'IGNORE')
37
+ if fork
38
+ exit
39
+ end
40
+ Dir.chdir('/')
41
+ ObjectSpace.each_object(IO) do |io|
42
+ unless [STDIN, STDOUT, STDERR].include?(io)
43
+ begin
44
+ unless io.closed?
45
+ io.close
46
+ end
47
+ rescue
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def setup_eventmachine
54
+ EM::threadpool_size = 14
55
+ end
56
+ end
57
+ end
data/lib/sensu/server.rb CHANGED
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), 'config')
1
+ require File.join(File.dirname(__FILE__), 'base')
2
2
 
3
3
  require 'redis'
4
4
 
@@ -6,17 +6,10 @@ require File.join(File.dirname(__FILE__), 'patches', 'redis')
6
6
 
7
7
  module Sensu
8
8
  class Server
9
- attr_accessor :redis, :amq, :is_master
9
+ attr_reader :redis, :amq, :is_master
10
10
 
11
11
  def self.run(options={})
12
12
  server = self.new(options)
13
- if options[:daemonize]
14
- Process.daemonize
15
- end
16
- if options[:pid_file]
17
- Process.write_pid(options[:pid_file])
18
- end
19
- EM::threadpool_size = 14
20
13
  EM::run do
21
14
  server.setup_redis
22
15
  server.setup_rabbitmq
@@ -34,116 +27,165 @@ module Sensu
34
27
  end
35
28
 
36
29
  def initialize(options={})
37
- config = Sensu::Config.new(options)
38
- @logger = config.logger
39
- @settings = config.settings
30
+ base = Sensu::Base.new(options)
31
+ @logger = base.logger
32
+ @settings = base.settings
40
33
  @timers = Array.new
41
34
  @handlers_in_progress = 0
42
35
  end
43
36
 
44
37
  def setup_redis
45
- @logger.debug('[redis] -- connecting to redis')
46
- @redis = Redis.connect(@settings.redis.to_hash.symbolize_keys)
38
+ @logger.debug('connecting to redis', {
39
+ :settings => @settings[:redis]
40
+ })
41
+ @redis = Redis.connect(@settings[:redis])
47
42
  end
48
43
 
49
44
  def setup_rabbitmq
50
- @logger.debug('[rabbitmq] -- connecting to rabbitmq')
51
- @rabbitmq = AMQP.connect(@settings.rabbitmq.to_hash.symbolize_keys)
45
+ @logger.debug('connecting to rabbitmq', {
46
+ :settings => @settings[:rabbitmq]
47
+ })
48
+ @rabbitmq = AMQP.connect(@settings[:rabbitmq])
52
49
  @amq = AMQP::Channel.new(@rabbitmq)
53
50
  end
54
51
 
55
52
  def setup_keepalives
56
- @logger.debug('[keepalive] -- setup keepalive')
53
+ @logger.debug('subscribing to keepalives')
57
54
  @keepalive_queue = @amq.queue('keepalives')
58
- @keepalive_queue.subscribe do |keepalive_json|
59
- client = Hashie::Mash.new(JSON.parse(keepalive_json))
60
- @logger.debug('[keepalive] -- received keepalive -- ' + client.name)
61
- @redis.set('client:' + client.name, keepalive_json).callback do
62
- @redis.sadd('clients', client.name)
55
+ @keepalive_queue.subscribe do |payload|
56
+ client = JSON.parse(payload, :symbolize_names => true)
57
+ @logger.debug('received keepalive', {
58
+ :client => client
59
+ })
60
+ @redis.set('client:' + client[:name], client.to_json).callback do
61
+ @redis.sadd('clients', client[:name])
63
62
  end
64
63
  end
65
64
  end
66
65
 
67
- def handle_event(event)
68
- handlers = case
69
- when event.check.key?('handler')
70
- [event.check.handler]
71
- when event.check.key?('handlers')
72
- event.check.handlers
66
+ def check_handlers(check)
67
+ handler_list = case
68
+ when check.has_key?(:handler)
69
+ [check[:handler]]
70
+ when check.has_key?(:handlers)
71
+ check[:handlers]
73
72
  else
74
73
  ['default']
75
74
  end
76
- handlers.map! do |handler|
77
- @settings.handlers[handler]['type'] == 'set' ? @settings.handlers[handler].handlers : handler
75
+ handler_list.reject! do |handler_name|
76
+ !@settings.handler_exists?(handler_name)
77
+ end
78
+ handler_list.map! do |handler_name|
79
+ if @settings[:handlers][handler_name][:type] == 'set'
80
+ @settings[:handlers][handler_name][:handlers]
81
+ else
82
+ handler_name
83
+ end
84
+ end
85
+ handler_list.flatten!
86
+ handler_list.uniq!
87
+ handler_list.reject! do |handler_name|
88
+ !@settings.handler_exists?(handler_name)
78
89
  end
79
- handlers.flatten!
80
- handlers.uniq!
90
+ handler_list.map do |handler_name|
91
+ @settings[:handlers][handler_name].merge(:name => handler_name)
92
+ end
93
+ end
94
+
95
+ def handle_event(event)
81
96
  report = proc do |output|
82
- output.split(/\n+/).each do |line|
83
- @logger.info('[handler] -- ' + line)
97
+ if output.is_a?(String)
98
+ output.split(/\n+/).each do |line|
99
+ @logger.info('handler output', {
100
+ :output => line
101
+ })
102
+ end
84
103
  end
85
104
  @handlers_in_progress -= 1
86
105
  end
106
+ handlers = check_handlers(event[:check])
87
107
  handlers.each do |handler|
88
- if @settings.handlers.key?(handler)
89
- @logger.debug('[event] -- handling event -- ' + [handler, event.client.name, event.check.name].join(' -- '))
90
- @handlers_in_progress += 1
91
- details = @settings.handlers[handler]
92
- case details['type']
93
- when 'pipe'
94
- execute = proc do
95
- Bundler.with_clean_env do
96
- begin
97
- IO.popen(details.command + ' 2>&1', 'r+') do |io|
98
- io.write(event.to_json)
99
- io.close_write
100
- io.read
101
- end
102
- rescue Errno::ENOENT => error
103
- handler + ' -- does not exist: ' + error.to_s
104
- rescue Errno::EPIPE => error
105
- handler + ' -- broken pipe: ' + error.to_s
106
- rescue => error
107
- handler + ' -- unexpected error: ' + error.to_s
108
- end
108
+ @logger.debug('handling event', {
109
+ :event => event,
110
+ :handler => handler
111
+ })
112
+ @handlers_in_progress += 1
113
+ case handler[:type]
114
+ when 'pipe'
115
+ execute = proc do
116
+ begin
117
+ IO.popen(handler[:command] + ' 2>&1', 'r+') do |io|
118
+ io.write(event.to_json)
119
+ io.close_write
120
+ io.read
109
121
  end
122
+ rescue Errno::ENOENT => error
123
+ @logger.error('handler does not exist', {
124
+ :event => event,
125
+ :handler => handler,
126
+ :error => error.to_s
127
+ })
128
+ rescue Errno::EPIPE => error
129
+ @logger.error('broken pipe', {
130
+ :event => event,
131
+ :handler => handler,
132
+ :error => error.to_s
133
+ })
134
+ rescue => error
135
+ @logger.error('unexpected error', {
136
+ :event => event,
137
+ :handler => handler,
138
+ :error => error.to_s
139
+ })
110
140
  end
111
- EM::defer(execute, report)
112
- when 'amqp'
113
- exchange = details.exchange.name
114
- exchange_type = details.exchange.key?('type') ? details.exchange['type'].to_sym : :direct
115
- exchange_options = details.exchange.reject { |key, value| %w[name type].include?(key) }
116
- @logger.debug('[event] -- publishing event to rabbitmq exchange -- ' + [exchange, event.client.name, event.check.name].join(' -- '))
117
- payload = details.send_only_check_output ? event.check.output : event.to_json
118
- unless payload.empty?
119
- @amq.method(exchange_type).call(exchange, exchange_options).publish(payload)
120
- end
121
- @handlers_in_progress -= 1
122
- when 'set'
123
- @logger.warn('[event] -- handler sets cannot be nested -- ' + handler)
124
- @handlers_in_progress -= 1
125
141
  end
126
- else
127
- @logger.warn('[event] -- unknown handler -- ' + handler)
142
+ EM::defer(execute, report)
143
+ when 'amqp'
144
+ exchange_name = handler[:exchange][:name]
145
+ exchange_type = handler[:exchange].has_key?(:type) ? handler[:exchange][:type].to_sym : :direct
146
+ exchange_options = handler[:exchange].reject do |key, value|
147
+ [:name, :type].include?(key)
148
+ end
149
+ @logger.debug('publishing event to an amqp exchange', {
150
+ :event => event,
151
+ :exchange => handler[:exchange]
152
+ })
153
+ payload = handler[:send_only_check_output] ? event[:check][:output] : event.to_json
154
+ unless payload.empty?
155
+ @amq.method(exchange_type).call(exchange_name, exchange_options).publish(payload)
156
+ end
157
+ @handlers_in_progress -= 1
158
+ when 'set'
159
+ @logger.error('handler sets cannot be nested', {
160
+ :handler => handler
161
+ })
162
+ @handlers_in_progress -= 1
128
163
  end
129
164
  end
130
165
  end
131
166
 
132
167
  def process_result(result)
133
- @logger.debug('[result] -- processing result -- ' + result.client + ' -- ' + result.check.name)
134
- @redis.get('client:' + result.client).callback do |client_json|
168
+ @logger.debug('processing result', {
169
+ :result => result
170
+ })
171
+ @redis.get('client:' + result[:client]).callback do |client_json|
135
172
  unless client_json.nil?
136
- client = Hashie::Mash.new(JSON.parse(client_json))
137
- check = @settings.checks.key?(result.check.name) ? @settings.checks[result.check.name].merge(result.check) : result.check
138
- event = Hashie::Mash.new(
173
+ client = JSON.parse(client_json, :symbolize_names => true)
174
+ check = case
175
+ when @settings.check_exists?(result[:check][:name])
176
+ @settings[:checks][result[:check][:name]].merge(result[:check])
177
+ else
178
+ result[:check]
179
+ end
180
+ event = {
139
181
  :client => client,
140
182
  :check => check,
141
183
  :occurrences => 1
142
- )
143
- history_key = 'history:' + client.name + ':' + check.name
144
- @redis.rpush(history_key, check.status).callback do
184
+ }
185
+ history_key = 'history:' + client[:name] + ':' + check[:name]
186
+ @redis.rpush(history_key, check[:status]).callback do
145
187
  @redis.lrange(history_key, -21, -1).callback do |history|
146
- event.check.history = history
188
+ event[:check][:history] = history
147
189
  total_state_change = 0
148
190
  unless history.count < 21
149
191
  state_changes = 0
@@ -159,61 +201,67 @@ module Sensu
159
201
  total_state_change = (state_changes.fdiv(20) * 100).to_i
160
202
  @redis.lpop(history_key)
161
203
  end
162
- @redis.hget('events:' + client.name, check.name).callback do |event_json|
163
- previous_occurrence = event_json ? Hashie::Mash.new(JSON.parse(event_json)) : false
204
+ @redis.hget('events:' + client[:name], check[:name]).callback do |event_json|
205
+ previous_occurrence = event_json ? JSON.parse(event_json, :symbolize_names => true) : false
164
206
  is_flapping = false
165
- if check.key?('low_flap_threshold') && check.key?('high_flap_threshold')
166
- was_flapping = previous_occurrence ? previous_occurrence.flapping : false
207
+ if check.has_key?(:low_flap_threshold) && check.has_key?(:high_flap_threshold)
208
+ was_flapping = previous_occurrence ? previous_occurrence[:flapping] : false
167
209
  is_flapping = case
168
- when total_state_change >= check.high_flap_threshold
210
+ when total_state_change >= check[:high_flap_threshold]
169
211
  true
170
- when was_flapping && total_state_change <= check.low_flap_threshold
212
+ when was_flapping && total_state_change <= check[:low_flap_threshold]
171
213
  false
172
214
  else
173
215
  was_flapping
174
216
  end
175
217
  end
176
- if check.status != 0
177
- if previous_occurrence && check.status == previous_occurrence.status
178
- event.occurrences = previous_occurrence.occurrences += 1
218
+ if check[:status] != 0
219
+ if previous_occurrence && check[:status] == previous_occurrence[:status]
220
+ event[:occurrences] = previous_occurrence[:occurrences] += 1
179
221
  end
180
- @redis.hset('events:' + client.name, check.name, {
181
- :output => check.output,
182
- :status => check.status,
183
- :issued => Time.at(check.issued).utc.iso8601,
222
+ @redis.hset('events:' + client[:name], check[:name], {
223
+ :output => check[:output],
224
+ :status => check[:status],
225
+ :issued => check[:issued],
184
226
  :flapping => is_flapping,
185
- :occurrences => event.occurrences
227
+ :occurrences => event[:occurrences]
186
228
  }.to_json).callback do
187
- unless check.handle == false
188
- event.check.flapping = is_flapping
189
- event.action = 'create'
229
+ unless check[:handle] == false
230
+ event[:check][:flapping] = is_flapping
231
+ event[:action] = 'create'
190
232
  handle_event(event)
191
233
  else
192
- @logger.debug('[result] -- handling disabled -- ' + [client.name, check.name, check.status].join(' -- '))
234
+ @logger.debug('handling disabled', {
235
+ :event => event
236
+ })
193
237
  end
194
238
  end
195
239
  elsif previous_occurrence
196
240
  unless is_flapping
197
- unless check.auto_resolve == false && !check.force_resolve
198
- @redis.hdel('events:' + client.name, check.name).callback do
199
- unless check.handle == false
200
- event.action = 'resolve'
241
+ unless check[:auto_resolve] == false && !check[:force_resolve]
242
+ @redis.hdel('events:' + client[:name], check[:name]).callback do
243
+ unless check[:handle] == false
244
+ event[:action] = 'resolve'
201
245
  handle_event(event)
202
246
  else
203
- @logger.debug('[result] -- handling disabled -- ' + [client.name, check.name, check.status].join(' -- '))
247
+ @logger.debug('handling disabled', {
248
+ :event => event
249
+ })
204
250
  end
205
251
  end
206
252
  end
207
253
  else
208
- @logger.debug('[result] -- check is flapping -- ' + [client.name, check.name, check.status].join(' -- '))
209
- @redis.hset('events:' + client.name, check.name, previous_occurrence.merge(:flapping => true).to_json).callback do
210
- if check['type'] == 'metric'
211
- event.check.flapping = is_flapping
254
+ @logger.debug('check is flapping', {
255
+ :event => event
256
+ })
257
+ @redis.hset('events:' + client[:name], check[:name], previous_occurrence.merge(:flapping => true).to_json).callback do
258
+ if check[:type] == 'metric'
259
+ event[:check][:flapping] = is_flapping
212
260
  handle_event(event)
213
261
  end
214
262
  end
215
263
  end
216
- elsif check['type'] == 'metric'
264
+ elsif check[:type] == 'metric'
217
265
  handle_event(event)
218
266
  end
219
267
  end
@@ -224,29 +272,38 @@ module Sensu
224
272
  end
225
273
 
226
274
  def setup_results
227
- @logger.debug('[result] -- setup results')
275
+ @logger.debug('subscribing to results')
228
276
  @result_queue = @amq.queue('results')
229
- @result_queue.subscribe do |result_json|
230
- result = Hashie::Mash.new(JSON.parse(result_json))
231
- @logger.info('[result] -- received result -- ' + [result.client, result.check.name, result.check.status, result.check.output.gsub(/\n/, '\n')].join(' -- '))
277
+ @result_queue.subscribe do |payload|
278
+ result = JSON.parse(payload, :symbolize_names => true)
279
+ @logger.debug('received result', {
280
+ :result => result
281
+ })
232
282
  process_result(result)
233
283
  end
234
284
  end
235
285
 
236
286
  def setup_publisher(options={})
237
- @logger.debug('[publisher] -- setup publisher')
287
+ @logger.debug('scheduling check requests')
288
+ check_count = 0
238
289
  stagger = options[:test] ? 0 : 7
239
- @settings.checks.each_with_index do |(name, details), index|
240
- check_request = Hashie::Mash.new(:name => name)
241
- unless details.publish == false || details.standalone
242
- @timers << EM::Timer.new(stagger * index) do
243
- details.subscribers.each do |exchange|
244
- interval = options[:test] ? 0.5 : details.interval
245
- @timers << EM::PeriodicTimer.new(interval) do
246
- unless @rabbitmq.reconnecting?
247
- @logger.info('[publisher] -- publishing check request -- ' + name + ' -- ' + exchange)
248
- check_request.issued = Time.now.to_i
249
- @amq.fanout(exchange).publish(check_request.to_json)
290
+ @settings.checks.each do |check|
291
+ unless check[:publish] == false || check[:standalone]
292
+ check_count += 1
293
+ @timers << EM::Timer.new(stagger * check_count) do
294
+ interval = options[:test] ? 0.5 : check[:interval]
295
+ @timers << EM::PeriodicTimer.new(interval) do
296
+ unless @rabbitmq.reconnecting?
297
+ payload = {
298
+ :name => check[:name],
299
+ :issued => Time.now.to_i
300
+ }
301
+ @logger.info('publishing check request', {
302
+ :payload => payload,
303
+ :subscribers => check[:subscribers]
304
+ })
305
+ check[:subscribers].uniq.each do |exchange_name|
306
+ @amq.fanout(exchange_name).publish(payload.to_json)
250
307
  end
251
308
  end
252
309
  end
@@ -256,39 +313,44 @@ module Sensu
256
313
  end
257
314
 
258
315
  def setup_keepalive_monitor
259
- @logger.debug('[keepalive] -- setup keepalive monitor')
316
+ @logger.debug('monitoring client keepalives')
260
317
  @timers << EM::PeriodicTimer.new(30) do
261
- @logger.debug('[keepalive] -- checking for stale clients')
318
+ @logger.debug('checking for stale client info')
262
319
  @redis.smembers('clients').callback do |clients|
263
- clients.each do |client_id|
264
- @redis.get('client:' + client_id).callback do |client_json|
265
- client = Hashie::Mash.new(JSON.parse(client_json))
266
- time_since_last_keepalive = Time.now.to_i - client.timestamp
267
- result = Hashie::Mash.new(
268
- :client => client.name,
269
- :check => {
270
- :name => 'keepalive',
271
- :issued => Time.now.to_i
272
- }
273
- )
320
+ clients.each do |client_name|
321
+ @redis.get('client:' + client_name).callback do |client_json|
322
+ client = JSON.parse(client_json, :symbolize_names => true)
323
+ time_since_last_keepalive = Time.now.to_i - client[:timestamp]
324
+ check = Hash.new
274
325
  case
275
326
  when time_since_last_keepalive >= 180
276
- result.check.output = 'No keep-alive sent from host in over 180 seconds'
277
- result.check.status = 2
278
- @amq.queue('results').publish(result.to_json)
327
+ check[:output] = 'No keep-alive sent from host in over 180 seconds'
328
+ check[:status] = 2
279
329
  when time_since_last_keepalive >= 120
280
- result.check.output = 'No keep-alive sent from host in over 120 seconds'
281
- result.check.status = 1
282
- @amq.queue('results').publish(result.to_json)
330
+ check[:output] = 'No keep-alive sent from host in over 120 seconds'
331
+ check[:status] = 1
283
332
  else
284
- @redis.hexists('events:' + client_id, 'keepalive').callback do |exists|
333
+ @redis.hexists('events:' + client[:name], 'keepalive').callback do |exists|
285
334
  if exists
286
- result.check.output = 'Keep-alive sent from host'
287
- result.check.status = 0
288
- @amq.queue('results').publish(result.to_json)
335
+ check[:output] = 'Keep-alive sent from host'
336
+ check[:status] = 0
289
337
  end
290
338
  end
291
339
  end
340
+ unless check.empty?
341
+ check.merge(
342
+ :name => 'keepalive',
343
+ :issued => Time.now.to_i
344
+ )
345
+ payload = {
346
+ :client => client[:name],
347
+ :check => check
348
+ }
349
+ @logger.info('publishing check result', {
350
+ :payload => payload
351
+ })
352
+ @amq.queue('results').publish(payload.to_json)
353
+ end
292
354
  end
293
355
  end
294
356
  end
@@ -304,16 +366,16 @@ module Sensu
304
366
  @is_master ||= false
305
367
  @redis.setnx('lock:master', Time.now.to_i).callback do |created|
306
368
  if created
307
- @logger.info('[master] -- i am the master')
308
369
  @is_master = true
370
+ @logger.info('i am the master')
309
371
  master_duties
310
372
  else
311
373
  @redis.get('lock:master') do |timestamp|
312
374
  if Time.now.to_i - timestamp.to_i >= 60
313
375
  @redis.getset('lock:master', Time.now.to_i).callback do |previous|
314
376
  if previous == timestamp
315
- @logger.info('[master] -- i am now the master')
316
377
  @is_master = true
378
+ @logger.info('i am now the master')
317
379
  master_duties
318
380
  end
319
381
  end
@@ -326,13 +388,13 @@ module Sensu
326
388
  def resign_as_master(&block)
327
389
  if @is_master
328
390
  @redis.del('lock:master').callback do
329
- @logger.warn('[master] -- resigned as master')
391
+ @logger.warn('resigned as master')
330
392
  if block
331
393
  block.call
332
394
  end
333
395
  end
334
396
  else
335
- @logger.warn('[master] -- not currently master')
397
+ @logger.warn('not currently master')
336
398
  if block
337
399
  block.call
338
400
  end
@@ -343,9 +405,8 @@ module Sensu
343
405
  request_master_election
344
406
  @timers << EM::PeriodicTimer.new(20) do
345
407
  if @is_master
346
- timestamp = Time.now.to_i
347
- @redis.set('lock:master', timestamp).callback do
348
- @logger.debug('[master] -- updated master lock timestamp -- ' + timestamp.to_s)
408
+ @redis.set('lock:master', Time.now.to_i).callback do
409
+ @logger.debug('updated master lock timestamp')
349
410
  end
350
411
  else
351
412
  request_master_election
@@ -354,17 +415,17 @@ module Sensu
354
415
  end
355
416
 
356
417
  def setup_rabbitmq_monitor
357
- @logger.debug('[monitor] -- setup rabbitmq monitor')
418
+ @logger.debug('monitoring rabbitmq connection')
358
419
  @timers << EM::PeriodicTimer.new(5) do
359
420
  if @rabbitmq.reconnecting?
360
- @logger.warn('[monitor] -- reconnecting to rabbitmq')
421
+ @logger.warn('reconnecting to rabbitmq')
361
422
  else
362
423
  unless @keepalive_queue.subscribed?
363
- @logger.warn('[monitor] -- re-subscribing to keepalives')
424
+ @logger.warn('re-subscribing to keepalives')
364
425
  setup_keepalives
365
426
  end
366
427
  unless @result_queue.subscribed?
367
- @logger.warn('[monitor] -- re-subscribing to results')
428
+ @logger.warn('re-subscribing to results')
368
429
  setup_results
369
430
  end
370
431
  end
@@ -372,14 +433,16 @@ module Sensu
372
433
  end
373
434
 
374
435
  def stop_reactor
375
- @logger.info('[stop] -- completing handlers in progress')
436
+ @logger.info('completing handlers in progress', {
437
+ :handlers_in_progress => @handlers_in_progress
438
+ })
376
439
  complete_in_progress = EM::tick_loop do
377
440
  if @handlers_in_progress == 0
378
441
  :stop
379
442
  end
380
443
  end
381
444
  complete_in_progress.on_stop do
382
- @logger.warn('[stop] -- stopping reactor')
445
+ @logger.warn('stopping reactor')
383
446
  EM::PeriodicTimer.new(0.25) do
384
447
  EM::stop_event_loop
385
448
  end
@@ -387,14 +450,17 @@ module Sensu
387
450
  end
388
451
 
389
452
  def stop(signal)
390
- @logger.warn('[stop] -- stopping sensu server -- ' + signal)
453
+ @logger.warn('received signal', {
454
+ :signal => signal
455
+ })
456
+ @logger.warn('stopping')
391
457
  @timers.each do |timer|
392
458
  timer.cancel
393
459
  end
394
460
  unless @rabbitmq.reconnecting?
395
- @logger.warn('[stop] -- unsubscribing from keepalives')
461
+ @logger.warn('unsubscribing from keepalives')
396
462
  @keepalive_queue.unsubscribe do
397
- @logger.warn('[stop] -- unsubscribing from results')
463
+ @logger.warn('unsubscribing from results')
398
464
  @result_queue.unsubscribe do
399
465
  resign_as_master do
400
466
  stop_reactor