sensu 0.27.0.alpha.2 → 0.27.0.beta.1

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: 994997d6e22b6bbb53345295b583987194967aaa
4
- data.tar.gz: 58c8d9573c10beaca0f4c4ef880ff9a9c724b028
3
+ metadata.gz: 768682063e96780394b30a632d9f63ea18184421
4
+ data.tar.gz: 4e9c6427994c6a6c395b7b588b35d6a558648032
5
5
  SHA512:
6
- metadata.gz: 33bbfc2de4defdb2ac1c0a107962453159380bb8238ddbbb392445bae96bc956dde882e776b64aa0ee0a2fd20579d47cdb8c5f79cbac3d595dc25e5cec21e4d3
7
- data.tar.gz: 2dfb80ad2efd1a65222c56e4b08a3db91e337f285f2285a38a4e36d4147ecfd82149c9906bd1859af9bde0e7ed7911e7db3450afce8cf109ec1258beba8c199a
6
+ metadata.gz: cc2ef82b079573a137a4f943b074717565b7c503382999f82bf4db1536cec474cf65cae07b8393af75d013c63312da14caaba9de3fa73c2df567967bcf073830
7
+ data.tar.gz: 3fdca42dd2b54258dd3aefdd7c20306df1fd3f97fc69ee7193d8dbe927519ef28e17e6f83159d5c18f6fd3930ee14ac82666a7fa3eced8cabde81a96c842cd7a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,38 @@
1
+ ## 0.27.0 - TBD
2
+
3
+ ### Features
4
+
5
+ Sensu client HTTP socket for check result input and informational queries.
6
+ The client HTTP socket provides several endpoints, `/info`, `/results`,
7
+ and `/settings`. Basic authentication is supported, which is required for
8
+ certain endpoints, i.e. `/settings`. The client HTTP socket is
9
+ configurable via the Sensu client definition, `"http_socket": {}`.
10
+
11
+ Hostnames are now resolved prior to making connection attempts, this
12
+ applies to the Sensu Transport (i.e. RabbitMQ) and Redis connections. This
13
+ allows Sensu to handle resolution failures and enables failover via DNS
14
+ and services like Amazon AWS ElastiCache.
15
+
16
+ Added API endpoint `/silenced/ids/:id` for fetching a silence entry by id.
17
+
18
+ Added check attribute `ttl_status`, allowing checks to set a different TTL
19
+ event check status (default is `1` warning).
20
+
21
+ Added client deregistration attribute `status`, allowing clients to set a
22
+ different event check status for their deregistration events (default is
23
+ `1` warning).
24
+
25
+ Added Rubygems cleanup support to `sensu-install`, via the command line
26
+ argument `-c/--clean` when installing one or more plugins and/or
27
+ extensions. If a version is provided for the plugin(s) or extension(s),
28
+ all other installed versions of them will be removed, e.g. `sensu-install
29
+ -e snmp-trap:0.0.19 -c`. If a version is not provided, all installed
30
+ versions except the latest will be removed.
31
+
32
+ ### Other
33
+
34
+ Added the filter name to event filtered log events.
35
+
1
36
  ## 0.26.5 - 2016-10-12
2
37
 
3
38
  ### Fixes
@@ -88,7 +88,11 @@ module Sensu
88
88
  end
89
89
 
90
90
  def send_response(status, status_string, content)
91
- @logger.debug("sending HTTP response #{status} #{status_string}", :content => content)
91
+ @logger.debug("http socket sending response", {
92
+ :status => status,
93
+ :status_string => status_string,
94
+ :content => content
95
+ })
92
96
  @response.status = status
93
97
  @response.status_string = status_string
94
98
  @response.content = Sensu::JSON::dump(content)
@@ -111,7 +115,7 @@ module Sensu
111
115
  begin
112
116
  check = Sensu::JSON::load(@http_content)
113
117
  process_check_result(check)
114
- send_response(200, "OK", {:response => "ok"})
118
+ send_response(202, "OK", {:response => "ok"})
115
119
  rescue Sensu::JSON::ParseError, ArgumentError
116
120
  send_response(400, "Failed to parse JSON body", {:response => "Failed to parse JSON body"})
117
121
  end
@@ -122,14 +126,14 @@ module Sensu
122
126
 
123
127
  def process_request_settings
124
128
  if authorized?
125
- @logger.info("responding to HTTP request for configuration settings")
129
+ @logger.info("http socket responding to request for configuration settings")
126
130
  if @http_query_string and @http_query_string.downcase.include?("redacted=false")
127
131
  send_response(200, "OK", @settings.to_hash)
128
132
  else
129
133
  send_response(200, "OK", redact_sensitive(@settings.to_hash))
130
134
  end
131
135
  else
132
- @logger.warn("refusing to serve unauthorized settings request")
136
+ @logger.warn("http socket refusing to serve unauthorized settings request")
133
137
  @response.headers["WWW-Authenticate"] = 'Basic realm="Sensu Client Restricted Area"'
134
138
  send_response(401, "Unauthorized", {
135
139
  :response => "You must be authenticated using your http_options user and password settings"
@@ -137,8 +141,11 @@ module Sensu
137
141
  end
138
142
  end
139
143
 
140
- def http_request_errback(ex)
141
- @logger.error("exception while processing HTTP request: #{ex.class}: #{ex.message}", backtrace: ex.backtrace)
144
+ def http_request_errback(error)
145
+ @logger.error("http socket error while processing request", {
146
+ :error => error.to_s,
147
+ :backtrace => error.backtrace
148
+ })
142
149
  @response = EM::DelegatedHttpResponse.new(self)
143
150
  @response.content_type "application/json"
144
151
  send_response(500, "Internal Server Error", {
@@ -148,25 +155,37 @@ module Sensu
148
155
 
149
156
  # This method is called to process HTTP requests
150
157
  def process_http_request
151
- @logger.debug("processing #{@http_request_method} #{@http_request_uri}")
158
+ @logger.debug("http socket processing", {
159
+ :http_request_method => @http_request_method,
160
+ :http_request_uri => @http_request_uri
161
+ })
152
162
  @response = EM::DelegatedHttpResponse.new(self)
153
163
  @response.content_type "application/json"
154
164
  endpoint = @endpoints[@http_request_uri]
155
165
  if endpoint
156
- @logger.debug("endpoint #{@http_request_uri} found", :accepted_methods => endpoint["methods"].keys)
166
+ @logger.debug("http socket endpoint found", {
167
+ :http_request_uri => @http_request_uri,
168
+ :accepted_methods => endpoint["methods"].keys
169
+ })
157
170
  method_name = @http_request_method.upcase
158
171
  method_handler = endpoint["methods"][method_name]
159
172
  if method_handler
160
- @logger.debug("executing #{method_name} #{@http_request_uri} handler")
173
+ @logger.debug("http socket executing handler", {
174
+ :method_name => method_name,
175
+ :http_request_uri => @http_request_uri
176
+ })
161
177
  method_handler.call
162
178
  else
163
- @logger.debug("method #{method_name} is not allowed for endpoint #{@http_request_uri}")
179
+ @logger.debug("http socket method is not allowed for endpoint", {
180
+ :method_name => method_name,
181
+ :http_request_uri => @http_request_uri
182
+ })
164
183
  send_response(405, "Method Not Allowed", {
165
184
  :response => "Valid methods for this endpoint: #{reqdef['methods'].keys}"
166
185
  })
167
186
  end
168
187
  else
169
- @logger.warn("unknown endpoint requested: #{@http_request_uri}")
188
+ @logger.warn("http socket unknown endpoint requested", :http_request_uri => @http_request_uri)
170
189
  help_response = {
171
190
  :endpoints => {}
172
191
  }
@@ -348,7 +348,7 @@ module Sensu
348
348
  schedule_checks(standard_checks + extension_checks)
349
349
  end
350
350
 
351
- # Setup the Sensu client socket, for external check result
351
+ # Setup the Sensu client JSON socket, for external check result
352
352
  # input. By default, the client socket is bound to localhost on
353
353
  # TCP & UDP port 3030. The socket can be configured via the
354
354
  # client definition, `:socket` with `:bind` and `:port`. The
@@ -357,7 +357,7 @@ module Sensu
357
357
  # TCP socket server signature (Fixnum) and UDP connection object
358
358
  # are stored in `@sockets`, so that they can be managed
359
359
  # elsewhere, eg. `close_sockets()`.
360
- def setup_sockets
360
+ def setup_json_socket
361
361
  options = @settings[:client][:socket] || Hash.new
362
362
  options[:bind] ||= "127.0.0.1"
363
363
  options[:port] ||= 3030
@@ -373,18 +373,39 @@ module Sensu
373
373
  socket.transport = @transport
374
374
  socket.protocol = :udp
375
375
  end
376
- # Setup the HTTP socket
377
- http_options = @settings[:client][:http_socket] || Hash.new
378
- http_options[:bind] ||= "127.0.0.1"
379
- http_options[:port] ||= 3031
380
- @logger.debug("binding client http socket", :http_options => http_options)
381
- @sockets << EM::start_server(http_options[:bind], http_options[:port], HTTPSocket) do |socket|
382
- socket.logger = @logger
383
- socket.settings = @settings
384
- socket.transport = @transport
376
+ end
377
+
378
+ # Setup the Sensu client HTTP socket, for external check result
379
+ # input and informational queries. By default, the client HTTP
380
+ # socket is bound to localhost on TCP port 3031. The socket can
381
+ # be configured via the client definition, `:http_socket` with
382
+ # `:bind` and `:port`. Users can opt-out of using the HTTP
383
+ # socket by setting `:enabled` to `false. The current instance
384
+ # of the Sensu logger, settings, and transport are passed to the
385
+ # HTTP socket handler, `Sensu::Client::HTTPSocket`. The HTTP
386
+ # socket server signature (Fixnum) is stored in `@sockets`, so
387
+ # that it can be managed elsewhere, eg. `close_sockets()`.
388
+ def setup_http_socket
389
+ options = @settings[:client][:http_socket] || Hash.new
390
+ options[:bind] ||= "127.0.0.1"
391
+ options[:port] ||= 3031
392
+ unless options[:enabled] == false
393
+ @logger.debug("binding client http socket", :options => options)
394
+ @sockets << EM::start_server(options[:bind], options[:port], HTTPSocket) do |socket|
395
+ socket.logger = @logger
396
+ socket.settings = @settings
397
+ socket.transport = @transport
398
+ end
385
399
  end
386
400
  end
387
401
 
402
+ # Setup the Sensu client sockets, JSON TCP & UDP, and HTTP.
403
+ # Users can opt-out of using the HTTP socket via configuration.
404
+ def setup_sockets
405
+ setup_json_socket
406
+ setup_http_socket
407
+ end
408
+
388
409
  # Call a callback (Ruby block) when there are no longer check
389
410
  # executions in progress. This method is used when stopping the
390
411
  # Sensu client. The `retry_until_true` helper method is used to
@@ -409,11 +430,10 @@ module Sensu
409
430
  # default, the deregistration check result sets the `:handler` to
410
431
  # `deregistration`. If the client provides its own `:deregistration`
411
432
  # configuration, it's deep merged with the defaults. The
412
- # check `:name`, `:output`, `:status`, `:issued`, and
413
- # `:executed` values are always overridden to guard against
414
- # an invalid definition.
433
+ # check `:name`, `:output`, `:issued`, and `:executed` values
434
+ # are always overridden to guard against an invalid definition.
415
435
  def deregister
416
- check = {:handler => "deregistration", :interval => 1}
436
+ check = {:handler => "deregistration", :status => 1}
417
437
  if @settings[:client].has_key?(:deregistration)
418
438
  check = deep_merge(check, @settings[:client][:deregistration])
419
439
  end
@@ -421,7 +441,6 @@ module Sensu
421
441
  overrides = {
422
442
  :name => "deregistration",
423
443
  :output => "client initiated deregistration",
424
- :status => 1,
425
444
  :issued => timestamp,
426
445
  :executed => timestamp
427
446
  }
@@ -1,7 +1,7 @@
1
1
  module Sensu
2
2
  unless defined?(Sensu::VERSION)
3
3
  # Sensu release version.
4
- VERSION = "0.27.0.alpha.2".freeze
4
+ VERSION = "0.27.0.beta.1".freeze
5
5
 
6
6
  # Sensu check severities.
7
7
  SEVERITIES = %w[ok warning critical unknown].freeze
data/lib/sensu/daemon.rb CHANGED
@@ -4,7 +4,7 @@ gem "eventmachine", "1.2.1"
4
4
 
5
5
  gem "sensu-json", "2.0.1"
6
6
  gem "sensu-logger", "1.2.1"
7
- gem "sensu-settings", "9.2.2"
7
+ gem "sensu-settings", "9.6.0"
8
8
  gem "sensu-extension", "1.5.1"
9
9
  gem "sensu-extensions", "1.7.1"
10
10
  gem "sensu-transport", "7.0.2"
@@ -71,11 +71,11 @@ module Sensu
71
71
  # default, the registration check definition sets the `:handler`
72
72
  # to `registration`. If the client provides its own
73
73
  # `:registration` configuration, it's deep merged with the
74
- # defaults. The check `:name`, `:output`, `:status`, `:issued`,
75
- # and `:executed` values are always overridden to guard against
76
- # an invalid definition.
74
+ # defaults. The check `:name`, `:output`, `:issued`, and
75
+ # `:executed` values are always overridden to guard against an
76
+ # invalid definition.
77
77
  def create_registration_check(client)
78
- check = {:handler => "registration"}
78
+ check = {:handler => "registration", :status => 1}
79
79
  if client.has_key?(:registration)
80
80
  check = deep_merge(check, client[:registration])
81
81
  end
@@ -83,7 +83,6 @@ module Sensu
83
83
  overrides = {
84
84
  :name => "registration",
85
85
  :output => "new client registration",
86
- :status => 1,
87
86
  :issued => timestamp,
88
87
  :executed => timestamp
89
88
  }
@@ -319,7 +318,16 @@ module Sensu
319
318
  def truncate_check_output(check)
320
319
  case check[:type]
321
320
  when METRIC_CHECK_TYPE
322
- output_lines = check[:output].split("\n")
321
+ begin
322
+ output_lines = check[:output].split("\n")
323
+ rescue ArgumentError
324
+ utf8_output = check[:output].encode("UTF-8", "binary", {
325
+ :invalid => :replace,
326
+ :undef => :replace,
327
+ :replace => ""
328
+ })
329
+ output_lines = utf8_output.split("\n")
330
+ end
323
331
  output = output_lines.first || check[:output]
324
332
  if output_lines.length > 1 || output.length > 255
325
333
  output = output[0..255] + "\n..."
@@ -961,7 +969,7 @@ module Sensu
961
969
  unless event_exists
962
970
  check[:output] = "Last check execution was "
963
971
  check[:output] << "#{time_since_last_execution} seconds ago"
964
- check[:status] = 1
972
+ check[:status] = check[:ttl_status] || 1
965
973
  publish_check_result(client_name, check)
966
974
  end
967
975
  end
data/sensu.gemspec CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.add_dependency "eventmachine", "1.2.1"
16
16
  s.add_dependency "sensu-json", "2.0.1"
17
17
  s.add_dependency "sensu-logger", "1.2.1"
18
- s.add_dependency "sensu-settings", "9.2.2"
18
+ s.add_dependency "sensu-settings", "9.6.0"
19
19
  s.add_dependency "sensu-extension", "1.5.1"
20
20
  s.add_dependency "sensu-extensions", "1.7.1"
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: 0.27.0.alpha.2
4
+ version: 0.27.0.beta.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-11-18 00:00:00.000000000 Z
12
+ date: 2016-11-23 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: 9.2.2
62
+ version: 9.6.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: 9.2.2
69
+ version: 9.6.0
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: sensu-extension
72
72
  requirement: !ruby/object:Gem::Requirement