sensu 0.22.0 → 0.22.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cc83c24129d23bc39b4f06d48b7cdba8abf0f851
4
- data.tar.gz: 6aca4babe99fb2e63e610204532322af7714f726
3
+ metadata.gz: b102b675b0083c791f9b5bc753abac27d792d235
4
+ data.tar.gz: 6c15808db765bcb0e9afd3d772254ff1679109ef
5
5
  SHA512:
6
- metadata.gz: dae436f84c219b052231da1d79be00a829f312c823020fa9e6c535555c1995ed69fec6c051da467ec3f7a8633333f1365b068e13f68da007d82f34e56a43af93
7
- data.tar.gz: a164bcfc4ce2673eb3fafd41276d7074659893864f634de39a2832435f01469a4a3e49424ccd25ab5dc5d82b57aed7d86ffe3d5deb4d11404a310ece5c7c43f5
6
+ metadata.gz: 9492c11b9f2b3bd44c32174bd2a595206d04a45f4110fe71af625de0a073d7aa49605dc9a2c4ca9ca3764ac95079fea1a4580a3a2e49e85bf0c660546f7918f7
7
+ data.tar.gz: 513803cadf77b9d15cb1d0003d94be2435dfe932bb3835de34fdc206e1c0e92618dd5e6f9f20d74957870f528dd218827d043310fc9624ec567ba970e12033c5
@@ -1,3 +1,15 @@
1
+ ## 0.22.1 - 2016-03-01
2
+
3
+ ### Other
4
+
5
+ Performance improvements. Using frozen constants for common values and
6
+ comparisons. Reduced the use of block arguments for callbacks.
7
+
8
+ Improved RabbitMQ transport channel error handling.
9
+
10
+ Fixed client signatures inspection/comparison when upgrading from a
11
+ previous release.
12
+
1
13
  ## 0.22.0 - 2016-01-29
2
14
 
3
15
  ### Features
@@ -65,11 +65,11 @@ module Sensu
65
65
  @thin.start
66
66
  end
67
67
 
68
- def stop_server(&callback)
68
+ def stop_server
69
69
  @thin.stop
70
70
  retry_until_true do
71
71
  unless @thin.running?
72
- callback.call
72
+ yield
73
73
  true
74
74
  end
75
75
  end
@@ -171,7 +171,7 @@ module Sensu
171
171
  body ""
172
172
  end
173
173
 
174
- def read_data(rules={}, &callback)
174
+ def read_data(rules={})
175
175
  begin
176
176
  data = MultiJson.load(env["rack.input"].read)
177
177
  valid = rules.all? do |key, rule|
@@ -181,7 +181,7 @@ module Sensu
181
181
  (rule[:regex] && (value =~ rule[:regex]) == 0)
182
182
  end
183
183
  if valid
184
- callback.call(data)
184
+ yield(data)
185
185
  else
186
186
  bad_request!
187
187
  end
@@ -210,7 +210,7 @@ module Sensu
210
210
  end
211
211
  end
212
212
 
213
- def transport_info(&callback)
213
+ def transport_info
214
214
  info = {
215
215
  :keepalives => {
216
216
  :messages => nil,
@@ -227,11 +227,11 @@ module Sensu
227
227
  info[:keepalives] = stats
228
228
  settings.transport.stats("results") do |stats|
229
229
  info[:results] = stats
230
- callback.call(info)
230
+ yield(info)
231
231
  end
232
232
  end
233
233
  else
234
- callback.call(info)
234
+ yield(info)
235
235
  end
236
236
  end
237
237
 
@@ -369,13 +369,13 @@ module Sensu
369
369
  # check the condition every 0.5 seconds until `true` is
370
370
  # returned.
371
371
  #
372
- # @param callback [Proc] called when there are no check
372
+ # @yield [] callback/block called when there are no check
373
373
  # executions in progress.
374
- def complete_checks_in_progress(&callback)
374
+ def complete_checks_in_progress
375
375
  @logger.info("completing checks in progress", :checks_in_progress => @checks_in_progress)
376
376
  retry_until_true do
377
377
  if @checks_in_progress.empty?
378
- callback.call
378
+ yield
379
379
  true
380
380
  end
381
381
  end
@@ -68,6 +68,9 @@ module Sensu
68
68
  # chunks of data in this mode, the connection is being closed.
69
69
  MODE_REJECT = :REJECT
70
70
 
71
+ # PING request string, identifying a connection ping request.
72
+ PING_REQUEST = "ping".freeze
73
+
71
74
  # Initialize instance variables that will be used throughout the
72
75
  # lifetime of the connection. This method is called when the
73
76
  # network connection has been established, and immediately after
@@ -184,7 +187,7 @@ module Sensu
184
187
  #
185
188
  # @param [String] data to be processed.
186
189
  def process_data(data)
187
- if data.strip == "ping"
190
+ if data.strip == PING_REQUEST
188
191
  @logger.debug("socket received ping")
189
192
  respond("pong")
190
193
  else
@@ -1,12 +1,12 @@
1
1
  module Sensu
2
2
  unless defined?(Sensu::VERSION)
3
3
  # Sensu release version.
4
- VERSION = "0.22.0"
4
+ VERSION = "0.22.1".freeze
5
5
 
6
6
  # Sensu check severities.
7
- SEVERITIES = %w[ok warning critical unknown]
7
+ SEVERITIES = %w[ok warning critical unknown].freeze
8
8
 
9
9
  # Process signals that trigger a Sensu process stop.
10
- STOP_SIGNALS = %w[INT TERM]
10
+ STOP_SIGNALS = %w[INT TERM].freeze
11
11
  end
12
12
  end
@@ -1,14 +1,14 @@
1
1
  require "rubygems"
2
2
 
3
3
  gem "multi_json", "1.11.2"
4
- gem "eventmachine", "1.0.8"
4
+ gem "eventmachine", "1.0.9.1"
5
5
 
6
6
  gem "sensu-logger", "1.1.0"
7
7
  gem "sensu-settings", "3.3.0"
8
8
  gem "sensu-extension", "1.3.0"
9
9
  gem "sensu-extensions", "1.4.0"
10
- gem "sensu-transport", "3.3.0"
11
- gem "sensu-spawn", "1.6.0"
10
+ gem "sensu-transport", "4.0.0"
11
+ gem "sensu-spawn", "1.7.0"
12
12
 
13
13
  require "time"
14
14
  require "uri"
@@ -228,21 +228,24 @@ module Sensu
228
228
  #
229
229
  # @param filter_name [String]
230
230
  # @param event [Hash]
231
- # @param callback [Proc]
232
- def event_filter(filter_name, event, &callback)
231
+ # @yield [filtered] callback/block called with a single
232
+ # parameter to indicate if the event was filtered.
233
+ # @yieldparam filtered [TrueClass,FalseClass] indicating if the
234
+ # event was filtered.
235
+ def event_filter(filter_name, event)
233
236
  case
234
237
  when @settings.filter_exists?(filter_name)
235
238
  filter = @settings[:filters][filter_name]
236
239
  matched = filter_attributes_match?(filter[:attributes], event)
237
- callback.call(filter[:negate] ? matched : !matched)
240
+ yield(filter[:negate] ? matched : !matched)
238
241
  when @extensions.filter_exists?(filter_name)
239
242
  extension = @extensions[:filters][filter_name]
240
243
  extension.safe_run(event) do |output, status|
241
- callback.call(status == 0)
244
+ yield(status == 0)
242
245
  end
243
246
  else
244
247
  @logger.error("unknown filter", :filter_name => filter_name)
245
- callback.call(false)
248
+ yield(false)
246
249
  end
247
250
  end
248
251
 
@@ -255,23 +258,26 @@ module Sensu
255
258
  #
256
259
  # @param handler [Hash] definition.
257
260
  # @param event [Hash]
258
- # @param callback [Proc]
259
- def event_filtered?(handler, event, &callback)
261
+ # @yield [filtered] callback/block called with a single
262
+ # parameter to indicate if the event was filtered.
263
+ # @yieldparam filtered [TrueClass,FalseClass] indicating if the
264
+ # event was filtered.
265
+ def event_filtered?(handler, event)
260
266
  if handler.has_key?(:filters) || handler.has_key?(:filter)
261
267
  filter_list = Array(handler[:filters] || handler[:filter]).dup
262
268
  filter = Proc.new do |filter_list|
263
269
  filter_name = filter_list.shift
264
270
  if filter_name.nil?
265
- callback.call(false)
271
+ yield(false)
266
272
  else
267
273
  event_filter(filter_name, event) do |filtered|
268
- filtered ? callback.call(true) : EM.next_tick { filter.call(filter_list) }
274
+ filtered ? yield(true) : EM.next_tick { filter.call(filter_list) }
269
275
  end
270
276
  end
271
277
  end
272
- EM.next_tick { filter.call(filter_list) }
278
+ filter.call(filter_list)
273
279
  else
274
- callback.call(false)
280
+ yield(false)
275
281
  end
276
282
  end
277
283
 
@@ -283,8 +289,10 @@ module Sensu
283
289
  #
284
290
  # @param handler [Hash] definition.
285
291
  # @param event [Hash]
286
- # @param callback [Proc]
287
- def filter_event(handler, event, &callback)
292
+ # @yield [event] callback/block called if the event has not been
293
+ # filtered.
294
+ # @yieldparam event [Hash]
295
+ def filter_event(handler, event)
288
296
  details = {:handler => handler, :event => event}
289
297
  filter_message = case
290
298
  when handling_disabled?(event)
@@ -302,7 +310,7 @@ module Sensu
302
310
  else
303
311
  event_filtered?(handler, event) do |filtered|
304
312
  unless filtered
305
- callback.call(event)
313
+ yield(event)
306
314
  else
307
315
  @logger.info("event was filtered", details)
308
316
  @handling_event_count -= 1 if @handling_event_count
@@ -13,6 +13,12 @@ module Sensu
13
13
 
14
14
  attr_reader :is_leader, :handling_event_count
15
15
 
16
+ METRIC_CHECK_TYPE = "metric".freeze
17
+
18
+ EVENT_FLAPPING_ACTION = "flapping".freeze
19
+
20
+ DEFAULT_HANDLER_NAME = "default".freeze
21
+
16
22
  # Create an instance of the Sensu server process, start the
17
23
  # server within the EventMachine event loop, and set up server
18
24
  # process signal traps (for stopping).
@@ -105,24 +111,25 @@ module Sensu
105
111
  # used for the stored client data.
106
112
  #
107
113
  # @param client [Hash]
108
- # @param callback [Proc] to call with the success status
109
- # (true/false) indicating if the client data has been added to
110
- # (or updated) the registry or discarded due to client signature
111
- # mismatch.
112
- def update_client_registry(client, &callback)
114
+ # @yield [success] passes success status to optional
115
+ # callback/block.
116
+ # @yieldparam success [TrueClass,FalseClass] indicating if the
117
+ # client registry update was a success or the client data was
118
+ # discarded due to client signature mismatch.
119
+ def update_client_registry(client)
113
120
  @logger.debug("updating client registry", :client => client)
114
121
  client_key = "client:#{client[:name]}"
115
122
  signature_key = "#{client_key}:signature"
116
123
  @redis.setnx(signature_key, client[:signature]) do |created|
117
124
  process_client_registration(client) if created
118
125
  @redis.get(signature_key) do |signature|
119
- if signature.empty? && client[:signature]
126
+ if (signature.nil? || signature.empty?) && client[:signature]
120
127
  @redis.set(signature_key, client[:signature])
121
128
  end
122
- if signature.empty? || (client[:signature] == signature)
129
+ if signature.nil? || signature.empty? || (client[:signature] == signature)
123
130
  @redis.set(client_key, MultiJson.dump(client)) do
124
131
  @redis.sadd("clients", client[:name]) do
125
- callback.call(true) if callback
132
+ yield(true) if block_given?
126
133
  end
127
134
  end
128
135
  else
@@ -131,7 +138,7 @@ module Sensu
131
138
  :signature => signature
132
139
  })
133
140
  @logger.warn("not updating client in the registry", :client => client)
134
- callback.call(false) if callback
141
+ yield(false) if block_given?
135
142
  end
136
143
  end
137
144
  end
@@ -218,9 +225,9 @@ module Sensu
218
225
  #
219
226
  # @param event [Hash]
220
227
  def process_event(event)
221
- log_level = event[:check][:type] == "metric" ? :debug : :info
228
+ log_level = event[:check][:type] == METRIC_CHECK_TYPE ? :debug : :info
222
229
  @logger.send(log_level, "processing event", :event => event)
223
- handler_list = Array((event[:check][:handlers] || event[:check][:handler]) || "default")
230
+ handler_list = Array((event[:check][:handlers] || event[:check][:handler]) || DEFAULT_HANDLER_NAME)
224
231
  handlers = derive_handlers(handler_list)
225
232
  handlers.each do |handler|
226
233
  @handling_event_count += 1
@@ -291,7 +298,7 @@ module Sensu
291
298
  # @return [Hash] check with truncated output.
292
299
  def truncate_check_output(check)
293
300
  case check[:type]
294
- when "metric"
301
+ when METRIC_CHECK_TYPE
295
302
  output_lines = check[:output].split("\n")
296
303
  output = output_lines.first || check[:output]
297
304
  if output_lines.size > 1 || output.length > 255
@@ -312,9 +319,9 @@ module Sensu
312
319
  #
313
320
  # @param client [Hash]
314
321
  # @param check [Hash]
315
- # @param callback [Proc] to call when the check result data has
316
- # been stored (history, etc).
317
- def store_check_result(client, check, &callback)
322
+ # @yield [] callback/block called after the check data has been
323
+ # stored (history, etc).
324
+ def store_check_result(client, check)
318
325
  @logger.debug("storing check result", :check => check)
319
326
  @redis.sadd("result:#{client[:name]}", check[:name])
320
327
  result_key = "#{client[:name]}:#{check[:name]}"
@@ -323,7 +330,7 @@ module Sensu
323
330
  history_key = "history:#{result_key}"
324
331
  @redis.rpush(history_key, check[:status]) do
325
332
  @redis.ltrim(history_key, -21, -1)
326
- callback.call
333
+ yield
327
334
  end
328
335
  end
329
336
  end
@@ -337,9 +344,14 @@ module Sensu
337
344
  #
338
345
  # @param client [Hash]
339
346
  # @param check [Hash]
340
- # @param callback [Proc] to be called with the check history and
341
- # total state change value.
342
- def check_history(client, check, &callback)
347
+ # @yield [history, total_state_change] callback/block to call
348
+ # with the check history and calculated total state change
349
+ # value.
350
+ # @yieldparam history [Array] containing the last 21 check
351
+ # result exit status codes.
352
+ # @yieldparam total_state_change [Float] percentage for the
353
+ # check history (exit status codes).
354
+ def check_history(client, check)
343
355
  history_key = "history:#{client[:name]}:#{check[:name]}"
344
356
  @redis.lrange(history_key, -21, -1) do |history|
345
357
  total_state_change = 0
@@ -356,7 +368,7 @@ module Sensu
356
368
  end
357
369
  total_state_change = (state_changes.fdiv(20) * 100).to_i
358
370
  end
359
- callback.call(history, total_state_change)
371
+ yield(history, total_state_change)
360
372
  end
361
373
  end
362
374
 
@@ -380,7 +392,7 @@ module Sensu
380
392
  # @return [TrueClass, FalseClass]
381
393
  def check_flapping?(stored_event, check)
382
394
  if check.has_key?(:low_flap_threshold) && check.has_key?(:high_flap_threshold)
383
- was_flapping = stored_event && stored_event[:action] == "flapping"
395
+ was_flapping = stored_event && stored_event[:action] == EVENT_FLAPPING_ACTION
384
396
  if was_flapping
385
397
  check[:total_state_change] > check[:low_flap_threshold]
386
398
  else
@@ -409,10 +421,11 @@ module Sensu
409
421
  #
410
422
  # @param client [Hash]
411
423
  # @param check [Hash]
412
- # @param callback [Proc] to be called with the resulting event
413
- # data if the event registry is updated, or the check is of
414
- # type `:metric`.
415
- def update_event_registry(client, check, &callback)
424
+ # @yield callback [event] callback/block called with the
425
+ # resulting event data if the event registry is updated, or
426
+ # the check is of type `:metric`.
427
+ # @yieldparam event [Hash]
428
+ def update_event_registry(client, check)
416
429
  @redis.hget("events:#{client[:name]}", check[:name]) do |event_json|
417
430
  stored_event = event_json ? MultiJson.load(event_json) : nil
418
431
  flapping = check_flapping?(stored_event, check)
@@ -429,18 +442,18 @@ module Sensu
429
442
  event[:occurrences] = stored_event[:occurrences] + 1
430
443
  end
431
444
  @redis.hset("events:#{client[:name]}", check[:name], MultiJson.dump(event)) do
432
- callback.call(event)
445
+ yield(event)
433
446
  end
434
447
  elsif stored_event
435
448
  event[:occurrences] = stored_event[:occurrences]
436
449
  event[:action] = :resolve
437
450
  unless check[:auto_resolve] == false && !check[:force_resolve]
438
451
  @redis.hdel("events:#{client[:name]}", check[:name]) do
439
- callback.call(event)
452
+ yield(event)
440
453
  end
441
454
  end
442
- elsif check[:type] == "metric"
443
- callback.call(event)
455
+ elsif check[:type] == METRIC_CHECK_TYPE
456
+ yield(event)
444
457
  end
445
458
  event_bridges(event)
446
459
  end
@@ -454,9 +467,10 @@ module Sensu
454
467
  # `false`.
455
468
  #
456
469
  # @param name [Hash] to use for the client.
457
- # @param callback [Proc] to be called with the dynamically
458
- # created client data.
459
- def create_client(name, &callback)
470
+ # @yield [client] callback/block to be called with the
471
+ # dynamically created client data.
472
+ # @yieldparam client [Hash]
473
+ def create_client(name)
460
474
  client = {
461
475
  :name => name,
462
476
  :address => "unknown",
@@ -465,7 +479,7 @@ module Sensu
465
479
  :version => VERSION
466
480
  }
467
481
  update_client_registry(client) do
468
- callback.call(client)
482
+ yield(client)
469
483
  end
470
484
  end
471
485
 
@@ -477,16 +491,17 @@ module Sensu
477
491
  # result must have a matching signature or it is discarded.
478
492
  #
479
493
  # @param result [Hash] data.
480
- # @param callback [Proc] to be called with client data, either
481
- # retrieved from Redis, or dynamically created.
482
- def retrieve_client(result, &callback)
494
+ # @yield [client] callback/block to be called with client data,
495
+ # either retrieved from Redis, or dynamically created.
496
+ # @yieldparam client [Hash]
497
+ def retrieve_client(result)
483
498
  client_key = result[:check][:source] || result[:client]
484
499
  @redis.get("client:#{client_key}") do |client_json|
485
500
  unless client_json.nil?
486
501
  client = MultiJson.load(client_json)
487
502
  if client[:signature]
488
503
  if client[:signature] == result[:signature]
489
- callback.call(client)
504
+ yield(client)
490
505
  else
491
506
  @logger.warn("invalid check result signature", {
492
507
  :result => result,
@@ -495,10 +510,12 @@ module Sensu
495
510
  @logger.warn("not retrieving client from the registry", :result => result)
496
511
  end
497
512
  else
498
- callback.call(client)
513
+ yield(client)
499
514
  end
500
515
  else
501
- create_client(client_key, &callback)
516
+ create_client(client_key) do |client|
517
+ yield(client)
518
+ end
502
519
  end
503
520
  end
504
521
  end
@@ -1014,15 +1031,15 @@ module Sensu
1014
1031
  # is complete, when it is equal to `0`. The provided callback is
1015
1032
  # called when handling is complete.
1016
1033
  #
1017
- # @param callback [Proc] to call when event handling is
1034
+ # @yield [] callback/block to call when event handling is
1018
1035
  # complete.
1019
- def complete_event_handling(&callback)
1036
+ def complete_event_handling
1020
1037
  @logger.info("completing event handling in progress", {
1021
1038
  :handling_event_count => @handling_event_count
1022
1039
  })
1023
1040
  retry_until_true do
1024
1041
  if @handling_event_count == 0
1025
- callback.call
1042
+ yield
1026
1043
  true
1027
1044
  end
1028
1045
  end
@@ -16,13 +16,13 @@ Gem::Specification.new do |s|
16
16
  s.add_dependency "json" if RUBY_VERSION < "1.9"
17
17
  s.add_dependency "multi_json", "1.11.2"
18
18
  s.add_dependency "uuidtools", "2.1.5"
19
- s.add_dependency "eventmachine", "1.0.8"
19
+ s.add_dependency "eventmachine", "1.0.9.1"
20
20
  s.add_dependency "sensu-logger", "1.1.0"
21
21
  s.add_dependency "sensu-settings", "3.3.0"
22
22
  s.add_dependency "sensu-extension", "1.3.0"
23
23
  s.add_dependency "sensu-extensions", "1.4.0"
24
- s.add_dependency "sensu-transport", "3.3.0"
25
- s.add_dependency "sensu-spawn", "1.6.0"
24
+ s.add_dependency "sensu-transport", "4.0.0"
25
+ s.add_dependency "sensu-spawn", "1.7.0"
26
26
  s.add_dependency "em-redis-unified", "1.0.1"
27
27
  s.add_dependency "sinatra", "1.4.6"
28
28
  s.add_dependency "async_sinatra", "1.2.0"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.0
4
+ version: 0.22.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Porter
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-01-29 00:00:00.000000000 Z
12
+ date: 2016-03-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
@@ -45,14 +45,14 @@ dependencies:
45
45
  requirements:
46
46
  - - '='
47
47
  - !ruby/object:Gem::Version
48
- version: 1.0.8
48
+ version: 1.0.9.1
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - '='
54
54
  - !ruby/object:Gem::Version
55
- version: 1.0.8
55
+ version: 1.0.9.1
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: sensu-logger
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -115,28 +115,28 @@ dependencies:
115
115
  requirements:
116
116
  - - '='
117
117
  - !ruby/object:Gem::Version
118
- version: 3.3.0
118
+ version: 4.0.0
119
119
  type: :runtime
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - '='
124
124
  - !ruby/object:Gem::Version
125
- version: 3.3.0
125
+ version: 4.0.0
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: sensu-spawn
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
130
  - - '='
131
131
  - !ruby/object:Gem::Version
132
- version: 1.6.0
132
+ version: 1.7.0
133
133
  type: :runtime
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
137
  - - '='
138
138
  - !ruby/object:Gem::Version
139
- version: 1.6.0
139
+ version: 1.7.0
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: em-redis-unified
142
142
  requirement: !ruby/object:Gem::Requirement