sensu 1.1.3 → 1.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5716bcce7e37813806670e77b25c94e06dfa9c02
4
- data.tar.gz: ad76c66cad53d2c722af68f0513e2a346adf7afb
3
+ metadata.gz: 033a973109e8bcb6bb775163452c270b74907afe
4
+ data.tar.gz: 464a435d9c1191d9e8b941681c8b53af57977940
5
5
  SHA512:
6
- metadata.gz: e9cd95bde516a9fa44b29f107d5f8cd68c61c26a0f49981232af6f4916540221d558c3bf3dcfb49ae0d4c6ed5311f496168ed74b804c6453e6383a2c85d35191
7
- data.tar.gz: 763abe545f122b8f0c624ab29c523d1723af31012605a19171fd57916effc1552b5089746b39f2398eddaedc91e718fdbda62a4a159d2e44af2bf8ce0dd9966c
6
+ metadata.gz: be59c0a1d75341cfec86f91e29f978c8c5a5a629cad565918d253f687e72958c18a037f4919d04746802da3ddab4a7664388c6538f2eaf24a4fa01b9795f2d5d
7
+ data.tar.gz: 4775c24d752d40cc2ae90795a80ff81095796a4aabd0d5d9b719e58d45c80ac74b6f9234f6e3d321c41c7505941f7ec8424573e0845d5dd06618ab8ab54b9632
@@ -1,3 +1,21 @@
1
+ ## 1.2.0 - 2017-12-05
2
+
3
+ ### Features
4
+
5
+ Scheduled maintenance, Sensu now gives users the ability to silence a
6
+ check and/or client subscriptions at a predetermined time (`begin`
7
+ epoch timestamp), with an optional expiration (in seconds), enabling
8
+ users to silence events in advance for scheduled maintenance windows.
9
+
10
+ The Sensu API now logs the "X-Request-ID" header, making it much
11
+ easier to trace a request/response. If the API client does not provide
12
+ a request ID, the API generates one for the request (UUID).
13
+
14
+ The Sensu API `/results/*` endpoints now include check history in the
15
+ result data.
16
+
17
+ Check token substitution is now supported in check "subdue".
18
+
1
19
  ## 1.1.3 - 2017-11-24
2
20
 
3
21
  ### Fixes
data/README.md CHANGED
@@ -3,6 +3,7 @@
3
3
  [![Build Status](https://img.shields.io/travis/sensu/sensu.svg)](https://travis-ci.org/sensu/sensu)
4
4
  [![Gem Version](https://img.shields.io/gem/v/sensu.svg)](https://github.com/sensu/sensu/blob/master/CHANGELOG.md)
5
5
  [![MIT Licensed](https://img.shields.io/github/license/sensu/sensu.svg)](https://raw.githubusercontent.com/sensu/sensu/master/MIT-LICENSE.txt)
6
+ [![Join the chat at https://slack.sensu.io/](https://slack.sensu.io/badge.svg)](https://slack.sensu.io/)
6
7
 
7
8
  # Sensu
8
9
 
@@ -1,3 +1,4 @@
1
+ require "sensu/utilities"
1
2
  require "sensu/api/routes"
2
3
  require "sensu/api/utilities/filter_response_content"
3
4
 
@@ -21,9 +22,11 @@ module Sensu
21
22
  # @result [Hash]
22
23
  def request_details
23
24
  return @request_details if @request_details
25
+ @request_id = @http.fetch(:x_request_id, random_uuid)
24
26
  @request_start_time = Time.now.to_f
25
27
  _, remote_address = Socket.unpack_sockaddr_in(get_peername)
26
28
  @request_details = {
29
+ :request_id => @request_id,
27
30
  :remote_address => remote_address,
28
31
  :user_agent => @http[:user_agent],
29
32
  :method => @http_request_method,
@@ -44,7 +47,9 @@ module Sensu
44
47
  end
45
48
 
46
49
  # Log the HTTP response. This method calculates the
47
- # request/response time.
50
+ # request/response time. The debug log level is used for the
51
+ # response body log event, as it is generally very verbose and
52
+ # unnecessary in most cases.
48
53
  def log_response
49
54
  @logger.info("api response", {
50
55
  :request => request_details,
@@ -148,6 +153,13 @@ module Sensu
148
153
  end
149
154
  end
150
155
 
156
+ # Set the HTTP response headers, including the request ID and
157
+ # cors headers (via `set_cores_headers()`).
158
+ def set_headers
159
+ @response.headers["X-Request-ID"] = @request_id
160
+ set_cors_headers
161
+ end
162
+
151
163
  # Paginate the provided items. This method uses two HTTP query
152
164
  # parameters to determine how to paginate the items, `limit` and
153
165
  # `offset`. The parameter `limit` specifies how many items are
@@ -392,7 +404,7 @@ module Sensu
392
404
  log_request
393
405
  parse_parameters
394
406
  create_response
395
- set_cors_headers
407
+ set_headers
396
408
  if authorized?
397
409
  if connected?
398
410
  route_request
@@ -36,12 +36,19 @@ module Sensu
36
36
  checks.each_with_index do |check_name, check_index|
37
37
  result_key = "result:#{client_name}:#{check_name}"
38
38
  @redis.get(result_key) do |result_json|
39
- unless result_json.nil?
40
- check = Sensu::JSON.load(result_json)
41
- @response_content << {:client => client_name, :check => check}
42
- end
43
- if client_index == clients.length - 1 && check_index == checks.length - 1
44
- respond
39
+ history_key = "history:#{client_name}:#{check_name}"
40
+ @redis.lrange(history_key, -21, -1) do |history|
41
+ history.map! do |status|
42
+ status.to_i
43
+ end
44
+ unless result_json.nil?
45
+ check = Sensu::JSON.load(result_json)
46
+ check[:history] = history
47
+ @response_content << {:client => client_name, :check => check}
48
+ end
49
+ if client_index == clients.length - 1 && check_index == checks.length - 1
50
+ respond
51
+ end
45
52
  end
46
53
  end
47
54
  end
@@ -67,12 +74,19 @@ module Sensu
67
74
  checks.each_with_index do |check_name, check_index|
68
75
  result_key = "result:#{client_name}:#{check_name}"
69
76
  @redis.get(result_key) do |result_json|
70
- unless result_json.nil?
71
- check = Sensu::JSON.load(result_json)
72
- @response_content << {:client => client_name, :check => check}
73
- end
74
- if check_index == checks.length - 1
75
- respond
77
+ history_key = "history:#{client_name}:#{check_name}"
78
+ @redis.lrange(history_key, -21, -1) do |history|
79
+ history.map! do |status|
80
+ status.to_i
81
+ end
82
+ unless result_json.nil?
83
+ check = Sensu::JSON.load(result_json)
84
+ check[:history] = history
85
+ @response_content << {:client => client_name, :check => check}
86
+ end
87
+ if check_index == checks.length - 1
88
+ respond
89
+ end
76
90
  end
77
91
  end
78
92
  end
@@ -88,9 +102,16 @@ module Sensu
88
102
  result_key = "result:#{client_name}:#{check_name}"
89
103
  @redis.get(result_key) do |result_json|
90
104
  unless result_json.nil?
91
- check = Sensu::JSON.load(result_json)
92
- @response_content = {:client => client_name, :check => check}
93
- respond
105
+ history_key = "history:#{client_name}:#{check_name}"
106
+ @redis.lrange(history_key, -21, -1) do |history|
107
+ history.map! do |status|
108
+ status.to_i
109
+ end
110
+ check = Sensu::JSON.load(result_json)
111
+ check[:history] = history
112
+ @response_content = {:client => client_name, :check => check}
113
+ respond
114
+ end
94
115
  else
95
116
  not_found!
96
117
  end
@@ -48,6 +48,7 @@ module Sensu
48
48
  rules = {
49
49
  :subscription => {:type => String, :nil_ok => true, :regex => /\A[\w\.\-\:]+\z/},
50
50
  :check => {:type => String, :nil_ok => true, :regex => /\A[\w\.-]+\z/},
51
+ :begin => {:type => Integer, :nil_ok => true},
51
52
  :expire => {:type => Integer, :nil_ok => true},
52
53
  :reason => {:type => String, :nil_ok => true},
53
54
  :creator => {:type => String, :nil_ok => true},
@@ -58,20 +59,27 @@ module Sensu
58
59
  subscription = data.fetch(:subscription, "*")
59
60
  check = data.fetch(:check, "*")
60
61
  silenced_id = "#{subscription}:#{check}"
62
+ timestamp = Time.now.to_i
61
63
  silenced_info = {
62
64
  :id => silenced_id,
63
65
  :subscription => data[:subscription],
64
66
  :check => data[:check],
65
67
  :reason => data[:reason],
66
68
  :creator => data[:creator],
69
+ :begin => data[:begin],
67
70
  :expire_on_resolve => data.fetch(:expire_on_resolve, false),
68
- :timestamp => Time.now.to_i
71
+ :timestamp => timestamp
69
72
  }
70
73
  silenced_key = "silence:#{silenced_id}"
71
74
  @redis.set(silenced_key, Sensu::JSON.dump(silenced_info)) do
72
75
  @redis.sadd("silenced", silenced_key) do
73
76
  if data[:expire]
74
- @redis.expire(silenced_key, data[:expire]) do
77
+ expire = data[:expire]
78
+ if data[:begin]
79
+ diff = data[:begin] - timestamp
80
+ expire += diff if diff > 0
81
+ end
82
+ @redis.expire(silenced_key, expire) do
75
83
  created!
76
84
  end
77
85
  else
@@ -1,7 +1,7 @@
1
1
  module Sensu
2
2
  unless defined?(Sensu::VERSION)
3
3
  # Sensu release version.
4
- VERSION = "1.1.3".freeze
4
+ VERSION = "1.2.0".freeze
5
5
 
6
6
  # Sensu release information.
7
7
  RELEASE_INFO = {
@@ -4,7 +4,7 @@ gem "eventmachine", "1.2.5"
4
4
 
5
5
  gem "sensu-json", "2.1.0"
6
6
  gem "sensu-logger", "1.2.1"
7
- gem "sensu-settings", "10.9.0"
7
+ gem "sensu-settings", "10.12.0"
8
8
  gem "sensu-extension", "1.5.1"
9
9
  gem "sensu-extensions", "1.9.0"
10
10
  gem "sensu-transport", "7.0.2"
@@ -485,7 +485,7 @@ module Sensu
485
485
  silenced_key = "silence:#{silenced_info[:id]}"
486
486
  @redis.srem("silenced", silenced_key)
487
487
  @redis.del(silenced_key)
488
- else
488
+ elsif silenced_info[:begin].nil? || silenced_info[:begin] <= Time.now.to_i
489
489
  event[:silenced_by] << silenced_info[:id]
490
490
  end
491
491
  end
@@ -1065,6 +1065,9 @@ module Sensu
1065
1065
  if @settings.handler_exists?(:keepalive)
1066
1066
  check[:handler] = "keepalive"
1067
1067
  end
1068
+ if @settings[:sensu][:keepalives]
1069
+ check = deep_merge(check, @settings[:sensu][:keepalives])
1070
+ end
1068
1071
  if client.has_key?(:keepalive)
1069
1072
  check = deep_merge(check, client[:keepalive])
1070
1073
  end
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.add_dependency "eventmachine", "1.2.5"
16
16
  s.add_dependency "sensu-json", "2.1.0"
17
17
  s.add_dependency "sensu-logger", "1.2.1"
18
- s.add_dependency "sensu-settings", "10.9.0"
18
+ s.add_dependency "sensu-settings", "10.12.0"
19
19
  s.add_dependency "sensu-extension", "1.5.1"
20
20
  s.add_dependency "sensu-extensions", "1.9.0"
21
21
  s.add_dependency "sensu-transport", "7.0.2"
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: 1.1.3
4
+ version: 1.2.0
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: 2017-11-25 00:00:00.000000000 Z
12
+ date: 2017-12-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
@@ -59,14 +59,14 @@ dependencies:
59
59
  requirements:
60
60
  - - '='
61
61
  - !ruby/object:Gem::Version
62
- version: 10.9.0
62
+ version: 10.12.0
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - '='
68
68
  - !ruby/object:Gem::Version
69
- version: 10.9.0
69
+ version: 10.12.0
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: sensu-extension
72
72
  requirement: !ruby/object:Gem::Requirement