class LogStash::Outputs::OpenNMS

The OpenNMS output is used to send an event (xml document) to an OpenNMS server. The event `@timestamp` will automatically be associated with the OpenNMS item data.

NOTE: This plugin will log a warning if a necessary field is missing. It will not attempt to resend if OpenNMS is down, but will log an error message.

Public Instance Methods

field_check(event, fieldname) click to toggle source
# File lib/logstash/outputs/opennms.rb, line 98
def field_check(event, fieldname)
  if !event.get(fieldname)
    @logger.warn("Field referenced by #{fieldname} is missing")
    false
  else
    true
  end
end
format_request(message) click to toggle source

Build XML event document

# File lib/logstash/outputs/opennms.rb, line 154
def format_request(message)
  event_doc  = "<log>"
  event_doc += "<events>"
  event_doc += "<event>"
  event_doc += "<uei>" + message['uei'] + "</uei>"
  event_doc += "<source>" + message['source'] + "</source>"
  event_doc += "<nodeid>" + message['nodeid'] + "</nodeid>" if !message['nodeid'].empty?
  event_doc += "<time>" + Time.now.strftime("%A, %d %B %Y %H:%M:%S o'clock GMT") + "</time>"
  event_doc += "<host>" + message['origin'] + "</host>"
  event_doc += "<interface>" + message['interface'] + "</interface>" if !message['interface'].empty?
  event_doc += "<service>" + message ['service'] + "</service>" if !message['service'].empty?
  event_doc += "<parms>"
  #message['parms'].each do |parm_name, parm_value|
  message['parms_order'].each do |parm_name|
     parm_value = message['parms'][parm_name]
     next if parm_name == 'severity'
     event_doc += "<parm>"
     event_doc += "<parmName><![CDATA[" + parm_name + "]]></parmName>"
     event_doc += "<value type=\"string\" encoding=\"text\"><![CDATA[" + parm_value + "]]></value>"
     event_doc += "</parm>"
  end
  event_doc += "</parms>"
  #event_doc += "<descr>"    + message['description'] + "</descr>" if !message['description'].empty?
  event_doc += "<logmsg>"   + message['logmsg'] + "</logmsg>" if !message['logmsg'].empty?
  event_doc += "<severity>" + message['severity'] + "</severity>"
  event_doc += "</event>"
  event_doc += "</events>"
  event_doc += "</log>"
  xml_event = REXML::Document.new(event_doc)
end
kv_check(event, key_field, value_field) click to toggle source
# File lib/logstash/outputs/opennms.rb, line 108
def kv_check(event, key_field, value_field)
  errors = 0
  for field in [key_field, value_field]
    errors += 1 unless field_check(event, field)
  end
  errors < 1 ? true : false
end
receive(event) click to toggle source
# File lib/logstash/outputs/opennms.rb, line 218
def receive(event)
  #parms = validate_props(event,@opennms_event_parms)
  
  @logger.warn("======> BREAK-1")
  
  message_map = { 'host'        => @opennms_server_host.to_s,
                  'port'        => @opennms_server_port.to_s,
                  'timezone'    => @opennms_event_timezone.to_s,
                  'service'     => @opennms_event_service.to_s,
                  'nodeid'      => @opennms_event_nodeid.to_s,
                  'interface'   => @opennms_event_interface.to_s,
                  'uei'         => @opennms_event_uei.to_s,
                  'origin'      => @opennms_event_origin.to_s,
                  'severity'    => @opennms_event_severity.to_s,
                  'source'      => @opennms_event_source.to_s,
                  'description' => @opennms_event_description.to_s,
                  'logmsg'      => @opennms_event_logmsg.to_s,
                  'parms'       => @opennms_event_parms,
                  'parms_order' => @opennms_event_parms_order
  }
  
  @logger.warn("======> BREAK-2")  
 
  message = validate_props(event,message_map,{})
  
  @logger.warn("======> BREAK-3")  
               
  #message['parms'].each do |k,v|
  #   @logger.debug("Hash: " + k + " => " + v)
  #end

  #return unless field_check(event, @opennms_host)

  send_to_opennms(message)
  
end
register() click to toggle source
# File lib/logstash/outputs/opennms.rb, line 76
def register
  if !@opennms_key.nil? && !@multi_value.nil?
    @logger.warn("Cannot use multi_value in conjunction with opennms_key/opennms_value.  Ignoring opennms_key.")
  end
  
  if @opennms_event_parms.nil?
    @opennms_event_parms = { 'a' => '1', 'b' => '2', 'c' => '3' }
  end

  # We're only going to use @multi_value in the end, so let's build it from
  # @opennms_key and @opennms_value if it is empty (single value configuration).
  if @multi_value.nil?
    @multi_value = [ @opennms_key, @opennms_value ]
  end
  if @multi_value.length % 2 == 1
    raise LogStash::ConfigurationError, I18n.t("logstash.agent.configuration.invalid_plugin_register",
      :plugin => "output", :type => "opennms",
      :error => "Invalid opennms configuration #{@multi_value}. multi_value requires an even number of elements as ['opennms_key1', 'opennms_value1', 'opennms_key2', 'opennms_value2']")
  end
end
send_to_opennms(event) click to toggle source
# File lib/logstash/outputs/opennms.rb, line 202
def send_to_opennms(event)
  begin
    Timeout::timeout(@opennms_server_timeout) do
      tcp_send(event)
    end
  rescue Timeout::Error
    @logger.warn("Connection attempt to OpenNMS server timed out.",
      :server => @opennms_server_host,
      :port => @opennms_server_port.to_s,
      :timeout => @opennms_server_timeout.to_s
    )
    false
  end
end
tcp_send(message) click to toggle source
# File lib/logstash/outputs/opennms.rb, line 185
def tcp_send(message)
  begin
    @opennms_server_hosts.each do |server,port|
      TCPSocket.open(server,port) do |sock|
         xml_event = format_request(message).to_s
         logger.debug("XML Event: " + xml_event)
         sock.print xml_event
      end
    end
  rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ECONNRESET
    @logger.error("Connection error.  Unable to connect to OpenNMS server",
       :server => @opennms_server_hosts,
    )
    false
  end
end
validate_fields(event) click to toggle source
# File lib/logstash/outputs/opennms.rb, line 117
def validate_fields(event)
  found = []
  (0..@multi_value.length-1).step(2) do |idx|
    @logger.warn("---> " + @multi_value[idx].to_s)
    if kv_check(event, @multi_value[idx], @multi_value[idx+1])
      found << @multi_value[idx]
      found << @multi_value[idx+1]
    end
  end
  found
end
validate_props(event,props,found) click to toggle source
# File lib/logstash/outputs/opennms.rb, line 130
def validate_props(event,props,found)
  props.each do |props_key,props_value|
    @logger.warn("props_key: " + props_key.to_s)
    if props_value.is_a?(::Hash)
       found[props_key] = validate_props(event,props_value,{})
    elsif props_value.is_a?(::Array)
       found[props_key]=props_value
          elsif !props_value.nil? and props_value.to_s.length > 0
           @logger.warn("props_value: " + props_value.to_s)
           if !event.get(props_value)
       @logger.warn("Field referenced by #{props_value} is missing")
       found[props_key] = props_value.empty? ? "n/a" : props_value
     else
       found[props_key]=event.get(props_value)
     end
    else
       found[props_key]="n/a"
    end
  end
  found
end