class LogStash::Outputs::Nagios

The nagios output is used for sending passive check results to nagios via the nagios command file.

For this output to work, your event must have the following fields:

* "nagios_host"
* "nagios_service"

These fields are supported, but optional:

* "nagios_annotation"
* "nagios_level"

There are two configuration options:

* commandfile - The location of the Nagios external command file
* nagios_level - Specifies the level of the check to be sent. Defaults to
  CRITICAL and can be overriden by setting the "nagios_level" field to one
  of "OK", "WARNING", "CRITICAL", or "UNKNOWN" 

       match => [ "message", "(error|ERROR|CRITICAL)" ]

   output{
     if [message] =~ /(error|ERROR|CRITICAL)/ {
       nagios {
         # your config here
       }
     }
   }

Public Instance Methods

receive(event) click to toggle source
# File lib/logstash/outputs/nagios.rb, line 52
def receive(event)
  return unless output?(event)

  if !File.exists?(@commandfile)
    @logger.warn("Skipping nagios output; command file is missing",
                 :commandfile => @commandfile, :missed_event => event)
    return
  end

  # TODO(petef): if nagios_host/nagios_service both have more than one
  # value, send multiple alerts. They will have to match up together by
  # array indexes (host/service combos) and the arrays must be the same
  # length.

  host = event["nagios_host"]
  if !host
    @logger.warn("Skipping nagios output; nagios_host field is missing",
                 :missed_event => event)
    return
  end

  service = event["nagios_service"]
  if !service
    @logger.warn("Skipping nagios output; nagios_service field is missing",
                 "missed_event" => event)
    return
  end

  annotation = event["nagios_annotation"]
  level = @nagios_level

  if event["nagios_level"]
    event_level = [*event["nagios_level"]]
    case event_level[0].downcase
    when "ok"
      level = "0"
    when "warning"
      level = "1"
    when "critical"
      level = "2"
    when "unknown"
      level = "3"
    else
      @logger.warn("Invalid Nagios level. Defaulting to CRITICAL", :data => event_level)
    end
  end

  cmd = "[#{Time.now.to_i}] PROCESS_SERVICE_CHECK_RESULT;#{host};#{service};#{level};"
  if annotation
    cmd += "#{annotation}: "
  end
  # In the multi-line case, escape the newlines for the nagios command file
  cmd += (event["message"] || "<no message>").gsub("\n", "\\n")

  @logger.debug("Opening nagios command file", :commandfile => @commandfile,
                :nagios_command => cmd)
  begin
    File.open(@commandfile, "r+") do |f|
      f.puts(cmd)
      f.flush # TODO(sissel): probably don't need this.
    end
  rescue => e
    @logger.warn("Skipping nagios output; error writing to command file",
                 :commandfile => @commandfile, :missed_event => event,
                 :exception => e, :backtrace => e.backtrace)
  end
end
register() click to toggle source
# File lib/logstash/outputs/nagios.rb, line 47
def register
  # nothing to do
end