sensu 0.22.2 → 0.23.0.beta

Sign up to get free protection for your applications and to get access to all the features.
@@ -51,7 +51,7 @@ module Sensu
51
51
  def publish_keepalive
52
52
  payload = keepalive_payload
53
53
  @logger.debug("publishing keepalive", :payload => payload)
54
- @transport.publish(:direct, "keepalives", MultiJson.dump(payload)) do |info|
54
+ @transport.publish(:direct, "keepalives", Sensu::JSON.dump(payload)) do |info|
55
55
  if info[:error]
56
56
  @logger.error("failed to publish keepalive", {
57
57
  :payload => payload,
@@ -89,7 +89,7 @@ module Sensu
89
89
  }
90
90
  payload[:signature] = @settings[:client][:signature] if @settings[:client][:signature]
91
91
  @logger.info("publishing check result", :payload => payload)
92
- @transport.publish(:direct, "results", MultiJson.dump(payload)) do |info|
92
+ @transport.publish(:direct, "results", Sensu::JSON.dump(payload)) do |info|
93
93
  if info[:error]
94
94
  @logger.error("failed to publish check result", {
95
95
  :payload => payload,
@@ -99,42 +99,6 @@ module Sensu
99
99
  end
100
100
  end
101
101
 
102
- # Traverse the Sensu client definition (hash) for an attribute
103
- # value, with a fallback default value if nil.
104
- #
105
- # @param tree [Hash] to traverse.
106
- # @param path [Array] of attribute keys.
107
- # @param default [Object] value if attribute value is nil.
108
- # @return [Object] attribute or fallback default value.
109
- def find_client_attribute(tree, path, default)
110
- attribute = tree[path.shift]
111
- if attribute.is_a?(Hash)
112
- find_client_attribute(attribute, path, default)
113
- else
114
- attribute.nil? ? default : attribute
115
- end
116
- end
117
-
118
- # Substitue check command tokens (eg. :::db.name|production:::)
119
- # with the associated client definition attribute value. Command
120
- # tokens can provide a fallback default value, following a pipe.
121
- #
122
- # @param check [Hash]
123
- # @return [Array] containing the check command string with
124
- # tokens substituted and an array of unmatched command tokens.
125
- def substitute_check_command_tokens(check)
126
- unmatched_tokens = []
127
- substituted = check[:command].gsub(/:::([^:].*?):::/) do
128
- token, default = $1.to_s.split("|", -1)
129
- matched = find_client_attribute(@settings[:client], token.split("."), default)
130
- if matched.nil?
131
- unmatched_tokens << token
132
- end
133
- matched
134
- end
135
- [substituted, unmatched_tokens]
136
- end
137
-
138
102
  # Execute a check command, capturing its output (STDOUT/ERR),
139
103
  # exit status code, execution duration, timestamp, and publish
140
104
  # the result. This method guards against multiple executions for
@@ -149,7 +113,7 @@ module Sensu
149
113
  @logger.debug("attempting to execute check command", :check => check)
150
114
  unless @checks_in_progress.include?(check[:name])
151
115
  @checks_in_progress << check[:name]
152
- command, unmatched_tokens = substitute_check_command_tokens(check)
116
+ command, unmatched_tokens = substitute_tokens(check[:command], @settings[:client])
153
117
  if unmatched_tokens.empty?
154
118
  check[:executed] = Time.now.to_i
155
119
  started = Time.now.to_f
@@ -273,10 +237,10 @@ module Sensu
273
237
  options = transport_subscribe_options(subscription)
274
238
  @transport.subscribe(*options) do |message_info, message|
275
239
  begin
276
- check = MultiJson.load(message)
240
+ check = Sensu::JSON.load(message)
277
241
  @logger.info("received check request", :check => check)
278
242
  process_check_request(check)
279
- rescue MultiJson::ParseError => error
243
+ rescue Sensu::JSON::ParseError => error
280
244
  @logger.error("failed to parse the check request payload", {
281
245
  :message => message,
282
246
  :error => error.to_s
@@ -412,9 +376,10 @@ module Sensu
412
376
  # transport connection, the sockets, and calling the
413
377
  # `bootstrap()` method.
414
378
  def start
415
- setup_transport
416
- setup_sockets
417
- bootstrap
379
+ setup_transport do
380
+ setup_sockets
381
+ bootstrap
382
+ end
418
383
  end
419
384
 
420
385
  # Pause the Sensu client process, unless it is being paused or
@@ -1,4 +1,4 @@
1
- require "multi_json"
1
+ require "sensu/json"
2
2
 
3
3
  module Sensu
4
4
  module Client
@@ -145,7 +145,7 @@ module Sensu
145
145
  :check => check.merge(:issued => Time.now.to_i)
146
146
  }
147
147
  @logger.info("publishing check result", :payload => payload)
148
- @transport.publish(:direct, "results", MultiJson.dump(payload))
148
+ @transport.publish(:direct, "results", Sensu::JSON.dump(payload))
149
149
  end
150
150
 
151
151
  # Process a check result. Set check result attribute defaults,
@@ -169,10 +169,10 @@ module Sensu
169
169
  # @param [String] data to parse for a check result.
170
170
  def parse_check_result(data)
171
171
  begin
172
- check = MultiJson.load(data)
172
+ check = Sensu::JSON.load(data)
173
173
  cancel_watchdog
174
174
  process_check_result(check)
175
- rescue MultiJson::ParseError, ArgumentError => error
175
+ rescue Sensu::JSON::ParseError, ArgumentError => error
176
176
  if @protocol == :tcp
177
177
  @parse_error = error.to_s
178
178
  else
@@ -1,7 +1,7 @@
1
1
  module Sensu
2
2
  unless defined?(Sensu::VERSION)
3
3
  # Sensu release version.
4
- VERSION = "0.22.2".freeze
4
+ VERSION = "0.23.0.beta".freeze
5
5
 
6
6
  # Sensu check severities.
7
7
  SEVERITIES = %w[ok warning critical unknown].freeze
data/lib/sensu/daemon.rb CHANGED
@@ -1,31 +1,30 @@
1
1
  require "rubygems"
2
2
 
3
- gem "multi_json", "1.11.2"
4
- gem "eventmachine", "1.0.9.1"
3
+ gem "eventmachine", "1.2.0.1"
5
4
 
6
- gem "sensu-logger", "1.1.0"
7
- gem "sensu-settings", "3.3.0"
5
+ gem "sensu-json", "1.1.0"
6
+ gem "sensu-logger", "1.2.0"
7
+ gem "sensu-settings", "3.4.0"
8
8
  gem "sensu-extension", "1.5.0"
9
- gem "sensu-extensions", "1.4.0"
10
- gem "sensu-transport", "4.0.0"
9
+ gem "sensu-extensions", "1.5.0"
10
+ gem "sensu-transport", "5.0.0"
11
11
  gem "sensu-spawn", "1.8.0"
12
+ gem "sensu-redis", "1.2.0"
12
13
 
13
14
  require "time"
14
15
  require "uri"
15
16
 
17
+ require "sensu/json"
16
18
  require "sensu/logger"
17
19
  require "sensu/settings"
18
20
  require "sensu/extensions"
19
21
  require "sensu/transport"
20
22
  require "sensu/spawn"
23
+ require "sensu/redis"
21
24
 
22
25
  require "sensu/constants"
23
26
  require "sensu/utilities"
24
27
  require "sensu/cli"
25
- require "sensu/redis"
26
-
27
- # Symbolize hash keys when parsing JSON.
28
- MultiJson.load_options = {:symbolize_keys => true}
29
28
 
30
29
  module Sensu
31
30
  module Daemon
@@ -73,10 +72,26 @@ module Sensu
73
72
  end
74
73
  end
75
74
 
75
+ # Print the Sensu settings and immediately exit the process. This
76
+ # method is used while troubleshooting configuration issues,
77
+ # triggered by a CLI argument, e.g. `--print_config`. Sensu
78
+ # settings with sensitive values (e.g. passwords) are first
79
+ # redacted.
80
+ #
81
+ # @param settings [Object]
82
+ def print_settings(settings)
83
+ redacted_settings = redact_sensitive(settings.to_hash)
84
+ @logger.warn("outputting compiled configuration and exiting")
85
+ puts Sensu::JSON.dump(redacted_settings, :pretty => true)
86
+ exit
87
+ end
88
+
76
89
  # Load Sensu settings and validate them. If there are validation
77
90
  # failures, log them (concerns), then cause the Sensu process to
78
91
  # exit (2). This method creates the settings instance variable:
79
- # `@settings`.
92
+ # `@settings`. If the `print_config` option is true, this method
93
+ # calls `print_settings()` to output the compiled configuration
94
+ # settings and then exit the process.
80
95
  #
81
96
  # https://github.com/sensu/sensu-settings
82
97
  #
@@ -91,6 +106,7 @@ module Sensu
91
106
  @logger.fatal("SENSU NOT RUNNING!")
92
107
  exit 2
93
108
  end
109
+ print_settings(@settings) if options[:print_config]
94
110
  end
95
111
 
96
112
  # Load Sensu extensions and log any concerns. Set the logger and
@@ -176,6 +192,9 @@ module Sensu
176
192
  # method creates the transport instance variable: `@transport`.
177
193
  #
178
194
  # https://github.com/sensu/sensu-transport
195
+ #
196
+ # @yield [Object] passes initialized and connected Transport
197
+ # connection object to the callback/block.
179
198
  def setup_transport
180
199
  transport_name = @settings[:transport][:name]
181
200
  transport_settings = @settings[transport_name]
@@ -184,24 +203,27 @@ module Sensu
184
203
  :settings => transport_settings
185
204
  })
186
205
  Transport.logger = @logger
187
- @transport = Transport.connect(transport_name, transport_settings)
188
- @transport.on_error do |error|
189
- @logger.fatal("transport connection error", :error => error.to_s)
190
- if @settings[:transport][:reconnect_on_error]
191
- @transport.reconnect
192
- else
193
- stop
206
+ Transport.connect(transport_name, transport_settings) do |connection|
207
+ @transport = connection
208
+ @transport.on_error do |error|
209
+ @logger.error("transport connection error", :error => error.to_s)
210
+ if @settings[:transport][:reconnect_on_error]
211
+ @transport.reconnect
212
+ else
213
+ stop
214
+ end
194
215
  end
195
- end
196
- @transport.before_reconnect do
197
- unless testing?
198
- @logger.warn("reconnecting to transport")
199
- pause
216
+ @transport.before_reconnect do
217
+ unless testing?
218
+ @logger.warn("reconnecting to transport")
219
+ pause
220
+ end
200
221
  end
201
- end
202
- @transport.after_reconnect do
203
- @logger.info("reconnected to transport")
204
- resume
222
+ @transport.after_reconnect do
223
+ @logger.info("reconnected to transport")
224
+ resume
225
+ end
226
+ yield(@transport)
205
227
  end
206
228
  end
207
229
 
@@ -210,22 +232,29 @@ module Sensu
210
232
  # service will stop gracefully in the event of a Redis error, and
211
233
  # pause/resume in the event of connectivity issues. This method
212
234
  # creates the Redis instance variable: `@redis`.
235
+ #
236
+ # https://github.com/sensu/sensu-redis
237
+ #
238
+ # @yield [Object] passes initialized and connected Redis
239
+ # connection object to the callback/block.
213
240
  def setup_redis
214
241
  @logger.debug("connecting to redis", :settings => @settings[:redis])
215
- @redis = Redis.connect(@settings[:redis])
216
- @redis.on_error do |error|
217
- @logger.fatal("redis connection error", :error => error.to_s)
218
- stop
219
- end
220
- @redis.before_reconnect do
221
- unless testing?
222
- @logger.warn("reconnecting to redis")
223
- pause
242
+ Redis.connect(@settings[:redis]) do |connection|
243
+ @redis = connection
244
+ @redis.on_error do |error|
245
+ @logger.error("redis connection error", :error => error.to_s)
224
246
  end
225
- end
226
- @redis.after_reconnect do
227
- @logger.info("reconnected to redis")
228
- resume
247
+ @redis.before_reconnect do
248
+ unless testing?
249
+ @logger.warn("reconnecting to redis")
250
+ pause
251
+ end
252
+ end
253
+ @redis.after_reconnect do
254
+ @logger.info("reconnected to redis")
255
+ resume
256
+ end
257
+ yield(@redis)
229
258
  end
230
259
  end
231
260
 
@@ -3,6 +3,8 @@ require "sensu/server/sandbox"
3
3
  module Sensu
4
4
  module Server
5
5
  module Filter
6
+ EVAL_PREFIX = "eval:".freeze
7
+
6
8
  # Determine if a period of time (window) is subdued. The
7
9
  # provided condition must have a `:begin` and `:end` time, eg.
8
10
  # "11:30:00 PM", or `false` will be returned.
@@ -165,28 +167,63 @@ module Sensu
165
167
  end
166
168
  end
167
169
 
168
- # Ruby eval() a string containing an expression, within the
170
+ # Process a filter eval attribute, a Ruby `eval()` string
171
+ # containing an expression to be evaluated within the
172
+ # scope/context of a sandbox. This methods strips away the
173
+ # expression prefix, `eval:`, and substitues any dot notation
174
+ # tokens with the corresponding event data values. If there are
175
+ # unmatched tokens, this method will return `nil`.
176
+ #
177
+ # @event [Hash]
178
+ # @raw_eval_string [String]
179
+ # @return [String] processed eval string.
180
+ def process_eval_string(event, raw_eval_string)
181
+ eval_string = raw_eval_string.slice(5..-1)
182
+ eval_string, unmatched_tokens = substitute_tokens(eval_string, event)
183
+ if unmatched_tokens.empty?
184
+ eval_string
185
+ else
186
+ @logger.error("filter eval unmatched tokens", {
187
+ :raw_eval_string => raw_eval_string,
188
+ :unmatched_tokens => unmatched_tokens,
189
+ :event => event
190
+ })
191
+ nil
192
+ end
193
+ end
194
+
195
+ # Ruby `eval()` a string containing an expression, within the
169
196
  # scope/context of a sandbox. This method is for filter
170
197
  # attribute values starting with "eval:", with the Ruby
171
198
  # expression following the colon. A single variable is provided
172
199
  # to the expression, `value`, equal to the corresponding event
173
- # attribute value. The expression is expected to return a
174
- # boolean value.
200
+ # attribute value. Dot notation tokens in the expression, e.g.
201
+ # `:::mysql.user:::`, are substituted with the corresponding
202
+ # event data values prior to evaluation. The expression is
203
+ # expected to return a boolean value.
175
204
  #
205
+ # @param event [Hash]
176
206
  # @param raw_eval_string [String] containing the Ruby
177
207
  # expression to be evaluated.
178
- # @param value [Object] of the corresponding event attribute.
208
+ # @param raw_value [Object] of the corresponding event
209
+ # attribute value.
179
210
  # @return [TrueClass, FalseClass]
180
- def eval_attribute_value(raw_eval_string, value)
181
- begin
182
- eval_string = raw_eval_string.gsub(/\Aeval:(\s+)?/, "")
183
- !!Sandbox.eval(eval_string, value)
184
- rescue => error
185
- @logger.error("filter attribute eval error", {
186
- :raw_eval_string => raw_eval_string,
187
- :value => value,
188
- :error => error.to_s
189
- })
211
+ def eval_attribute_value(event, raw_eval_string, raw_value)
212
+ eval_string = process_eval_string(event, raw_eval_string)
213
+ unless eval_string.nil?
214
+ begin
215
+ value = Marshal.load(Marshal.dump(raw_value))
216
+ !!Sandbox.eval(eval_string, value)
217
+ rescue => error
218
+ @logger.error("filter attribute eval error", {
219
+ :event => event,
220
+ :raw_eval_string => raw_eval_string,
221
+ :raw_value => raw_value,
222
+ :error => error.to_s
223
+ })
224
+ false
225
+ end
226
+ else
190
227
  false
191
228
  end
192
229
  end
@@ -197,21 +234,23 @@ module Sensu
197
234
  # key/value pairs (recursive), have equal string values, or
198
235
  # evaluate to true (Ruby eval).
199
236
  #
200
- # @param hash_one [Hash]
201
- # @param hash_two [Hash]
237
+ # @param event [Hash]
238
+ # @param filter_attributes [Object]
239
+ # @param event_attributes [Object]
202
240
  # @return [TrueClass, FalseClass]
203
- def filter_attributes_match?(hash_one, hash_two)
204
- hash_one.all? do |key, value_one|
205
- value_two = hash_two[key]
241
+ def filter_attributes_match?(event, filter_attributes, event_attributes=nil)
242
+ event_attributes ||= event
243
+ filter_attributes.all? do |key, value_one|
244
+ value_two = event_attributes[key]
206
245
  case
207
246
  when value_one == value_two
208
247
  true
209
248
  when value_one.is_a?(Hash) && value_two.is_a?(Hash)
210
- filter_attributes_match?(value_one, value_two)
211
- when hash_one[key].to_s == hash_two[key].to_s
249
+ filter_attributes_match?(event, value_one, value_two)
250
+ when value_one.to_s == value_two.to_s
212
251
  true
213
- when value_one.is_a?(String) && value_one.start_with?("eval:")
214
- eval_attribute_value(value_one, value_two)
252
+ when value_one.is_a?(String) && value_one.start_with?(EVAL_PREFIX)
253
+ eval_attribute_value(event, value_one, value_two)
215
254
  else
216
255
  false
217
256
  end
@@ -236,7 +275,7 @@ module Sensu
236
275
  case
237
276
  when @settings.filter_exists?(filter_name)
238
277
  filter = @settings[:filters][filter_name]
239
- matched = filter_attributes_match?(filter[:attributes], event)
278
+ matched = filter_attributes_match?(event, filter[:attributes])
240
279
  yield(filter[:negate] ? matched : !matched)
241
280
  when @extensions.filter_exists?(filter_name)
242
281
  extension = @extensions[:filters][filter_name]
@@ -40,7 +40,7 @@ module Sensu
40
40
  # @param callback [Proc] to call when the mutator executes
41
41
  # successfully.
42
42
  def pipe_mutator(mutator, event, &callback)
43
- options = {:data => MultiJson.dump(event), :timeout => mutator[:timeout]}
43
+ options = {:data => Sensu::JSON.dump(event), :timeout => mutator[:timeout]}
44
44
  block = mutator_callback(mutator, event, &callback)
45
45
  Spawn.process(mutator[:command], options, &block)
46
46
  end
@@ -43,6 +43,20 @@ module Sensu
43
43
  @handling_event_count = 0
44
44
  end
45
45
 
46
+ # Set up the Redis and Transport connection objects, `@redis`
47
+ # and `@transport`. This method "drys" up many instances of
48
+ # `setup_redis()` and `setup_transport()`.
49
+ #
50
+ # @yield callback/block called after connecting to Redis and the
51
+ # Sensu Transport.
52
+ def setup_connections
53
+ setup_redis do
54
+ setup_transport do
55
+ yield
56
+ end
57
+ end
58
+ end
59
+
46
60
  # Create a registration check definition for a client. Client
47
61
  # definitions may contain `:registration` configuration,
48
62
  # containing custom attributes and handler information. By
@@ -127,10 +141,11 @@ module Sensu
127
141
  @redis.set(signature_key, client[:signature])
128
142
  end
129
143
  if signature.nil? || signature.empty? || (client[:signature] == signature)
130
- @redis.set(client_key, MultiJson.dump(client)) do
131
- @redis.sadd("clients", client[:name]) do
132
- yield(true) if block_given?
133
- end
144
+ @redis.multi
145
+ @redis.set(client_key, Sensu::JSON.dump(client))
146
+ @redis.sadd("clients", client[:name])
147
+ @redis.exec do
148
+ yield(true) if block_given?
134
149
  end
135
150
  else
136
151
  @logger.warn("invalid client signature", {
@@ -156,11 +171,11 @@ module Sensu
156
171
  @transport.subscribe(:direct, "keepalives", "keepalives", :ack => true) do |message_info, message|
157
172
  @logger.debug("received keepalive", :message => message)
158
173
  begin
159
- client = MultiJson.load(message)
174
+ client = Sensu::JSON.load(message)
160
175
  update_client_registry(client) do
161
176
  @transport.ack(message_info)
162
177
  end
163
- rescue MultiJson::ParseError => error
178
+ rescue Sensu::JSON::ParseError => error
164
179
  @logger.error("failed to parse keepalive payload", {
165
180
  :message => message,
166
181
  :error => error.to_s
@@ -273,20 +288,18 @@ module Sensu
273
288
  :check => check
274
289
  })
275
290
  result_set = "#{check[:name]}:#{check[:issued]}"
276
- result_data = MultiJson.dump(:output => check[:output], :status => check[:status])
277
- @redis.hset("aggregation:#{result_set}", client[:name], result_data) do
278
- SEVERITIES.each do |severity|
279
- @redis.hsetnx("aggregate:#{result_set}", severity, 0)
280
- end
281
- severity = (SEVERITIES[check[:status]] || "unknown")
282
- @redis.hincrby("aggregate:#{result_set}", severity, 1) do
283
- @redis.hincrby("aggregate:#{result_set}", "total", 1) do
284
- @redis.sadd("aggregates:#{check[:name]}", check[:issued]) do
285
- @redis.sadd("aggregates", check[:name])
286
- end
287
- end
288
- end
291
+ result_data = Sensu::JSON.dump(:output => check[:output], :status => check[:status])
292
+ @redis.multi
293
+ @redis.hset("aggregation:#{result_set}", client[:name], result_data)
294
+ SEVERITIES.each do |severity|
295
+ @redis.hsetnx("aggregate:#{result_set}", severity, 0)
289
296
  end
297
+ severity = (SEVERITIES[check[:status]] || "unknown")
298
+ @redis.hincrby("aggregate:#{result_set}", severity, 1)
299
+ @redis.hincrby("aggregate:#{result_set}", "total", 1)
300
+ @redis.sadd("aggregates:#{check[:name]}", check[:issued])
301
+ @redis.sadd("aggregates", check[:name])
302
+ @redis.exec
290
303
  end
291
304
 
292
305
  # Truncate check output. For metric checks, (`"type":
@@ -301,7 +314,7 @@ module Sensu
301
314
  when METRIC_CHECK_TYPE
302
315
  output_lines = check[:output].split("\n")
303
316
  output = output_lines.first || check[:output]
304
- if output_lines.size > 1 || output.length > 255
317
+ if output_lines.length > 1 || output.length > 255
305
318
  output = output[0..255] + "\n..."
306
319
  end
307
320
  check.merge(:output => output)
@@ -323,15 +336,16 @@ module Sensu
323
336
  # stored (history, etc).
324
337
  def store_check_result(client, check)
325
338
  @logger.debug("storing check result", :check => check)
326
- @redis.sadd("result:#{client[:name]}", check[:name])
327
339
  result_key = "#{client[:name]}:#{check[:name]}"
340
+ history_key = "history:#{result_key}"
328
341
  check_truncated = truncate_check_output(check)
329
- @redis.set("result:#{result_key}", MultiJson.dump(check_truncated)) do
330
- history_key = "history:#{result_key}"
331
- @redis.rpush(history_key, check[:status]) do
332
- @redis.ltrim(history_key, -21, -1)
333
- yield
334
- end
342
+ @redis.multi
343
+ @redis.sadd("result:#{client[:name]}", check[:name])
344
+ @redis.set("result:#{result_key}", Sensu::JSON.dump(check_truncated))
345
+ @redis.rpush(history_key, check[:status])
346
+ @redis.ltrim(history_key, -21, -1)
347
+ @redis.exec do
348
+ yield
335
349
  end
336
350
  end
337
351
 
@@ -355,7 +369,7 @@ module Sensu
355
369
  history_key = "history:#{client[:name]}:#{check[:name]}"
356
370
  @redis.lrange(history_key, -21, -1) do |history|
357
371
  total_state_change = 0
358
- unless history.size < 21
372
+ unless history.length < 21
359
373
  state_changes = 0
360
374
  change_weight = 0.8
361
375
  previous_status = history.first
@@ -427,7 +441,7 @@ module Sensu
427
441
  # @yieldparam event [Hash]
428
442
  def update_event_registry(client, check)
429
443
  @redis.hget("events:#{client[:name]}", check[:name]) do |event_json|
430
- stored_event = event_json ? MultiJson.load(event_json) : nil
444
+ stored_event = event_json ? Sensu::JSON.load(event_json) : nil
431
445
  flapping = check_flapping?(stored_event, check)
432
446
  event = {
433
447
  :id => random_uuid,
@@ -441,7 +455,7 @@ module Sensu
441
455
  if stored_event && check[:status] == stored_event[:check][:status]
442
456
  event[:occurrences] = stored_event[:occurrences] + 1
443
457
  end
444
- @redis.hset("events:#{client[:name]}", check[:name], MultiJson.dump(event)) do
458
+ @redis.hset("events:#{client[:name]}", check[:name], Sensu::JSON.dump(event)) do
445
459
  yield(event)
446
460
  end
447
461
  elsif stored_event
@@ -498,7 +512,7 @@ module Sensu
498
512
  client_key = result[:check][:source] || result[:client]
499
513
  @redis.get("client:#{client_key}") do |client_json|
500
514
  unless client_json.nil?
501
- client = MultiJson.load(client_json)
515
+ client = Sensu::JSON.load(client_json)
502
516
  if client[:signature]
503
517
  if client[:signature] == result[:signature]
504
518
  yield(client)
@@ -563,10 +577,10 @@ module Sensu
563
577
  @logger.debug("subscribing to results")
564
578
  @transport.subscribe(:direct, "results", "results", :ack => true) do |message_info, message|
565
579
  begin
566
- result = MultiJson.load(message)
580
+ result = Sensu::JSON.load(message)
567
581
  @logger.debug("received result", :result => result)
568
582
  process_check_result(result)
569
- rescue MultiJson::ParseError => error
583
+ rescue Sensu::JSON::ParseError => error
570
584
  @logger.error("failed to parse result payload", {
571
585
  :message => message,
572
586
  :error => error.to_s
@@ -620,7 +634,7 @@ module Sensu
620
634
  :subscribers => check[:subscribers]
621
635
  })
622
636
  check[:subscribers].each do |subscription|
623
- options = transport_publish_options(subscription, MultiJson.dump(payload))
637
+ options = transport_publish_options(subscription, Sensu::JSON.dump(payload))
624
638
  @transport.publish(*options) do |info|
625
639
  if info[:error]
626
640
  @logger.error("failed to publish check request", {
@@ -704,7 +718,7 @@ module Sensu
704
718
  @redis.get("client:#{client_name}:signature") do |signature|
705
719
  payload[:signature] = signature if signature
706
720
  @logger.debug("publishing check result", :payload => payload)
707
- @transport.publish(:direct, "results", MultiJson.dump(payload)) do |info|
721
+ @transport.publish(:direct, "results", Sensu::JSON.dump(payload)) do |info|
708
722
  if info[:error]
709
723
  @logger.error("failed to publish check result", {
710
724
  :payload => payload,
@@ -758,7 +772,7 @@ module Sensu
758
772
  clients.each do |client_name|
759
773
  @redis.get("client:#{client_name}") do |client_json|
760
774
  unless client_json.nil?
761
- client = MultiJson.load(client_json)
775
+ client = Sensu::JSON.load(client_json)
762
776
  next if client[:keepalives] == false
763
777
  check = create_keepalive_check(client)
764
778
  time_since_last_keepalive = Time.now.to_i - client[:timestamp]
@@ -810,7 +824,7 @@ module Sensu
810
824
  result_key = "#{client_name}:#{check_name}"
811
825
  @redis.get("result:#{result_key}") do |result_json|
812
826
  unless result_json.nil?
813
- check = MultiJson.load(result_json)
827
+ check = Sensu::JSON.load(result_json)
814
828
  next unless check[:ttl] && check[:executed] && !check[:force_resolve]
815
829
  time_since_last_execution = Time.now.to_i - check[:executed]
816
830
  if time_since_last_execution >= check[:ttl]
@@ -845,21 +859,21 @@ module Sensu
845
859
  @redis.smembers("aggregates") do |checks|
846
860
  checks.each do |check_name|
847
861
  @redis.smembers("aggregates:#{check_name}") do |aggregates|
848
- if aggregates.size > 20
862
+ if aggregates.length > 20
849
863
  aggregates.sort!
850
- aggregates.take(aggregates.size - 20).each do |check_issued|
851
- @redis.srem("aggregates:#{check_name}", check_issued) do
852
- result_set = "#{check_name}:#{check_issued}"
853
- @redis.del("aggregate:#{result_set}") do
854
- @redis.del("aggregation:#{result_set}") do
855
- @logger.debug("pruned aggregation", {
856
- :check => {
857
- :name => check_name,
858
- :issued => check_issued
859
- }
860
- })
861
- end
862
- end
864
+ aggregates.take(aggregates.length - 20).each do |check_issued|
865
+ result_set = "#{check_name}:#{check_issued}"
866
+ @redis.multi
867
+ @redis.srem("aggregates:#{check_name}", check_issued)
868
+ @redis.del("aggregate:#{result_set}")
869
+ @redis.del("aggregation:#{result_set}")
870
+ @redis.exec do
871
+ @logger.debug("pruned aggregation", {
872
+ :check => {
873
+ :name => check_name,
874
+ :issued => check_issued
875
+ }
876
+ })
863
877
  end
864
878
  end
865
879
  end
@@ -1059,9 +1073,9 @@ module Sensu
1059
1073
  # Start the Sensu server process, connecting to Redis, the
1060
1074
  # transport, and calling the `bootstrap()` method.
1061
1075
  def start
1062
- setup_redis
1063
- setup_transport
1064
- bootstrap
1076
+ setup_connections do
1077
+ bootstrap
1078
+ end
1065
1079
  end
1066
1080
 
1067
1081
  # Pause the Sensu server process, unless it is being paused or