Module: Sensu::Server::Handle

Included in:
Process
Defined in:
lib/sensu/server/handle.rb

Instance Method Summary collapse

Instance Method Details

#handle_event(handler, event_data, event_id) ⇒ Object

Handle an event, providing event data to an event handler. This method logs event data and the handler definition at the debug log level, then calls the ‘handler_type_router()` method.

Parameters:

  • handler (Hash)

    definition.

  • event_data (Object)

    to pass to an event handler.

  • event_id (String)

    event UUID



168
169
170
171
172
173
174
175
176
# File 'lib/sensu/server/handle.rb', line 168

def handle_event(handler, event_data, event_id)
  definition = handler.is_a?(Hash) ? handler : handler.definition
  @logger.debug("handling event", {
    :event_data => event_data,
    :event => { :id => event_id },
    :handler => definition
  })
  handler_type_router(handler, event_data, event_id)
end

#handler_error(handler, event_data) ⇒ Proc

Create a handler error callback, for logging the error and decrementing the ‘@in_progress` by `1`.

Parameters:

  • handler (Object)
  • event_data (Object)

Returns:

  • (Proc)

    error callback.



12
13
14
15
16
17
18
19
20
21
# File 'lib/sensu/server/handle.rb', line 12

def handler_error(handler, event_data)
  Proc.new do |error|
    @logger.error("handler error", {
      :handler => handler,
      :event_data => event_data,
      :error => error.to_s
    })
    @in_progress[:events] -= 1 if @in_progress
  end
end

#handler_extension(handler, event_data, event_id) ⇒ Object

Run a handler extension, within the Sensu EventMachine reactor (event loop). The extension API ‘safe_run()` method is used to guard against most errors. The `safe_run()` callback is always called, logging the extension run output and status, and decrementing the `@in_progress` by `1`.

Parameters:

  • handler (Hash)

    definition.

  • event_data (Object)

    to pass to the handler extension.

  • event_id (String)

    event UUID



127
128
129
130
131
132
133
134
135
136
137
# File 'lib/sensu/server/handle.rb', line 127

def handler_extension(handler, event_data, event_id)
  handler.safe_run(event_data) do |output, status|
    @logger.info("handler extension output", {
      :extension => handler.definition,
      :event => { :id => event_id },
      :output => output,
      :status => status
    })
    @in_progress[:events] -= 1 if @in_progress
  end
end

#handler_type_router(handler, event_data, event_id) ⇒ Object

Route the event data to the appropriate handler type method. Routing is done using the handler definition, ‘:type`.

Parameters:

  • handler (Hash)

    definition.

  • event_data (Object)

    to pass to the handler type method.

  • event_id (String)

    event UUID



145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/sensu/server/handle.rb', line 145

def handler_type_router(handler, event_data, event_id)
  case handler[:type]
  when "pipe"
    pipe_handler(handler, event_data, event_id)
  when "tcp"
    tcp_handler(handler, event_data)
  when "udp"
    udp_handler(handler, event_data)
  when "transport"
    transport_handler(handler, event_data)
  when "extension"
    handler_extension(handler, event_data, event_id)
  end
end

#pipe_handler(handler, event_data, event_id) ⇒ Object

Execute a pipe event handler, using the defined handler command to spawn a process, passing it event data via STDIN. Log the handler output lines and decrement the ‘@in_progress` by `1` when the handler executes successfully.

When the spawned process exits with status 0, its output is logged at :info level. Otherwise, its output is logged at :error level.

Parameters:

  • handler (Hash)

    definition.

  • event_data (Object)

    provided to the spawned handler process via STDIN.

  • event_id (String)

    event UUID



37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/sensu/server/handle.rb', line 37

def pipe_handler(handler, event_data, event_id)
  options = {:data => event_data, :timeout => handler[:timeout]}
  Spawn.process(handler[:command], options) do |output, status|
    log_level = status == 0 ? :info : :error
    @logger.send(log_level, "handler output", {
      :handler => handler,
      :event => { :id => event_id },
      :output => output.split("\n+")
    })
    @in_progress[:events] -= 1 if @in_progress
  end
end

#tcp_handler(handler, event_data) ⇒ Object

Connect to a TCP socket and transmit event data to it, then close the connection. The ‘Sensu::Server::Socket` connection handler is used for the socket. The socket timeouts are configurable via the handler definition, `:timeout`. The `handler_error()` method is used to create the `on_error` callback for the connection handler. The `on_error` callback is call in the event of any error(s). The `@in_progress` is decremented by `1` when the data is transmitted successfully, `on_success`.

Parameters:

  • handler (Hash)

    definition.

  • event_data (Object)

    to transmit to the TCP socket.



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/sensu/server/handle.rb', line 62

def tcp_handler(handler, event_data)
  on_error = handler_error(handler, event_data)
  begin
    EM::connect(handler[:socket][:host], handler[:socket][:port], Socket) do |socket|
      socket.on_success = Proc.new do
        @in_progress[:events] -= 1 if @in_progress
      end
      socket.on_error = on_error
      timeout = handler[:timeout] || 10
      socket.set_timeout(timeout)
      socket.send_data(event_data.to_s)
      socket.close_connection_after_writing
    end
  rescue => error
    on_error.call(error)
  end
end

#transport_handler(handler, event_data) ⇒ Object

Publish event data to a Sensu transport pipe. Event data that is ‘nil` or empty will not be published, to prevent transport errors. The `@in_progress` is decremented by `1`, even if the event data is not published.

Parameters:

  • handler (Hash)

    definition.

  • event_data (Object)

    to publish to the transport pipe.



105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/sensu/server/handle.rb', line 105

def transport_handler(handler, event_data)
  unless event_data.nil? || event_data.empty?
    pipe = handler[:pipe]
    pipe_options = pipe[:options] || {}
    @transport.publish(pipe[:type].to_sym, pipe[:name], event_data, pipe_options) do |info|
      if info[:error]
        handler_error(handler, event_data).call(info[:error])
      end
    end
  end
  @in_progress[:events] -= 1 if @in_progress
end

#udp_handler(handler, event_data) ⇒ Object

Transmit event data to a UDP socket, then close the connection. The ‘@in_progress` is decremented by `1` when the data is assumed to have been transmitted.

Parameters:

  • handler (Hash)

    definition.

  • event_data (Object)

    to transmit to the UDP socket.



86
87
88
89
90
91
92
93
94
95
96
# File 'lib/sensu/server/handle.rb', line 86

def udp_handler(handler, event_data)
  begin
    EM::open_datagram_socket("0.0.0.0", 0, nil) do |socket|
      socket.send_datagram(event_data.to_s, handler[:socket][:host], handler[:socket][:port])
      socket.close_connection_after_writing
      @in_progress[:events] -= 1 if @in_progress
    end
  rescue => error
    handler_error(handler, event_data).call(error)
  end
end