sensu 0.27.0.alpha.2 → 0.27.0.beta.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: 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