class LogStash::Outputs::NagiosNsca

The nagios_nsca output is used for sending passive check results to Nagios through the NSCA protocol.

This is useful if your Nagios server is not the same as the source host from where you want to send logs or alerts. If you only have one server, this output is probably overkill # for you, take a look at the 'nagios' output instead.

Here is a sample config using the nagios_nsca output:

source,ruby

output {

nagios_nsca {
  # specify the hostname or ip of your nagios server
  host => "nagios.example.com"

  # specify the port to connect to
  port => 5667
}

}

Public Instance Methods

cmd() click to toggle source
# File lib/logstash/outputs/nagios_nsca.rb, line 127
def cmd
  return @cmd if @cmd
  @cmd = [@send_nsca_bin, "-H", @host, "-p", @port, "-d", ":"]
  @cmd = @cmd + ["-c", @send_nsca_config]  if @send_nsca_config
  @cmd
end
command_file_exist?() click to toggle source
# File lib/logstash/outputs/nagios_nsca.rb, line 123
def command_file_exist?
  File.exists?(@send_nsca_bin)
end
receive(event) click to toggle source
# File lib/logstash/outputs/nagios_nsca.rb, line 67
def receive(event)
  # exit if type or tags don't match
  # catch logstash shutdown
  return if event == LogStash::SHUTDOWN

  # skip if 'send_nsca' binary doesn't exist
  if !command_file_exist?
    @logger.warn("Skipping nagios_nsca output; send_nsca_bin file is missing",
                 "send_nsca_bin" => @send_nsca_bin, "missed_event" => event)
    return
  end

  # interpolate params
  nagios_host = event.sprintf(@nagios_host)
  nagios_service = event.sprintf(@nagios_service)

  # escape basic things in the log message
  # TODO: find a way to escape the message correctly
  msg = event.sprintf(@message_format)
  msg.gsub!("\n", "<br/>")
  msg.gsub!("'", "&#146;")

  status = event.sprintf(@nagios_status)
  if status.to_i.to_s != status # Check it round-trips to int correctly
    msg = "status '#{status}' is not numeric"
    status = 2
  else
    status = status.to_i
    if status > 3 || status < 0
       msg "status must be > 0 and <= 3, not #{status}"
       status = 2
    end
  end

  # build the command
  # syntax: echo '<server>!<nagios_service>!<status>!<text>'  | \
  #           /usr/sbin/send_nsca -H <nagios_host> -d '!' -c <nsca_config>"

  message = "#{nagios_host}:#{nagios_service}:#{status}:#{msg}"

  @logger.debug("Running send_nsca command", :nagios_nsca_command => cmd.join(" "), :message => message)

  begin
    send_to_nagios(cmd, message)
  rescue => e
    @logger.warn(
      "Skipping nagios_nsca output; error calling send_nsca",
      :error => $!,
      :nagios_nsca_command => cmd.join(" "),
      :message => message,
      :missed_event => event
    )
    @logger.debug("Backtrace", :backtrace => e.backtrace)
  end
end
register() click to toggle source
# File lib/logstash/outputs/nagios_nsca.rb, line 62
def register
  #nothing for now
end
send_to_nagios(cmd, message) click to toggle source
# File lib/logstash/outputs/nagios_nsca.rb, line 134
def send_to_nagios(cmd, message)
  Open3.popen3(*cmd) do |i, o, e|
    i.puts(message)   
    i.close
  end
end