Class: LogStash::Outputs::NagiosNsca

Inherits:
Base
  • Object
show all
Defined in:
lib/logstash/outputs/nagios_nsca.rb

Overview

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
  }
}

Instance Method Summary collapse

Instance Method Details

#cmdObject



127
128
129
130
131
132
# 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?Boolean

def receive

Returns:

  • (Boolean)


123
124
125
# File 'lib/logstash/outputs/nagios_nsca.rb', line 123

def command_file_exist?
  File.exists?(@send_nsca_bin)
end

#receive(event) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# 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

#registerObject



62
63
64
# File 'lib/logstash/outputs/nagios_nsca.rb', line 62

def register
  #nothing for now
end

#send_to_nagios(cmd, message) ⇒ Object



134
135
136
137
138
139
# 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