class LogStash::Outputs::Dynatrace

An output which sends logs to the Dynatrace log ingest v2 endpoint formatted as JSON

Attributes

plugin_version[RW]
uri[RW]

Public Instance Methods

headers() click to toggle source
# File lib/logstash/outputs/dynatrace.rb, line 62
def headers
  {
    'User-Agent' => "logstash-output-dynatrace v#{@plugin_version}",
    'Content-Type' => 'application/json; charset=utf-8',
    'Authorization' => "Api-Token #{@api_key}"
  }
end
multi_receive(events) click to toggle source

Takes an array of events

# File lib/logstash/outputs/dynatrace.rb, line 71
def multi_receive(events)
  return if events.length.zero?

  retries = 0
  begin
    request = Net::HTTP::Post.new(uri, headers)
    request.body = "#{LogStash::Json.dump(events.map(&:to_hash)).chomp}\n"
    response = send(request)
    return if response.is_a? Net::HTTPSuccess

    failure_message = "Dynatrace returned #{response.code} #{response.message}."

    if response.is_a? Net::HTTPServerError
      raise RetryableError.new failure_message
    end

    if response.is_a? Net::HTTPNotFound
      @logger.error("#{failure_message} Please check that log ingest is enabled and your API token has the `logs.ingest` (Ingest Logs) scope.")
      return
    end

    if response.is_a? Net::HTTPClientError
      @logger.error(failure_message)
      return
    end
  rescue Net::HTTPBadResponse, RetryableError => e
    # indicates a protocol error
    if retries < MAX_RETRIES  
      sleep_seconds = 2 ** retries
      @logger.warn("Failed to contact dynatrace: #{e.message}. Trying again after #{sleep_seconds} seconds.")
      sleep sleep_seconds
      retries += 1
      retry
    else
      @logger.error("Failed to export logs to Dynatrace.")
    end
  end
end
register() click to toggle source
# File lib/logstash/outputs/dynatrace.rb, line 49
def register
  require 'net/https'
  require 'uri'
  @uri = URI.parse(@ingest_endpoint_url.uri.to_s)
  @client = Net::HTTP.new(@uri.host, @uri.port)

  if uri.scheme == 'https'
    @client.use_ssl = true
    @client.verify_mode = OpenSSL::SSL::VERIFY_NONE if @ssl_verify_none
  end
  @logger.info('Client', client: @client.inspect)
end
send(request) click to toggle source
# File lib/logstash/outputs/dynatrace.rb, line 110
def send(request)
  @client.request(request)
end