class LogStash::Outputs::Rollbar

The Rollbar output will send events to the Rollbar event monitoring service. The only required field is a Rollbar project access token with post_server_item permissions. If you're already using Rollbar to report errors directly from your applications, you can use the same token.

Public Instance Methods

hash_recursive() click to toggle source
# File lib/logstash/outputs/rollbar.rb, line 36
def hash_recursive
  Hash.new do |hash, key|
    hash[key] = hash_recursive
  end
end
receive(event) click to toggle source
# File lib/logstash/outputs/rollbar.rb, line 55
def receive(event)
  return unless output?(event)

  rb_item = hash_recursive

  # We'll want to remove fields from data without removing them from the original event
  data = JSON.parse(event.to_json)
  
  #
  # If logstash has created 'rollbar' fields, we'll use those to populate the item...
  #
  #if data['rollbar']
  #  merge_keys = %w{access_token client context environment fingerprint format framework
  #                  language level person platform request server title uuid }
  #  merge_keys.each do |key|
  #    data['rollbar'][key] && rb_item['data'][key] = data['rollbar'][key]
  #  end
  #  data.delete('rollbar')
  #end

  # ...then put whatever's left in 'custom'...
  rb_item['data']['custom'] = data

  # Some optimizations for k8s and Go Projects in AVS
  rb_item['data']['timestamp'] = event.timestamp.to_i
  rb_item['data']['level'] = data.has_key?('level') ? data['level'] : @level 
  rb_item['data']['environment'] = data.has_key?('region') ? data['region'] : @environment
  rb_item['data']['title'] = data['message']
  rb_item['data']['code_version'] = data['git_commit'] if data['git_commit']

  #Server data
  if data['kubernetes'] && data['kubernetes']['node']
    rb_item['data']['server']['host'] = data['kubernetes']['node']['name'] if data['kubernetes']['node']['name']
  end

  rb_item['data']['notifier']['name'] = 'logstash'
  rb_item['data']['notifier']['version'] = Gem.loaded_specs["logstash-output-rollbar-k8s"].version


  # Construct the message body using either:
  #
  # - The default format string defined above "%{message}"
  # - The format string specified in the rollbar plugin config section
  # - The format string specified in the [rollbar][format] event field
  #
  format = rb_item['data'].has_key?('format') ? rb_item['data']['format'] : @format
  rb_item['data']['body']['message']['body'] = event.sprintf(format)

  # Treat the [rollbar][access_token] field as a special case, since we don't need to
  # include it more than once in the Rollbar item
  #
  if rb_item['data'].has_key?('access_token')
    rb_item['access_token'] = rb_item['data']['access_token']
    rb_item['data'].delete('access_token')
  else
    rb_item['access_token'] = @access_token.value
  end


  @logger.debug("Rollbar Item", :rb_item => rb_item)

  begin
    request = Net::HTTP::Post.new(@rb_uri.path)
    request.body = JSON.dump(rb_item)
    @logger.debug("Rollbar Request", :request => request.body)
    response = @client.request(request)
    @logger.debug("Rollbar Response", :response => response.body)

  rescue Exception => e
    @logger.warn("Rollbar Exception", :rb_error => e.backtrace)
  end
end
register() click to toggle source
# File lib/logstash/outputs/rollbar.rb, line 43
def register
  require 'net/https'
  require 'uri'
  @rb_uri = URI.parse(@endpoint)
  @client = Net::HTTP.new(@rb_uri.host, @rb_uri.port)
  if @rb_uri.scheme == "https"
    @client.use_ssl = true
    @client.verify_mode = OpenSSL::SSL::VERIFY_PEER
  end
end