Class: LogStash::Outputs::Rollbar

Inherits:
Base
  • Object
show all
Defined in:
lib/logstash/outputs/rollbar.rb

Overview

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.

Instance Method Summary collapse

Instance Method Details

#hash_recursiveObject


36
37
38
39
40
# File 'lib/logstash/outputs/rollbar.rb', line 36

def hash_recursive
  Hash.new do |hash, key|
    hash[key] = hash_recursive
  end
end

#receive(event) ⇒ Object


55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# 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

#registerObject


43
44
45
46
47
48
49
50
51
52
# 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