class LogStash::Outputs::DatadogMetrics

Default queue_size and timeframe are low in order to provide near realtime alerting. If you do not use Datadog for alerting, consider raising these thresholds.

Public Instance Methods

flush(events, final=false) click to toggle source
# File lib/logstash/outputs/datadog_metrics.rb, line 92
def flush(events, final=false)
  dd_series = Hash.new
  dd_series['series'] = []

  events.each do |event|
    begin
      dd_series['series'] << event
    rescue
      @logger.warn("Error adding event to series!", :exception => e)
      next
    end
  end

  request = Net::HTTP::Post.new("#{@uri.path}?api_key=#{@api_key}")

  begin
    request.body = dd_series.to_json
    request.add_field("Content-Type", 'application/json')
    response = @client.request(request)
    @logger.info("DD convo", :request => request.inspect, :response => response.inspect)
    raise unless response.code == '202'
  rescue Exception => e
    @logger.warn("Unhandled exception", :request => request.inspect, :response => response.inspect, :exception => e.inspect)
  end
end
receive(event) click to toggle source
# File lib/logstash/outputs/datadog_metrics.rb, line 68
def receive(event)
  return unless output?(event)
  return unless @metric_name && @metric_value && @metric_type
  return unless ["gauge", "counter"].include? event.sprintf(@metric_type)

  dd_metrics = Hash.new
  dd_metrics['metric'] = event.sprintf(@metric_name)
  dd_metrics['points'] = [[to_epoch(event.timestamp), event.sprintf(@metric_value).to_f]]
  dd_metrics['type'] = event.sprintf(@metric_type)
  dd_metrics['host'] = event.sprintf(@host)
  dd_metrics['device'] = event.sprintf(@device)

  if @dd_tags
    tagz = @dd_tags.collect {|x| event.sprintf(x) }
  else
    tagz = event["tags"]
  end
  dd_metrics['tags'] = tagz if tagz

  @logger.info("Queueing event", :event => dd_metrics)
  buffer_receive(dd_metrics)
end
register() click to toggle source
# File lib/logstash/outputs/datadog_metrics.rb, line 49
def register
  require 'time'
  require "net/https"
  require "uri"

  @url = "https://app.datadoghq.com/api/v1/series"
  @uri = URI.parse(@url)
  @client = Net::HTTP.new(@uri.host, @uri.port)
  @client.use_ssl = true
  @client.verify_mode = OpenSSL::SSL::VERIFY_NONE
  @logger.debug("Client", :client => @client.inspect)
  buffer_initialize(
    :max_items => @queue_size,
    :max_interval => @timeframe,
    :logger => @logger
  )
end

Private Instance Methods

to_epoch(t) click to toggle source
# File lib/logstash/outputs/datadog_metrics.rb, line 119
def to_epoch(t)
  return t.is_a?(Time) ? t.to_i : Time.parse(t).to_i
end