class LogStash::Outputs::GraphTastic

A plugin for a newly developed Java/Spring Metrics application I didn't really want to code this project but I couldn't find a respectable alternative that would also run on any Windows machine - which is the problem and why I am not going with Graphite and statsd. This application provides multiple integration options so as to make its use under your network requirements possible. This includes a REST option that is always enabled for your use in case you want to write a small script to send the occasional metric data.

Find GraphTastic here : github.com/NickPadilla/GraphTastic

Public Instance Methods

flushMetrics() click to toggle source
# File lib/logstash/outputs/graphtastic.rb, line 120
def flushMetrics()
  begin
    if @integration.downcase == "tcp"
      flushViaTCP()
    elsif @integration.downcase == "rmi"
      flushViaRMI()
    elsif @integration.downcase == "udp"
      flushViaUDP()
    elsif @integration.downcase == "rest"
      flushViaREST()
    else
      @logger.error("GraphTastic Not Able To Find Correct Integration - Nothing Sent - Integration Type : ", :@integration => @integration)
    end
    @batch.clear
  rescue
    @logger.error("*******ERROR :  #{$!}")
    @logger.info("*******Attempting #{@retry} out of #{@retries}")
    while @retry < @retries
      @retry = @retry + 1
      flushMetrics()
    end
  end
end
flushViaREST() click to toggle source

send metrics via REST

# File lib/logstash/outputs/graphtastic.rb, line 154
def flushViaREST()
  request = Net::HTTP::Put.new("/#{@context}/addMetric/#{@batch.join(',')}")
  response = @http.request(request)
  if response == 'ERROR'
    raise 'Error happend when sending metric to GraphTastic using REST!'
  end
  @logger.debug("GraphTastic Sent Message Using REST : #{@batch.join(',')}", :response => response.inspect)
end
flushViaRMI() click to toggle source

send metrics via RMI

# File lib/logstash/outputs/graphtastic.rb, line 164
def flushViaRMI()
  if RUBY_ENGINE != "jruby"
     raise Exception.new("LogStash::Outputs::GraphTastic# JRuby is needed for RMI to work!")
  end
  @remote.insertMetrics(@batch.join(','))
  @logger.debug("GraphTastic Sent Message Using RMI : #{@batch.join(',')}")
end
flushViaTCP() click to toggle source

send metrics via tcp

# File lib/logstash/outputs/graphtastic.rb, line 173
def flushViaTCP()
  # to correctly read the line we need to ensure we send \r\n at the end of every message.
  if @port.nil?
    @port = 1299
  end
  tcpsocket = TCPSocket.open(@host, @port)
  tcpsocket.send(@batch.join(',')+"\r\n", 0)
  tcpsocket.close
  @logger.debug("GraphTastic Sent Message Using TCP : #{@batch.join(',')}")
end
flushViaUDP() click to toggle source

send metrics via udp

# File lib/logstash/outputs/graphtastic.rb, line 145
def flushViaUDP()
  if @port.nil?
   @port = 1399
  end
  udpsocket.send(@batch.join(','), 0, @host, @port)
  @logger.debug("GraphTastic Sent Message Using UDP : #{@batch.join(',')}")
end
postMetric(name, metric, timestamp) click to toggle source
# File lib/logstash/outputs/graphtastic.rb, line 111
def postMetric(name, metric, timestamp)
  message = name + "," + metric + "," + timestamp.to_s
  if @batch.length < @batch_number
    @batch.push(message)
  else
    flushMetrics()
  end
end
receive(event) click to toggle source
# File lib/logstash/outputs/graphtastic.rb, line 97
def receive(event)
  # Set Intersection - returns a new array with the items that are the same between the two
  if !@tags.empty? && (event.get("tags") & @tags).size == 0
     # Skip events that have no tags in common with what we were configured
     @logger.debug("No Tags match for GraphTastic Output!")
     return
  end
  @retry = 1
  @logger.debug("Event found for GraphTastic!", :tags => @tags, :event => event)
  @metrics.each do |name, metric|
    postMetric(event.sprintf(name), event.sprintf(metric), (event.timestamp.to_i * 1000)) #unix_timestamp is what I need in seconds - multiply by 1000 to make milliseconds.
  end
end
register() click to toggle source
# File lib/logstash/outputs/graphtastic.rb, line 70
def register
  @batch = []
  begin
    if @integration.downcase == "rmi"
      if RUBY_ENGINE != "jruby"
         raise Exception.new("LogStash::Outputs::GraphTastic# JRuby is needed for RMI to work!")
      end
      require "java"
      if @port.nil?
        @port = 1199
      end
      registry = java.rmi.registry.LocateRegistry.getRegistry(@host, @port);
      @remote = registry.lookup("RmiMetricService")
    elsif @integration.downcase == "rest"
      require "net/http"
      if @port.nil?
        @port = 8080
        gem "mail" #outputs/email, # License: MIT License
      end
      @http = Net::HTTP.new(@host, @port)
    end
    @logger.info("GraphTastic Output Successfully Registered! Using #{@integration} Integration!")
  rescue
    @logger.error("*******ERROR :  #{$!}")
  end
end
udpsocket() click to toggle source
# File lib/logstash/outputs/graphtastic.rb, line 184
def udpsocket; @socket ||= UDPSocket.new end