sensu 0.18.0.beta-java → 0.18.0-java
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 +4 -4
 - data/CHANGELOG.md +21 -1
 - data/lib/sensu/api/process.rb +8 -3
 - data/lib/sensu/client/process.rb +26 -4
 - data/lib/sensu/constants.rb +1 -1
 - data/lib/sensu/daemon.rb +2 -2
 - data/lib/sensu/server/process.rb +57 -55
 - data/sensu.gemspec +1 -1
 - metadata +6 -6
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: b150f73c2e45b7029bca9d36d73c996538651606
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 1254668b8bca3643d8303c75bb9ab4e363e1d56f
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 6b775fe6458441e6a0ca1fdd5168ae716f125dc7d87daf0f7b6d6833c78300cab22028940bb229cb44afd57a15fe263f7080ec272253c98ace43cc0fd37a256f
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: fa6908053402fc2bc1fb443d4174ff5044b334e01fadf9440f2fb39a8e2d32341ac7b90ff6f0b8a21a87588991ac8f2fcbff13e21ee0661479b1bd4deb4203b3
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,4 +1,4 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            ## 0.18.0 -  
     | 
| 
      
 1 
     | 
    
         
            +
            ## 0.18.0 - 2015-05-05
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            ### Features
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
         @@ -13,6 +13,26 @@ Storing the latest check result for every client/check pair. This data is 
     | 
|
| 
       13 
13 
     | 
    
         
             
            currently exposed via the API at `/clients/:client/history` and will be
         
     | 
| 
       14 
14 
     | 
    
         
             
            used by several upcoming features.
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
      
 16 
     | 
    
         
            +
            The Sensu API now listens on TCP port `4567` by default.
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            Sensu server leader election lock timestamps now include milliseconds to
         
     | 
| 
      
 19 
     | 
    
         
            +
            reduce the chance of a conflict when attempting to elect a new leader.
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            Sensu transport "reconnect_on_error" now defaults to `true`. For the
         
     | 
| 
      
 22 
     | 
    
         
            +
            RabbitMQ transport, this means AMQP channel errors will result in a
         
     | 
| 
      
 23 
     | 
    
         
            +
            reconnect. The Sensu transport will always reconnect when there is a loss
         
     | 
| 
      
 24 
     | 
    
         
            +
            of connectivity.
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            ### Other
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            The Sensu client sockets (TCP/UDP) are now stopped/closed before the
         
     | 
| 
      
 29 
     | 
    
         
            +
            process is stopped.
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            Sensu server "master" election is now "leader" election.
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            Configuration file encoding is now forced to 8-bit ASCII and UTF-8 BOMs
         
     | 
| 
      
 34 
     | 
    
         
            +
            are removed if present.
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
       16 
36 
     | 
    
         
             
            ## 0.17.2 - 2015-04-08
         
     | 
| 
       17 
37 
     | 
    
         | 
| 
       18 
38 
     | 
    
         
             
            ### Other
         
     | 
    
        data/lib/sensu/api/process.rb
    CHANGED
    
    | 
         @@ -40,7 +40,7 @@ module Sensu 
     | 
|
| 
       40 
40 
     | 
    
         
             
                      setup_logger(options)
         
     | 
| 
       41 
41 
     | 
    
         
             
                      set :logger, @logger
         
     | 
| 
       42 
42 
     | 
    
         
             
                      load_settings(options)
         
     | 
| 
       43 
     | 
    
         
            -
                      set :api, @settings[:api]
         
     | 
| 
      
 43 
     | 
    
         
            +
                      set :api, @settings[:api] || {}
         
     | 
| 
       44 
44 
     | 
    
         
             
                      set :checks, @settings[:checks]
         
     | 
| 
       45 
45 
     | 
    
         
             
                      set :all_checks, @settings.checks
         
     | 
| 
       46 
46 
     | 
    
         
             
                      set :cors, @settings[:cors] || {
         
     | 
| 
         @@ -55,8 +55,13 @@ module Sensu 
     | 
|
| 
       55 
55 
     | 
    
         | 
| 
       56 
56 
     | 
    
         
             
                    def start_server
         
     | 
| 
       57 
57 
     | 
    
         
             
                      Thin::Logging.silent = true
         
     | 
| 
       58 
     | 
    
         
            -
                      bind =  
     | 
| 
       59 
     | 
    
         
            -
                       
     | 
| 
      
 58 
     | 
    
         
            +
                      bind = settings.api[:bind] || "0.0.0.0"
         
     | 
| 
      
 59 
     | 
    
         
            +
                      port = settings.api[:port] || 4567
         
     | 
| 
      
 60 
     | 
    
         
            +
                      @logger.info("api listening", {
         
     | 
| 
      
 61 
     | 
    
         
            +
                        :bind => bind,
         
     | 
| 
      
 62 
     | 
    
         
            +
                        :port => port
         
     | 
| 
      
 63 
     | 
    
         
            +
                      })
         
     | 
| 
      
 64 
     | 
    
         
            +
                      @thin = Thin::Server.new(bind, port, self)
         
     | 
| 
       60 
65 
     | 
    
         
             
                      @thin.start
         
     | 
| 
       61 
66 
     | 
    
         
             
                    end
         
     | 
| 
       62 
67 
     | 
    
         | 
    
        data/lib/sensu/client/process.rb
    CHANGED
    
    | 
         @@ -22,13 +22,14 @@ module Sensu 
     | 
|
| 
       22 
22 
     | 
    
         
             
                  end
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
24 
     | 
    
         
             
                  # Override Daemon initialize() to support Sensu client check
         
     | 
| 
       25 
     | 
    
         
            -
                  # execution safe mode  
     | 
| 
      
 25 
     | 
    
         
            +
                  # execution safe mode, checks in progress, and open sockets.
         
     | 
| 
       26 
26 
     | 
    
         
             
                  #
         
     | 
| 
       27 
27 
     | 
    
         
             
                  # @param options [Hash]
         
     | 
| 
       28 
28 
     | 
    
         
             
                  def initialize(options={})
         
     | 
| 
       29 
29 
     | 
    
         
             
                    super
         
     | 
| 
       30 
30 
     | 
    
         
             
                    @safe_mode = @settings[:client][:safe_mode] || false
         
     | 
| 
       31 
31 
     | 
    
         
             
                    @checks_in_progress = []
         
     | 
| 
      
 32 
     | 
    
         
            +
                    @sockets = []
         
     | 
| 
       32 
33 
     | 
    
         
             
                  end
         
     | 
| 
       33 
34 
     | 
    
         | 
| 
       34 
35 
     | 
    
         
             
                  # Create a Sensu client keepalive payload, to be sent over the
         
     | 
| 
         @@ -315,18 +316,21 @@ module Sensu 
     | 
|
| 
       315 
316 
     | 
    
         
             
                  # TCP & UDP port 3030. The socket can be configured via the
         
     | 
| 
       316 
317 
     | 
    
         
             
                  # client definition, `:socket` with `:bind` and `:port`. The
         
     | 
| 
       317 
318 
     | 
    
         
             
                  # current instance of the Sensu logger, settings, and transport
         
     | 
| 
       318 
     | 
    
         
            -
                  # are passed to the socket handler, `Sensu::Client::Socket`.
         
     | 
| 
      
 319 
     | 
    
         
            +
                  # are passed to the socket handler, `Sensu::Client::Socket`. The
         
     | 
| 
      
 320 
     | 
    
         
            +
                  # TCP socket server signature (Fixnum) and UDP connection object
         
     | 
| 
      
 321 
     | 
    
         
            +
                  # are stored in `@sockets`, so that they can be managed
         
     | 
| 
      
 322 
     | 
    
         
            +
                  # elsewhere, eg. `close_sockets()`.
         
     | 
| 
       319 
323 
     | 
    
         
             
                  def setup_sockets
         
     | 
| 
       320 
324 
     | 
    
         
             
                    options = @settings[:client][:socket] || Hash.new
         
     | 
| 
       321 
325 
     | 
    
         
             
                    options[:bind] ||= "127.0.0.1"
         
     | 
| 
       322 
326 
     | 
    
         
             
                    options[:port] ||= 3030
         
     | 
| 
       323 
327 
     | 
    
         
             
                    @logger.debug("binding client tcp and udp sockets", :options => options)
         
     | 
| 
       324 
     | 
    
         
            -
                    EM::start_server(options[:bind], options[:port], Socket) do |socket|
         
     | 
| 
      
 328 
     | 
    
         
            +
                    @sockets << EM::start_server(options[:bind], options[:port], Socket) do |socket|
         
     | 
| 
       325 
329 
     | 
    
         
             
                      socket.logger = @logger
         
     | 
| 
       326 
330 
     | 
    
         
             
                      socket.settings = @settings
         
     | 
| 
       327 
331 
     | 
    
         
             
                      socket.transport = @transport
         
     | 
| 
       328 
332 
     | 
    
         
             
                    end
         
     | 
| 
       329 
     | 
    
         
            -
                    EM::open_datagram_socket(options[:bind], options[:port], Socket) do |socket|
         
     | 
| 
      
 333 
     | 
    
         
            +
                    @sockets << EM::open_datagram_socket(options[:bind], options[:port], Socket) do |socket|
         
     | 
| 
       330 
334 
     | 
    
         
             
                      socket.logger = @logger
         
     | 
| 
       331 
335 
     | 
    
         
             
                      socket.settings = @settings
         
     | 
| 
       332 
336 
     | 
    
         
             
                      socket.transport = @transport
         
     | 
| 
         @@ -352,6 +356,23 @@ module Sensu 
     | 
|
| 
       352 
356 
     | 
    
         
             
                    end
         
     | 
| 
       353 
357 
     | 
    
         
             
                  end
         
     | 
| 
       354 
358 
     | 
    
         | 
| 
      
 359 
     | 
    
         
            +
                  # Close the Sensu client TCP and UDP sockets. This method
         
     | 
| 
      
 360 
     | 
    
         
            +
                  # iterates through `@sockets`, which contains socket server
         
     | 
| 
      
 361 
     | 
    
         
            +
                  # signatures (Fixnum) and connection objects. A signature
         
     | 
| 
      
 362 
     | 
    
         
            +
                  # indicates a TCP socket server that needs to be stopped. A
         
     | 
| 
      
 363 
     | 
    
         
            +
                  # connection object indicates a socket connection that needs to
         
     | 
| 
      
 364 
     | 
    
         
            +
                  # be closed, eg. a UDP datagram socket.
         
     | 
| 
      
 365 
     | 
    
         
            +
                  def close_sockets
         
     | 
| 
      
 366 
     | 
    
         
            +
                    @logger.info("closing client tcp and udp sockets")
         
     | 
| 
      
 367 
     | 
    
         
            +
                    @sockets.each do |socket|
         
     | 
| 
      
 368 
     | 
    
         
            +
                      if socket.is_a?(Numeric)
         
     | 
| 
      
 369 
     | 
    
         
            +
                        EM.stop_server(socket)
         
     | 
| 
      
 370 
     | 
    
         
            +
                      else
         
     | 
| 
      
 371 
     | 
    
         
            +
                        socket.close_connection
         
     | 
| 
      
 372 
     | 
    
         
            +
                      end
         
     | 
| 
      
 373 
     | 
    
         
            +
                    end
         
     | 
| 
      
 374 
     | 
    
         
            +
                  end
         
     | 
| 
      
 375 
     | 
    
         
            +
             
     | 
| 
       355 
376 
     | 
    
         
             
                  # Bootstrap the Sensu client, setting up client keepalives,
         
     | 
| 
       356 
377 
     | 
    
         
             
                  # subscriptions, and standalone check executions. This method
         
     | 
| 
       357 
378 
     | 
    
         
             
                  # sets the process/daemon `@state` to `:running`.
         
     | 
| 
         @@ -415,6 +436,7 @@ module Sensu 
     | 
|
| 
       415 
436 
     | 
    
         
             
                    pause
         
     | 
| 
       416 
437 
     | 
    
         
             
                    @state = :stopping
         
     | 
| 
       417 
438 
     | 
    
         
             
                    complete_checks_in_progress do
         
     | 
| 
      
 439 
     | 
    
         
            +
                      close_sockets
         
     | 
| 
       418 
440 
     | 
    
         
             
                      @transport.close
         
     | 
| 
       419 
441 
     | 
    
         
             
                      super
         
     | 
| 
       420 
442 
     | 
    
         
             
                    end
         
     | 
    
        data/lib/sensu/constants.rb
    CHANGED
    
    
    
        data/lib/sensu/daemon.rb
    CHANGED
    
    | 
         @@ -4,7 +4,7 @@ gem "multi_json", "1.11.0" 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            gem "sensu-em", "2.4.1"
         
     | 
| 
       6 
6 
     | 
    
         
             
            gem "sensu-logger", "1.0.0"
         
     | 
| 
       7 
     | 
    
         
            -
            gem "sensu-settings", "1. 
     | 
| 
      
 7 
     | 
    
         
            +
            gem "sensu-settings", "1.8.0"
         
     | 
| 
       8 
8 
     | 
    
         
             
            gem "sensu-extension", "1.1.2"
         
     | 
| 
       9 
9 
     | 
    
         
             
            gem "sensu-extensions", "1.2.0"
         
     | 
| 
       10 
10 
     | 
    
         
             
            gem "sensu-transport", "2.4.0"
         
     | 
| 
         @@ -174,7 +174,7 @@ module Sensu 
     | 
|
| 
       174 
174 
     | 
    
         
             
                #
         
     | 
| 
       175 
175 
     | 
    
         
             
                # https://github.com/sensu/sensu-transport
         
     | 
| 
       176 
176 
     | 
    
         
             
                def setup_transport
         
     | 
| 
       177 
     | 
    
         
            -
                  transport_name = @settings[:transport][:name] 
     | 
| 
      
 177 
     | 
    
         
            +
                  transport_name = @settings[:transport][:name]
         
     | 
| 
       178 
178 
     | 
    
         
             
                  transport_settings = @settings[transport_name]
         
     | 
| 
       179 
179 
     | 
    
         
             
                  @logger.debug("connecting to transport", {
         
     | 
| 
       180 
180 
     | 
    
         
             
                    :name => transport_name,
         
     | 
    
        data/lib/sensu/server/process.rb
    CHANGED
    
    | 
         @@ -11,7 +11,7 @@ module Sensu 
     | 
|
| 
       11 
11 
     | 
    
         
             
                  include Mutate
         
     | 
| 
       12 
12 
     | 
    
         
             
                  include Handle
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
     | 
    
         
            -
                  attr_reader : 
     | 
| 
      
 14 
     | 
    
         
            +
                  attr_reader :is_leader, :handling_event_count
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                  # Create an instance of the Sensu server process, start the
         
     | 
| 
       17 
17 
     | 
    
         
             
                  # server within the EventMachine event loop, and set up server
         
     | 
| 
         @@ -26,14 +26,14 @@ module Sensu 
     | 
|
| 
       26 
26 
     | 
    
         
             
                    end
         
     | 
| 
       27 
27 
     | 
    
         
             
                  end
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
                  # Override Daemon initialize() to support Sensu server  
     | 
| 
      
 29 
     | 
    
         
            +
                  # Override Daemon initialize() to support Sensu server leader
         
     | 
| 
       30 
30 
     | 
    
         
             
                  # election and the handling event count.
         
     | 
| 
       31 
31 
     | 
    
         
             
                  #
         
     | 
| 
       32 
32 
     | 
    
         
             
                  # @param options [Hash]
         
     | 
| 
       33 
33 
     | 
    
         
             
                  def initialize(options={})
         
     | 
| 
       34 
34 
     | 
    
         
             
                    super
         
     | 
| 
       35 
     | 
    
         
            -
                    @ 
     | 
| 
       36 
     | 
    
         
            -
                    @timers[: 
     | 
| 
      
 35 
     | 
    
         
            +
                    @is_leader = false
         
     | 
| 
      
 36 
     | 
    
         
            +
                    @timers[:leader] = Array.new
         
     | 
| 
       37 
37 
     | 
    
         
             
                    @handling_event_count = 0
         
     | 
| 
       38 
38 
     | 
    
         
             
                  end
         
     | 
| 
       39 
39 
     | 
    
         | 
| 
         @@ -481,8 +481,8 @@ module Sensu 
     | 
|
| 
       481 
481 
     | 
    
         | 
| 
       482 
482 
     | 
    
         
             
                  # Schedule check executions, using EventMachine periodic timers,
         
     | 
| 
       483 
483 
     | 
    
         
             
                  # using a calculated execution splay. The timers are stored in
         
     | 
| 
       484 
     | 
    
         
            -
                  # the timers hash under `: 
     | 
| 
       485 
     | 
    
         
            -
                  # is a task for only the Sensu server  
     | 
| 
      
 484 
     | 
    
         
            +
                  # the timers hash under `:leader`, as check request publishing
         
     | 
| 
      
 485 
     | 
    
         
            +
                  # is a task for only the Sensu server leader, so they can be
         
     | 
| 
       486 
486 
     | 
    
         
             
                  # cancelled etc. Check requests are not published if subdued.
         
     | 
| 
       487 
487 
     | 
    
         
             
                  #
         
     | 
| 
       488 
488 
     | 
    
         
             
                  # @param checks [Array] of definitions.
         
     | 
| 
         @@ -497,9 +497,9 @@ module Sensu 
     | 
|
| 
       497 
497 
     | 
    
         
             
                      end
         
     | 
| 
       498 
498 
     | 
    
         
             
                      execution_splay = testing? ? 0 : calculate_check_execution_splay(check)
         
     | 
| 
       499 
499 
     | 
    
         
             
                      interval = testing? ? 0.5 : check[:interval]
         
     | 
| 
       500 
     | 
    
         
            -
                      @timers[: 
     | 
| 
      
 500 
     | 
    
         
            +
                      @timers[:leader] << EM::Timer.new(execution_splay) do
         
     | 
| 
       501 
501 
     | 
    
         
             
                        create_check_request.call
         
     | 
| 
       502 
     | 
    
         
            -
                        @timers[: 
     | 
| 
      
 502 
     | 
    
         
            +
                        @timers[:leader] << EM::PeriodicTimer.new(interval, &create_check_request)
         
     | 
| 
       503 
503 
     | 
    
         
             
                      end
         
     | 
| 
       504 
504 
     | 
    
         
             
                    end
         
     | 
| 
       505 
505 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -615,10 +615,10 @@ module Sensu 
     | 
|
| 
       615 
615 
     | 
    
         | 
| 
       616 
616 
     | 
    
         
             
                  # Set up the client monitor, a periodic timer to run
         
     | 
| 
       617 
617 
     | 
    
         
             
                  # `determine_stale_clients()` every 30 seconds. The timer is
         
     | 
| 
       618 
     | 
    
         
            -
                  # stored in the timers hash under `: 
     | 
| 
      
 618 
     | 
    
         
            +
                  # stored in the timers hash under `:leader`.
         
     | 
| 
       619 
619 
     | 
    
         
             
                  def setup_client_monitor
         
     | 
| 
       620 
620 
     | 
    
         
             
                    @logger.debug("monitoring client keepalives")
         
     | 
| 
       621 
     | 
    
         
            -
                    @timers[: 
     | 
| 
      
 621 
     | 
    
         
            +
                    @timers[:leader] << EM::PeriodicTimer.new(30) do
         
     | 
| 
       622 
622 
     | 
    
         
             
                      determine_stale_clients
         
     | 
| 
       623 
623 
     | 
    
         
             
                    end
         
     | 
| 
       624 
624 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -657,52 +657,53 @@ module Sensu 
     | 
|
| 
       657 
657 
     | 
    
         
             
                  # Set up the check result aggregation pruner, using periodic
         
     | 
| 
       658 
658 
     | 
    
         
             
                  # timer to run `prune_check_result_aggregations()` every 20
         
     | 
| 
       659 
659 
     | 
    
         
             
                  # seconds. The timer is stored in the timers hash under
         
     | 
| 
       660 
     | 
    
         
            -
                  # `: 
     | 
| 
      
 660 
     | 
    
         
            +
                  # `:leader`.
         
     | 
| 
       661 
661 
     | 
    
         
             
                  def setup_check_result_aggregation_pruner
         
     | 
| 
       662 
662 
     | 
    
         
             
                    @logger.debug("pruning check result aggregations")
         
     | 
| 
       663 
     | 
    
         
            -
                    @timers[: 
     | 
| 
      
 663 
     | 
    
         
            +
                    @timers[:leader] << EM::PeriodicTimer.new(20) do
         
     | 
| 
       664 
664 
     | 
    
         
             
                      prune_check_result_aggregations
         
     | 
| 
       665 
665 
     | 
    
         
             
                    end
         
     | 
| 
       666 
666 
     | 
    
         
             
                  end
         
     | 
| 
       667 
667 
     | 
    
         | 
| 
       668 
     | 
    
         
            -
                  # Set up the  
     | 
| 
      
 668 
     | 
    
         
            +
                  # Set up the leader duties, tasks only performed by a single
         
     | 
| 
       669 
669 
     | 
    
         
             
                  # Sensu server at a time. The duties include publishing check
         
     | 
| 
       670 
670 
     | 
    
         
             
                  # requests, monitoring for stale clients, and pruning check
         
     | 
| 
       671 
671 
     | 
    
         
             
                  # result aggregations.
         
     | 
| 
       672 
     | 
    
         
            -
                  def  
     | 
| 
      
 672 
     | 
    
         
            +
                  def leader_duties
         
     | 
| 
       673 
673 
     | 
    
         
             
                    setup_check_request_publisher
         
     | 
| 
       674 
674 
     | 
    
         
             
                    setup_client_monitor
         
     | 
| 
       675 
675 
     | 
    
         
             
                    setup_check_result_aggregation_pruner
         
     | 
| 
       676 
676 
     | 
    
         
             
                  end
         
     | 
| 
       677 
677 
     | 
    
         | 
| 
       678 
     | 
    
         
            -
                  # Request a  
     | 
| 
       679 
     | 
    
         
            -
                  # current process is the  
     | 
| 
      
 678 
     | 
    
         
            +
                  # Request a leader election, a process to determine if the
         
     | 
| 
      
 679 
     | 
    
         
            +
                  # current process is the leader Sensu server, with its
         
     | 
| 
       680 
680 
     | 
    
         
             
                  # own/unique duties. A Redis key/value is used as a central
         
     | 
| 
       681 
681 
     | 
    
         
             
                  # lock, using the "SETNX" Redis command to set the key/value if
         
     | 
| 
       682 
682 
     | 
    
         
             
                  # it does not exist, using a timestamp for the value. If the
         
     | 
| 
       683 
683 
     | 
    
         
             
                  # current process was able to create the key/value, it is the
         
     | 
| 
       684 
     | 
    
         
            -
                  #  
     | 
| 
      
 684 
     | 
    
         
            +
                  # leader, and must do the duties of the leader. If the current
         
     | 
| 
       685 
685 
     | 
    
         
             
                  # process was not able to create the key/value, but the current
         
     | 
| 
       686 
686 
     | 
    
         
             
                  # timestamp value is equal to or over 30 seconds ago, the
         
     | 
| 
       687 
687 
     | 
    
         
             
                  # "GETSET" Redis command is used to set a new timestamp and
         
     | 
| 
       688 
688 
     | 
    
         
             
                  # fetch the previous value to compare them, to determine if it
         
     | 
| 
       689 
689 
     | 
    
         
             
                  # was set by the current process. If the current process is able
         
     | 
| 
       690 
     | 
    
         
            -
                  # to set the timestamp value, it becomes the  
     | 
| 
       691 
     | 
    
         
            -
                  # has `@ 
     | 
| 
       692 
     | 
    
         
            -
                  def  
     | 
| 
       693 
     | 
    
         
            -
                    @redis.setnx("lock: 
     | 
| 
      
 690 
     | 
    
         
            +
                  # to set the timestamp value, it becomes the leader. The leader
         
     | 
| 
      
 691 
     | 
    
         
            +
                  # has `@is_leader` set to `true`.
         
     | 
| 
      
 692 
     | 
    
         
            +
                  def request_leader_election
         
     | 
| 
      
 693 
     | 
    
         
            +
                    @redis.setnx("lock:leader", Time.now.to_i) do |created|
         
     | 
| 
       694 
694 
     | 
    
         
             
                      if created
         
     | 
| 
       695 
     | 
    
         
            -
                        @ 
     | 
| 
       696 
     | 
    
         
            -
                        @logger.info("i am the  
     | 
| 
       697 
     | 
    
         
            -
                         
     | 
| 
      
 695 
     | 
    
         
            +
                        @is_leader = true
         
     | 
| 
      
 696 
     | 
    
         
            +
                        @logger.info("i am the leader")
         
     | 
| 
      
 697 
     | 
    
         
            +
                        leader_duties
         
     | 
| 
       698 
698 
     | 
    
         
             
                      else
         
     | 
| 
       699 
     | 
    
         
            -
                        @redis.get("lock: 
     | 
| 
       700 
     | 
    
         
            -
                           
     | 
| 
       701 
     | 
    
         
            -
             
     | 
| 
       702 
     | 
    
         
            -
             
     | 
| 
       703 
     | 
    
         
            -
             
     | 
| 
       704 
     | 
    
         
            -
                                @ 
     | 
| 
       705 
     | 
    
         
            -
                                 
     | 
| 
      
 699 
     | 
    
         
            +
                        @redis.get("lock:leader") do |current_timestamp|
         
     | 
| 
      
 700 
     | 
    
         
            +
                          lock_timestamp = (Time.now.to_f * 1000).to_i
         
     | 
| 
      
 701 
     | 
    
         
            +
                          if lock_timestamp - current_timestamp.to_i >= 30000
         
     | 
| 
      
 702 
     | 
    
         
            +
                            @redis.getset("lock:leader", lock_timestamp) do |previous_timestamp|
         
     | 
| 
      
 703 
     | 
    
         
            +
                              if previous_timestamp == current_timestamp
         
     | 
| 
      
 704 
     | 
    
         
            +
                                @is_leader = true
         
     | 
| 
      
 705 
     | 
    
         
            +
                                @logger.info("i am now the leader")
         
     | 
| 
      
 706 
     | 
    
         
            +
                                leader_duties
         
     | 
| 
       706 
707 
     | 
    
         
             
                              end
         
     | 
| 
       707 
708 
     | 
    
         
             
                            end
         
     | 
| 
       708 
709 
     | 
    
         
             
                          end
         
     | 
| 
         @@ -711,41 +712,42 @@ module Sensu 
     | 
|
| 
       711 
712 
     | 
    
         
             
                    end
         
     | 
| 
       712 
713 
     | 
    
         
             
                  end
         
     | 
| 
       713 
714 
     | 
    
         | 
| 
       714 
     | 
    
         
            -
                  # Set up the  
     | 
| 
       715 
     | 
    
         
            -
                  # ` 
     | 
| 
       716 
     | 
    
         
            -
                  # used to update the  
     | 
| 
       717 
     | 
    
         
            -
                  # process is the  
     | 
| 
      
 715 
     | 
    
         
            +
                  # Set up the leader monitor. A one-time timer is used to run
         
     | 
| 
      
 716 
     | 
    
         
            +
                  # `request_leader_exection()` in 2 seconds. A periodic timer is
         
     | 
| 
      
 717 
     | 
    
         
            +
                  # used to update the leader lock timestamp if the current
         
     | 
| 
      
 718 
     | 
    
         
            +
                  # process is the leader, or to run `request_leader_election(),
         
     | 
| 
       718 
719 
     | 
    
         
             
                  # every 10 seconds. The timers are stored in the timers hash
         
     | 
| 
       719 
720 
     | 
    
         
             
                  # under `:run`.
         
     | 
| 
       720 
     | 
    
         
            -
                  def  
     | 
| 
      
 721 
     | 
    
         
            +
                  def setup_leader_monitor
         
     | 
| 
       721 
722 
     | 
    
         
             
                    @timers[:run] << EM::Timer.new(2) do
         
     | 
| 
       722 
     | 
    
         
            -
                       
     | 
| 
      
 723 
     | 
    
         
            +
                      request_leader_election
         
     | 
| 
       723 
724 
     | 
    
         
             
                    end
         
     | 
| 
       724 
725 
     | 
    
         
             
                    @timers[:run] << EM::PeriodicTimer.new(10) do
         
     | 
| 
       725 
     | 
    
         
            -
                      if @ 
     | 
| 
       726 
     | 
    
         
            -
                         
     | 
| 
       727 
     | 
    
         
            -
             
     | 
| 
      
 726 
     | 
    
         
            +
                      if @is_leader
         
     | 
| 
      
 727 
     | 
    
         
            +
                        lock_timestamp = (Time.now.to_f * 1000).to_i
         
     | 
| 
      
 728 
     | 
    
         
            +
                        @redis.set("lock:leader", lock_timestamp) do
         
     | 
| 
      
 729 
     | 
    
         
            +
                          @logger.debug("updated leader lock timestamp")
         
     | 
| 
       728 
730 
     | 
    
         
             
                        end
         
     | 
| 
       729 
731 
     | 
    
         
             
                      else
         
     | 
| 
       730 
     | 
    
         
            -
                         
     | 
| 
      
 732 
     | 
    
         
            +
                        request_leader_election
         
     | 
| 
       731 
733 
     | 
    
         
             
                      end
         
     | 
| 
       732 
734 
     | 
    
         
             
                    end
         
     | 
| 
       733 
735 
     | 
    
         
             
                  end
         
     | 
| 
       734 
736 
     | 
    
         | 
| 
       735 
     | 
    
         
            -
                  # Resign as  
     | 
| 
       736 
     | 
    
         
            -
                  #  
     | 
| 
      
 737 
     | 
    
         
            +
                  # Resign as leader, if the current process is the Sensu server
         
     | 
| 
      
 738 
     | 
    
         
            +
                  # leader. This method cancels and clears the leader timers,
         
     | 
| 
       737 
739 
     | 
    
         
             
                  # those with references stored in the timers hash under
         
     | 
| 
       738 
     | 
    
         
            -
                  # `: 
     | 
| 
       739 
     | 
    
         
            -
                  def  
     | 
| 
       740 
     | 
    
         
            -
                    if @ 
     | 
| 
       741 
     | 
    
         
            -
                      @logger.warn("resigning as  
     | 
| 
       742 
     | 
    
         
            -
                      @timers[: 
     | 
| 
      
 740 
     | 
    
         
            +
                  # `:leader`, and `@is_leader`is set to `false`.
         
     | 
| 
      
 741 
     | 
    
         
            +
                  def resign_as_leader
         
     | 
| 
      
 742 
     | 
    
         
            +
                    if @is_leader
         
     | 
| 
      
 743 
     | 
    
         
            +
                      @logger.warn("resigning as leader")
         
     | 
| 
      
 744 
     | 
    
         
            +
                      @timers[:leader].each do |timer|
         
     | 
| 
       743 
745 
     | 
    
         
             
                        timer.cancel
         
     | 
| 
       744 
746 
     | 
    
         
             
                      end
         
     | 
| 
       745 
     | 
    
         
            -
                      @timers[: 
     | 
| 
       746 
     | 
    
         
            -
                      @ 
     | 
| 
      
 747 
     | 
    
         
            +
                      @timers[:leader].clear
         
     | 
| 
      
 748 
     | 
    
         
            +
                      @is_leader = false
         
     | 
| 
       747 
749 
     | 
    
         
             
                    else
         
     | 
| 
       748 
     | 
    
         
            -
                      @logger.debug("not currently  
     | 
| 
      
 750 
     | 
    
         
            +
                      @logger.debug("not currently leader")
         
     | 
| 
       749 
751 
     | 
    
         
             
                    end
         
     | 
| 
       750 
752 
     | 
    
         
             
                  end
         
     | 
| 
       751 
753 
     | 
    
         | 
| 
         @@ -777,13 +779,13 @@ module Sensu 
     | 
|
| 
       777 
779 
     | 
    
         
             
                  end
         
     | 
| 
       778 
780 
     | 
    
         | 
| 
       779 
781 
     | 
    
         
             
                  # Bootstrap the Sensu server process, setting up the keepalive
         
     | 
| 
       780 
     | 
    
         
            -
                  # and check result consumers, and attemping to become the  
     | 
| 
      
 782 
     | 
    
         
            +
                  # and check result consumers, and attemping to become the leader
         
     | 
| 
       781 
783 
     | 
    
         
             
                  # to carry out its duties. This method sets the process/daemon
         
     | 
| 
       782 
784 
     | 
    
         
             
                  # `@state` to `:running`.
         
     | 
| 
       783 
785 
     | 
    
         
             
                  def bootstrap
         
     | 
| 
       784 
786 
     | 
    
         
             
                    setup_keepalives
         
     | 
| 
       785 
787 
     | 
    
         
             
                    setup_results
         
     | 
| 
       786 
     | 
    
         
            -
                     
     | 
| 
      
 788 
     | 
    
         
            +
                    setup_leader_monitor
         
     | 
| 
       787 
789 
     | 
    
         
             
                    @state = :running
         
     | 
| 
       788 
790 
     | 
    
         
             
                  end
         
     | 
| 
       789 
791 
     | 
    
         | 
| 
         @@ -800,7 +802,7 @@ module Sensu 
     | 
|
| 
       800 
802 
     | 
    
         
             
                  # set to `:pausing`, to indicate that it's in progress. All run
         
     | 
| 
       801 
803 
     | 
    
         
             
                  # timers are cancelled, and the references are cleared. The
         
     | 
| 
       802 
804 
     | 
    
         
             
                  # Sensu server will unsubscribe from all transport
         
     | 
| 
       803 
     | 
    
         
            -
                  # subscriptions, resign as  
     | 
| 
      
 805 
     | 
    
         
            +
                  # subscriptions, resign as leader (if currently the leader),
         
     | 
| 
       804 
806 
     | 
    
         
             
                  # then set the process/daemon `@state` to `:paused`.
         
     | 
| 
       805 
807 
     | 
    
         
             
                  def pause
         
     | 
| 
       806 
808 
     | 
    
         
             
                    unless @state == :pausing || @state == :paused
         
     | 
| 
         @@ -810,7 +812,7 @@ module Sensu 
     | 
|
| 
       810 
812 
     | 
    
         
             
                      end
         
     | 
| 
       811 
813 
     | 
    
         
             
                      @timers[:run].clear
         
     | 
| 
       812 
814 
     | 
    
         
             
                      unsubscribe
         
     | 
| 
       813 
     | 
    
         
            -
                       
     | 
| 
      
 815 
     | 
    
         
            +
                      resign_as_leader
         
     | 
| 
       814 
816 
     | 
    
         
             
                      @state = :paused
         
     | 
| 
       815 
817 
     | 
    
         
             
                    end
         
     | 
| 
       816 
818 
     | 
    
         
             
                  end
         
     | 
    
        data/sensu.gemspec
    CHANGED
    
    | 
         @@ -19,7 +19,7 @@ Gem::Specification.new do |s| 
     | 
|
| 
       19 
19 
     | 
    
         
             
              s.add_dependency "eventmachine", "1.0.3"
         
     | 
| 
       20 
20 
     | 
    
         
             
              s.add_dependency "sensu-em", "2.4.1"
         
     | 
| 
       21 
21 
     | 
    
         
             
              s.add_dependency "sensu-logger", "1.0.0"
         
     | 
| 
       22 
     | 
    
         
            -
              s.add_dependency "sensu-settings", "1. 
     | 
| 
      
 22 
     | 
    
         
            +
              s.add_dependency "sensu-settings", "1.8.0"
         
     | 
| 
       23 
23 
     | 
    
         
             
              s.add_dependency "sensu-extension", "1.1.2"
         
     | 
| 
       24 
24 
     | 
    
         
             
              s.add_dependency "sensu-extensions", "1.2.0"
         
     | 
| 
       25 
25 
     | 
    
         
             
              s.add_dependency "sensu-transport", "2.4.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.18.0 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.18.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: java
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Sean Porter
         
     | 
| 
         @@ -9,7 +9,7 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire:
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date: 2015- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2015-05-06 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: multi_json
         
     | 
| 
         @@ -87,12 +87,12 @@ dependencies: 
     | 
|
| 
       87 
87 
     | 
    
         
             
                requirements:
         
     | 
| 
       88 
88 
     | 
    
         
             
                - - '='
         
     | 
| 
       89 
89 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       90 
     | 
    
         
            -
                    version: 1. 
     | 
| 
      
 90 
     | 
    
         
            +
                    version: 1.8.0
         
     | 
| 
       91 
91 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       92 
92 
     | 
    
         
             
                requirements:
         
     | 
| 
       93 
93 
     | 
    
         
             
                - - '='
         
     | 
| 
       94 
94 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       95 
     | 
    
         
            -
                    version: 1. 
     | 
| 
      
 95 
     | 
    
         
            +
                    version: 1.8.0
         
     | 
| 
       96 
96 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       97 
97 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       98 
98 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
         @@ -283,9 +283,9 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       283 
283 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       284 
284 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       285 
285 
     | 
    
         
             
              requirements:
         
     | 
| 
       286 
     | 
    
         
            -
              - - ' 
     | 
| 
      
 286 
     | 
    
         
            +
              - - '>='
         
     | 
| 
       287 
287 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       288 
     | 
    
         
            -
                  version:  
     | 
| 
      
 288 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
       289 
289 
     | 
    
         
             
            requirements: []
         
     | 
| 
       290 
290 
     | 
    
         
             
            rubyforge_project:
         
     | 
| 
       291 
291 
     | 
    
         
             
            rubygems_version: 2.1.9
         
     |