sensu 0.24.1 → 0.25.0.beta

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.
@@ -0,0 +1,29 @@
1
+ require "sensu/api/utilities/publish_check_result"
2
+
3
+ module Sensu
4
+ module API
5
+ module Utilities
6
+ module ResolveEvent
7
+ include PublishCheckResult
8
+
9
+ # Resolve an event. This method publishes a check result with
10
+ # a check status of `0` (OK) to resolve the event. The
11
+ # published check result uses `force_resolve` to ensure the
12
+ # event is resolved and removed from the registry, even if the
13
+ # current event has an event action of `flapping` etc.
14
+ #
15
+ # @param event_json [String] JSON formatted event data.
16
+ def resolve_event(event_json)
17
+ event = Sensu::JSON.load(event_json)
18
+ check = event[:check].merge(
19
+ :output => "Resolving on request of the API",
20
+ :status => 0,
21
+ :force_resolve => true
22
+ )
23
+ check.delete(:history)
24
+ publish_check_result(event[:client][:name], check)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ module Sensu
2
+ module API
3
+ module Utilities
4
+ module TransportInfo
5
+ # Retreive the Sensu Transport info, if the API is connected
6
+ # to it, keepalive messages and consumers, and results
7
+ # messages and consumers.
8
+ #
9
+ # @yield [Hash] passes Transport info to the callback/block.
10
+ def transport_info
11
+ info = {
12
+ :keepalives => {
13
+ :messages => nil,
14
+ :consumers => nil
15
+ },
16
+ :results => {
17
+ :messages => nil,
18
+ :consumers => nil
19
+ },
20
+ :connected => @transport.connected?
21
+ }
22
+ if @transport.connected?
23
+ @transport.stats("keepalives") do |stats|
24
+ info[:keepalives] = stats
25
+ @transport.stats("results") do |stats|
26
+ info[:results] = stats
27
+ yield(info)
28
+ end
29
+ end
30
+ else
31
+ yield(info)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -373,6 +373,31 @@ module Sensu
373
373
  end
374
374
  end
375
375
 
376
+ # Create a check result intended for deregistering a client.
377
+ # Client definitions may contain `:deregistration` configuration,
378
+ # containing custom attributes and handler information. By
379
+ # default, the deregistration check result sets the `:handler` to
380
+ # `deregistration`. If the client provides its own `:deregistration`
381
+ # configuration, it's deep merged with the defaults. The
382
+ # check `:name`, `:output`, `:status`, `:issued`, and
383
+ # `:executed` values are always overridden to guard against
384
+ # an invalid definition.
385
+ def deregister
386
+ check = {:handler => "deregistration", :interval => 1}
387
+ if @settings[:client].has_key?(:deregistration)
388
+ check = deep_merge(check, @settings[:client][:deregistration])
389
+ end
390
+ timestamp = Time.now.to_i
391
+ overrides = {
392
+ :name => "deregistration",
393
+ :output => "client initiated deregistration",
394
+ :status => 1,
395
+ :issued => timestamp,
396
+ :executed => timestamp
397
+ }
398
+ publish_check_result(check.merge(overrides))
399
+ end
400
+
376
401
  # Close the Sensu client TCP and UDP sockets. This method
377
402
  # iterates through `@sockets`, which contains socket server
378
403
  # signatures (Fixnum) and connection objects. A signature
@@ -448,10 +473,12 @@ module Sensu
448
473
  # Stop the Sensu client process, pausing it, completing check
449
474
  # executions in progress, closing the transport connection, and
450
475
  # exiting the process (exit 0). After pausing the process, the
451
- # process/daemon `@state` is set to `:stopping`.
476
+ # process/daemon `@state` is set to `:stopping`. Also sends
477
+ # deregistration check result if configured to do so.
452
478
  def stop
453
479
  @logger.warn("stopping")
454
480
  pause
481
+ deregister if @settings[:client][:deregister] == true
455
482
  @state = :stopping
456
483
  complete_checks_in_progress do
457
484
  close_sockets
@@ -244,7 +244,7 @@ module Sensu
244
244
  when :udp
245
245
  process_data(data)
246
246
  when :tcp
247
- if EM.reactor_running?
247
+ if EM::reactor_running?
248
248
  reset_watchdog
249
249
  end
250
250
  @data_buffer << data
@@ -1,7 +1,7 @@
1
1
  module Sensu
2
2
  unless defined?(Sensu::VERSION)
3
3
  # Sensu release version.
4
- VERSION = "0.24.1".freeze
4
+ VERSION = "0.25.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
@@ -37,9 +37,10 @@ module Sensu
37
37
  attr_reader :start_time
38
38
 
39
39
  # Initialize the Sensu process. Set the start time, initial
40
- # service state, set up the logger, load settings, load
41
- # extensions, and optionally daemonize the process and/or create a
42
- # PID file. A subclass may override this method.
40
+ # service state, set up the logger, and load settings. This method
41
+ # will load extensions and setup Sensu Spawn if the Sensu process
42
+ # is not the Sensu API. This method can and optionally daemonize
43
+ # the process and/or create a PID file.
43
44
  #
44
45
  # @param options [Hash]
45
46
  def initialize(options={})
@@ -48,8 +49,10 @@ module Sensu
48
49
  @timers = {:run => []}
49
50
  setup_logger(options)
50
51
  load_settings(options)
51
- load_extensions(options)
52
- setup_spawn
52
+ unless sensu_service_name == "api"
53
+ load_extensions(options)
54
+ setup_spawn
55
+ end
53
56
  setup_process(options)
54
57
  end
55
58
 
@@ -164,7 +167,7 @@ module Sensu
164
167
  @logger.info("configuring sensu spawn", :settings => @settings[:sensu][:spawn])
165
168
  threadpool_size = @settings[:sensu][:spawn][:limit] + 10
166
169
  @logger.debug("setting eventmachine threadpool size", :size => threadpool_size)
167
- EM.threadpool_size = threadpool_size
170
+ EM::threadpool_size = threadpool_size
168
171
  Spawn.setup(@settings[:sensu][:spawn])
169
172
  end
170
173
 
@@ -264,7 +267,7 @@ module Sensu
264
267
  @logger.info("reconnected to transport")
265
268
  resume
266
269
  end
267
- yield(@transport)
270
+ yield(@transport) if block_given?
268
271
  end
269
272
  end
270
273
 
@@ -295,12 +298,19 @@ module Sensu
295
298
  @logger.info("reconnected to redis")
296
299
  resume
297
300
  end
298
- yield(@redis)
301
+ yield(@redis) if block_given?
299
302
  end
300
303
  end
301
304
 
302
305
  private
303
306
 
307
+ # Get the Sensu service name.
308
+ #
309
+ # @return [String] Sensu service name.
310
+ def sensu_service_name
311
+ File.basename($0).split("-").last
312
+ end
313
+
304
314
  # Write the current process ID (PID) to a file (PID file). This
305
315
  # method will cause the Sensu service to exit (2) if the PID file
306
316
  # cannot be written to.
@@ -619,15 +619,16 @@ module Sensu
619
619
  end
620
620
  end
621
621
 
622
- # Determine the Sensu transport publish options for a
623
- # subscription. If a subscription begins with a transport pipe
622
+ # Determine the Sensu Transport publish options for a
623
+ # subscription. If a subscription begins with a Transport pipe
624
624
  # type, either "direct:" or "roundrobin:", the subscription uses
625
- # a direct transport pipe. If a subscription does not specify a
626
- # transport pipe type, a fanout transport pipe is used.
625
+ # a direct Transport pipe. If a subscription does not specify a
626
+ # Transport pipe type, a fanout Transport pipe is used.
627
627
  #
628
628
  # @param subscription [String]
629
- # @return [Array] containing the transport publish options:
630
- # the transport pipe type, pipe, and the message to be
629
+ # @param message [String]
630
+ # @return [Array] containing the Transport publish options:
631
+ # the Transport pipe type, pipe, and the message to be
631
632
  # published.
632
633
  def transport_publish_options(subscription, message)
633
634
  _, raw_type = subscription.split(":", 2).reverse
@@ -639,13 +640,13 @@ module Sensu
639
640
  end
640
641
  end
641
642
 
642
- # Publish a check request to the transport. A check request is
643
+ # Publish a check request to the Transport. A check request is
643
644
  # composed of a check `:name`, an `:issued` timestamp, a check
644
645
  # `:command` if available, and a check `:extension if available.
645
- # The check request is published to a transport pipe, for each
646
+ # The check request is published to a Transport pipe, for each
646
647
  # of the check `:subscribers` in its definition, eg. "webserver".
647
648
  # JSON serialization is used when publishing the check request
648
- # payload to the transport pipes. Transport errors are logged.
649
+ # payload to the Transport pipes. Transport errors are logged.
649
650
  #
650
651
  # @param check [Hash] definition.
651
652
  def publish_check_request(check)
@@ -727,12 +728,12 @@ module Sensu
727
728
  schedule_check_executions(standard_checks + extension_checks)
728
729
  end
729
730
 
730
- # Publish a check result to the transport for processing. A
731
+ # Publish a check result to the Transport for processing. A
731
732
  # check result is composed of a client name and a check
732
733
  # definition, containing check `:output` and `:status`. A client
733
734
  # signature is added to the check result payload if one is
734
735
  # registered for the client. JSON serialization is used when
735
- # publishing the check result payload to the transport pipe.
736
+ # publishing the check result payload to the Transport pipe.
736
737
  # Transport errors are logged.
737
738
  #
738
739
  # @param client_name [String]
@@ -1076,7 +1077,7 @@ module Sensu
1076
1077
  end
1077
1078
 
1078
1079
  # Start the Sensu server process, connecting to Redis, the
1079
- # transport, and calling the `bootstrap()` method.
1080
+ # Transport, and calling the `bootstrap()` method.
1080
1081
  def start
1081
1082
  setup_connections do
1082
1083
  bootstrap
data/sensu.gemspec CHANGED
@@ -4,7 +4,6 @@ require File.join(File.dirname(__FILE__), "lib", "sensu", "constants")
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "sensu"
6
6
  s.version = Sensu::VERSION
7
- s.platform = RUBY_PLATFORM =~ /java/ ? Gem::Platform::JAVA : Gem::Platform::RUBY
8
7
  s.authors = ["Sean Porter", "Justin Kolberg"]
9
8
  s.email = ["portertech@gmail.com", "amdprophet@gmail.com"]
10
9
  s.homepage = "http://sensuapp.org"
@@ -22,9 +21,7 @@ Gem::Specification.new do |s|
22
21
  s.add_dependency "sensu-transport", "6.0.0"
23
22
  s.add_dependency "sensu-spawn", "2.2.0"
24
23
  s.add_dependency "sensu-redis", "1.4.0"
25
- s.add_dependency "sinatra", "1.4.6"
26
- s.add_dependency "async_sinatra", "1.2.0"
27
- s.add_dependency "thin", "1.6.4" unless RUBY_PLATFORM =~ /java/
24
+ s.add_dependency "em-http-server", "0.1.8"
28
25
 
29
26
  s.add_development_dependency "rake", "10.5.0"
30
27
  s.add_development_dependency "rspec", "~> 3.0.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.24.1
4
+ version: 0.25.0.beta
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-06-07 00:00:00.000000000 Z
12
+ date: 2016-06-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
@@ -138,47 +138,19 @@ dependencies:
138
138
  - !ruby/object:Gem::Version
139
139
  version: 1.4.0
140
140
  - !ruby/object:Gem::Dependency
141
- name: sinatra
141
+ name: em-http-server
142
142
  requirement: !ruby/object:Gem::Requirement
143
143
  requirements:
144
144
  - - '='
145
145
  - !ruby/object:Gem::Version
146
- version: 1.4.6
146
+ version: 0.1.8
147
147
  type: :runtime
148
148
  prerelease: false
149
149
  version_requirements: !ruby/object:Gem::Requirement
150
150
  requirements:
151
151
  - - '='
152
152
  - !ruby/object:Gem::Version
153
- version: 1.4.6
154
- - !ruby/object:Gem::Dependency
155
- name: async_sinatra
156
- requirement: !ruby/object:Gem::Requirement
157
- requirements:
158
- - - '='
159
- - !ruby/object:Gem::Version
160
- version: 1.2.0
161
- type: :runtime
162
- prerelease: false
163
- version_requirements: !ruby/object:Gem::Requirement
164
- requirements:
165
- - - '='
166
- - !ruby/object:Gem::Version
167
- version: 1.2.0
168
- - !ruby/object:Gem::Dependency
169
- name: thin
170
- requirement: !ruby/object:Gem::Requirement
171
- requirements:
172
- - - '='
173
- - !ruby/object:Gem::Version
174
- version: 1.6.4
175
- type: :runtime
176
- prerelease: false
177
- version_requirements: !ruby/object:Gem::Requirement
178
- requirements:
179
- - - '='
180
- - !ruby/object:Gem::Version
181
- version: 1.6.4
153
+ version: 0.1.8
182
154
  - !ruby/object:Gem::Dependency
183
155
  name: rake
184
156
  requirement: !ruby/object:Gem::Requirement
@@ -255,7 +227,23 @@ files:
255
227
  - exe/sensu-install
256
228
  - exe/sensu-server
257
229
  - lib/sensu.rb
230
+ - lib/sensu/api/http_handler.rb
258
231
  - lib/sensu/api/process.rb
232
+ - lib/sensu/api/routes.rb
233
+ - lib/sensu/api/routes/aggregates.rb
234
+ - lib/sensu/api/routes/checks.rb
235
+ - lib/sensu/api/routes/clients.rb
236
+ - lib/sensu/api/routes/events.rb
237
+ - lib/sensu/api/routes/health.rb
238
+ - lib/sensu/api/routes/info.rb
239
+ - lib/sensu/api/routes/request.rb
240
+ - lib/sensu/api/routes/resolve.rb
241
+ - lib/sensu/api/routes/results.rb
242
+ - lib/sensu/api/routes/stashes.rb
243
+ - lib/sensu/api/utilities/publish_check_request.rb
244
+ - lib/sensu/api/utilities/publish_check_result.rb
245
+ - lib/sensu/api/utilities/resolve_event.rb
246
+ - lib/sensu/api/utilities/transport_info.rb
259
247
  - lib/sensu/api/validators.rb
260
248
  - lib/sensu/cli.rb
261
249
  - lib/sensu/client/process.rb
@@ -285,9 +273,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
285
273
  version: '0'
286
274
  required_rubygems_version: !ruby/object:Gem::Requirement
287
275
  requirements:
288
- - - ">="
276
+ - - ">"
289
277
  - !ruby/object:Gem::Version
290
- version: '0'
278
+ version: 1.3.1
291
279
  requirements: []
292
280
  rubyforge_project:
293
281
  rubygems_version: 2.6.3