honeybadger 1.8.1 → 1.9.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +14 -0
- data/Gemfile.lock +61 -19
- data/Guardfile +4 -4
- data/MIT-LICENSE +1 -0
- data/README.md +2 -2
- data/Rakefile +4 -14
- data/features/rails.feature +1 -1
- data/gemfiles/rack.gemfile.lock +62 -27
- data/gemfiles/rails2.3.gemfile.lock +73 -36
- data/gemfiles/rails3.0.gemfile.lock +59 -26
- data/gemfiles/rails3.1.gemfile.lock +59 -26
- data/gemfiles/rails3.2.gemfile.lock +63 -30
- data/gemfiles/rails4.gemfile.lock +69 -36
- data/gemfiles/rake.gemfile.lock +62 -27
- data/gemfiles/sinatra.gemfile.lock +62 -27
- data/honeybadger.gemspec +31 -17
- data/lib/honeybadger.rb +2 -3
- data/lib/honeybadger/array.rb +53 -0
- data/lib/honeybadger/configuration.rb +19 -2
- data/lib/honeybadger/monitor.rb +16 -0
- data/lib/honeybadger/monitor/railtie.rb +52 -0
- data/lib/honeybadger/monitor/sender.rb +33 -0
- data/lib/honeybadger/monitor/worker.rb +71 -0
- data/lib/honeybadger/railtie.rb +10 -0
- data/lib/honeybadger/sender.rb +60 -41
- data/{test/unit/backtrace_test.rb → spec/honeybadger/backtrace_spec.rb} +69 -71
- data/{test/unit/capistrano_test.rb → spec/honeybadger/capistrano_spec.rb} +8 -9
- data/{test/unit/configuration_test.rb → spec/honeybadger/configuration_spec.rb} +85 -59
- data/spec/honeybadger/logger_spec.rb +65 -0
- data/spec/honeybadger/monitor/worker_spec.rb +189 -0
- data/{test/unit/notice_test.rb → spec/honeybadger/notice_spec.rb} +169 -185
- data/spec/honeybadger/notifier_spec.rb +252 -0
- data/spec/honeybadger/rack_spec.rb +84 -0
- data/{test/unit/rails/action_controller_catcher_test.rb → spec/honeybadger/rails/action_controller_spec.rb} +65 -57
- data/{test/unit/rails_test.rb → spec/honeybadger/rails_spec.rb} +8 -8
- data/spec/honeybadger/sender_spec.rb +249 -0
- data/spec/honeybadger_tasks_spec.rb +165 -0
- data/spec/spec_helper.rb +18 -0
- data/spec/support/array_including.rb +31 -0
- data/spec/support/backtraced_exception.rb +9 -0
- data/spec/support/collected_sender.rb +12 -0
- data/spec/support/defines_constants.rb +18 -0
- data/{test/test_helper.rb → spec/support/helpers.rb} +8 -61
- metadata +93 -45
- data/test/unit/honeybadger_tasks_test.rb +0 -167
- data/test/unit/logger_test.rb +0 -74
- data/test/unit/notifier_test.rb +0 -265
- data/test/unit/rack_test.rb +0 -88
- data/test/unit/sender_test.rb +0 -290
data/honeybadger.gemspec
CHANGED
@@ -4,8 +4,8 @@ Gem::Specification.new do |s|
|
|
4
4
|
s.rubygems_version = '1.3.5'
|
5
5
|
|
6
6
|
s.name = 'honeybadger'
|
7
|
-
s.version = '1.
|
8
|
-
s.date = '2013-10-
|
7
|
+
s.version = '1.9.0.beta1'
|
8
|
+
s.date = '2013-10-08'
|
9
9
|
|
10
10
|
s.summary = 'Error reports you can be happy about.'
|
11
11
|
s.description = 'Make managing application errors a more pleasant experience.'
|
@@ -19,19 +19,22 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.rdoc_options = ['--charset=UTF-8', '--markup tomdoc']
|
20
20
|
s.extra_rdoc_files = %w[README.md MIT-LICENSE]
|
21
21
|
|
22
|
+
s.add_dependency('faraday')
|
22
23
|
s.add_dependency('json')
|
23
24
|
|
24
25
|
s.add_development_dependency('cucumber', '~> 1.2.1')
|
25
|
-
s.add_development_dependency('rspec', '~> 2.
|
26
|
+
s.add_development_dependency('rspec', '~> 2.14.0')
|
26
27
|
s.add_development_dependency('fakeweb', '~> 1.3.0')
|
27
28
|
s.add_development_dependency('sham_rack', '~> 1.3.0')
|
28
|
-
s.add_development_dependency('bourne', '>= 1.0')
|
29
|
-
s.add_development_dependency('shoulda', '~> 2.11.3')
|
30
29
|
s.add_development_dependency('capistrano')
|
31
30
|
s.add_development_dependency('rake')
|
32
31
|
s.add_development_dependency('sinatra')
|
33
32
|
s.add_development_dependency('aruba')
|
34
33
|
s.add_development_dependency('appraisal')
|
34
|
+
s.add_development_dependency('guard')
|
35
|
+
s.add_development_dependency('guard-rspec')
|
36
|
+
s.add_development_dependency('fuubar')
|
37
|
+
s.add_development_dependency('growl')
|
35
38
|
|
36
39
|
## Leave this section as-is. It will be automatically generated from the
|
37
40
|
## contents of your Git repository via the gemspec task. DO NOT REMOVE
|
@@ -84,9 +87,14 @@ Gem::Specification.new do |s|
|
|
84
87
|
generators/honeybadger/templates/initializer.rb
|
85
88
|
honeybadger.gemspec
|
86
89
|
lib/honeybadger.rb
|
90
|
+
lib/honeybadger/array.rb
|
87
91
|
lib/honeybadger/backtrace.rb
|
88
92
|
lib/honeybadger/capistrano.rb
|
89
93
|
lib/honeybadger/configuration.rb
|
94
|
+
lib/honeybadger/monitor.rb
|
95
|
+
lib/honeybadger/monitor/railtie.rb
|
96
|
+
lib/honeybadger/monitor/sender.rb
|
97
|
+
lib/honeybadger/monitor/worker.rb
|
90
98
|
lib/honeybadger/notice.rb
|
91
99
|
lib/honeybadger/rack.rb
|
92
100
|
lib/honeybadger/rails.rb
|
@@ -106,18 +114,24 @@ Gem::Specification.new do |s|
|
|
106
114
|
resources/README.md
|
107
115
|
resources/ca-bundle.crt
|
108
116
|
script/integration_test.rb
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
117
|
+
spec/honeybadger/backtrace_spec.rb
|
118
|
+
spec/honeybadger/capistrano_spec.rb
|
119
|
+
spec/honeybadger/configuration_spec.rb
|
120
|
+
spec/honeybadger/logger_spec.rb
|
121
|
+
spec/honeybadger/monitor/worker_spec.rb
|
122
|
+
spec/honeybadger/notice_spec.rb
|
123
|
+
spec/honeybadger/notifier_spec.rb
|
124
|
+
spec/honeybadger/rack_spec.rb
|
125
|
+
spec/honeybadger/rails/action_controller_spec.rb
|
126
|
+
spec/honeybadger/rails_spec.rb
|
127
|
+
spec/honeybadger/sender_spec.rb
|
128
|
+
spec/honeybadger_tasks_spec.rb
|
129
|
+
spec/spec_helper.rb
|
130
|
+
spec/support/array_including.rb
|
131
|
+
spec/support/backtraced_exception.rb
|
132
|
+
spec/support/collected_sender.rb
|
133
|
+
spec/support/defines_constants.rb
|
134
|
+
spec/support/helpers.rb
|
121
135
|
]
|
122
136
|
# = MANIFEST =
|
123
137
|
|
data/lib/honeybadger.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'net/https'
|
1
|
+
require 'faraday'
|
3
2
|
require 'json'
|
4
3
|
require 'digest'
|
5
4
|
require 'logger'
|
@@ -14,7 +13,7 @@ require 'honeybadger/stats'
|
|
14
13
|
require 'honeybadger/railtie' if defined?(Rails::Railtie)
|
15
14
|
|
16
15
|
module Honeybadger
|
17
|
-
VERSION = '1.
|
16
|
+
VERSION = '1.9.0.beta1'
|
18
17
|
LOG_PREFIX = "** [Honeybadger] "
|
19
18
|
|
20
19
|
HEADERS = {
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# This code comes from batsd - I just decided to put this in a child
|
2
|
+
# class rather than re-opening Array.
|
3
|
+
class Honeybadger::Array < Array
|
4
|
+
# Calculates the sum of values in the array
|
5
|
+
def sum
|
6
|
+
inject( nil ) { |sum,x| sum ? sum+x : x };
|
7
|
+
end
|
8
|
+
|
9
|
+
# Calculates the arithmetic mean of values in the array
|
10
|
+
def mean
|
11
|
+
self.sum.to_f / self.length
|
12
|
+
end
|
13
|
+
|
14
|
+
# Calculates the median of values in the array
|
15
|
+
def median
|
16
|
+
self.sort[self.length/2]
|
17
|
+
end
|
18
|
+
|
19
|
+
# Calculates the value of the upper percentile of values
|
20
|
+
# in the array. If only a single value is provided in the array, that is
|
21
|
+
# returned
|
22
|
+
def percentile(threshold)
|
23
|
+
if (count > 1)
|
24
|
+
self.sort!
|
25
|
+
# strip off the top 100-threshold
|
26
|
+
threshold_index = (((100 - threshold).to_f / 100) * count).round
|
27
|
+
self[0..-threshold_index].last
|
28
|
+
else
|
29
|
+
self.first
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Calculates the mean squared error of values in the array
|
34
|
+
def mean_squared
|
35
|
+
m = mean
|
36
|
+
self.class.new(map{|v| (v-m)**2}).sum
|
37
|
+
end
|
38
|
+
|
39
|
+
# Calculates the standard deviatiation of values in the array
|
40
|
+
def standard_dev
|
41
|
+
(mean_squared/(count-1))**0.5
|
42
|
+
end
|
43
|
+
|
44
|
+
# Allow [1,2,3].percentile_90, [1,2,3].percentile(75), etc.
|
45
|
+
def method_missing(method, *args, &block)
|
46
|
+
if method.to_s =~ /^percentile_(.+)$/
|
47
|
+
percentile($1.to_i)
|
48
|
+
else
|
49
|
+
super
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'socket'
|
2
|
+
|
1
3
|
module Honeybadger
|
2
4
|
class Configuration
|
3
5
|
OPTIONS = [:api_key, :backtrace_filters, :development_environments, :environment_name,
|
@@ -107,6 +109,12 @@ module Honeybadger
|
|
107
109
|
# Override the hostname of the local server (optional)
|
108
110
|
attr_accessor :hostname
|
109
111
|
|
112
|
+
# Send metrics?
|
113
|
+
attr_accessor :metrics
|
114
|
+
|
115
|
+
# Which features the API says we have
|
116
|
+
attr_accessor :features
|
117
|
+
|
110
118
|
DEFAULT_PARAMS_FILTERS = %w(password password_confirmation).freeze
|
111
119
|
|
112
120
|
DEFAULT_BACKTRACE_FILTERS = [
|
@@ -161,7 +169,10 @@ module Honeybadger
|
|
161
169
|
@source_extract_radius = 2
|
162
170
|
@send_request_session = true
|
163
171
|
@debug = false
|
164
|
-
@hostname =
|
172
|
+
@hostname = Socket.gethostname
|
173
|
+
@metrics = true
|
174
|
+
@features = { 'notices' => true }
|
175
|
+
@limit = nil
|
165
176
|
end
|
166
177
|
|
167
178
|
# Public: Takes a block and adds it to the list of backtrace filters. When
|
@@ -248,7 +259,13 @@ module Honeybadger
|
|
248
259
|
#
|
249
260
|
# Returns false if in a development environment, true otherwise.
|
250
261
|
def public?
|
251
|
-
!development_environments.include?(environment_name)
|
262
|
+
!development_environments.include?(environment_name) && features['notices']
|
263
|
+
end
|
264
|
+
|
265
|
+
# Public: Determines whether to send metrics
|
266
|
+
#
|
267
|
+
def metrics?
|
268
|
+
public? && @metrics
|
252
269
|
end
|
253
270
|
|
254
271
|
# Public: Configure async delivery
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "honeybadger/array"
|
2
|
+
require "honeybadger/monitor/sender"
|
3
|
+
require "honeybadger/monitor/worker"
|
4
|
+
require "honeybadger/monitor/railtie" if defined?(Rails)
|
5
|
+
|
6
|
+
module Honeybadger
|
7
|
+
module Monitor
|
8
|
+
class << self
|
9
|
+
|
10
|
+
def worker
|
11
|
+
Worker.instance
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Honeybadger
|
2
|
+
module Monitor
|
3
|
+
class Railtie < ::Rails::Railtie
|
4
|
+
|
5
|
+
config.after_initialize do
|
6
|
+
if Honeybadger.configuration.metrics?
|
7
|
+
|
8
|
+
ActiveSupport::Notifications.subscribe('process_action.action_controller') do |*args|
|
9
|
+
event = ActiveSupport::Notifications::Event.new(*args)
|
10
|
+
status = event.payload[:exception] ? 500 : event.payload[:status]
|
11
|
+
Monitor.worker.timing("app.request.#{status}", event.duration)
|
12
|
+
|
13
|
+
controller = event.payload[:controller]
|
14
|
+
action = event.payload[:action]
|
15
|
+
if controller && action
|
16
|
+
Monitor.worker.timing("app.controller.#{controller}.#{action}.total", event.duration)
|
17
|
+
Monitor.worker.timing("app.controller.#{controller}.#{action}.view", event.payload[:view_runtime]) if event.payload[:view_runtime]
|
18
|
+
Monitor.worker.timing("app.controller.#{controller}.#{action}.db", event.payload[:db_runtime]) if event.payload[:db_runtime]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
ActiveSupport::Notifications.subscribe(/render_(partial|template)\.action_view\Z/) do |*args|
|
23
|
+
event = ActiveSupport::Notifications::Event.new(*args)
|
24
|
+
if !event.name.start_with?('!')
|
25
|
+
metric = event.name.split('.').first
|
26
|
+
file = event.payload[:identifier].gsub(::Rails.root.to_s + File::SEPARATOR,'').gsub('.', '_')
|
27
|
+
Monitor.worker.timing("app.view.#{metric}.#{file}", event.duration)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
ActiveSupport::Notifications.subscribe('sql.active_record') do |*args|
|
32
|
+
event = ActiveSupport::Notifications::Event.new(*args)
|
33
|
+
if event.name != 'SCHEMA' && !event.name == 'CACHE'
|
34
|
+
metric = event.payload[:sql].strip.split(' ', 2).first.downcase
|
35
|
+
Monitor.worker.timing("app.active_record.#{metric}", event.duration)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
ActiveSupport::Notifications.subscribe(/(deliver|receive).action_mailer\Z/) do |*args|
|
40
|
+
event = ActiveSupport::Notifications::Event.new(*args)
|
41
|
+
if !event.name.start_with?('!')
|
42
|
+
metric = event.name.split('.').first
|
43
|
+
Monitor.worker.timing("app.mail.#{metric}", event.duration)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Honeybadger
|
2
|
+
module Monitor
|
3
|
+
class Sender < Honeybadger::Sender
|
4
|
+
def send_metrics(data)
|
5
|
+
return unless Honeybadger.configuration.metrics?
|
6
|
+
|
7
|
+
if !Honeybadger.configuration.features['metrics']
|
8
|
+
log(:error, "Can't send metrics -- the gem has been deactivated by the remote service. Try restarting your app or contacting support@honeybadger.io.")
|
9
|
+
Honeybadger.configuration.metrics = false
|
10
|
+
return nil
|
11
|
+
end
|
12
|
+
|
13
|
+
response = client.post do |p|
|
14
|
+
p.url "/v1/metrics"
|
15
|
+
p.body = data.to_json
|
16
|
+
end
|
17
|
+
|
18
|
+
if response.success?
|
19
|
+
true
|
20
|
+
else
|
21
|
+
Honeybadger.configuration.features['metrics'] = false if response.status == 403
|
22
|
+
log(:error, "Metrics Failure", response, data)
|
23
|
+
false
|
24
|
+
end
|
25
|
+
|
26
|
+
rescue => e
|
27
|
+
log(:error, "[Honeybadger::Monitor::Sender#send_metrics] Error: #{e.class} - #{e.message}\nBacktrace:\n#{e.backtrace.join("\n\t")}")
|
28
|
+
true
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require "singleton"
|
2
|
+
|
3
|
+
module Honeybadger
|
4
|
+
module Monitor
|
5
|
+
class Worker
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
init_metrics
|
10
|
+
@delay = 60
|
11
|
+
@per_request = 100
|
12
|
+
@sender = Monitor::Sender.new(Honeybadger.configuration)
|
13
|
+
@thread = Thread.new do
|
14
|
+
while true do
|
15
|
+
send_metrics
|
16
|
+
sleep @delay
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def timing(name, value)
|
22
|
+
add_metric(name, value, :timing)
|
23
|
+
end
|
24
|
+
|
25
|
+
def increment(name, value)
|
26
|
+
add_metric(name, value, :counter)
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def init_metrics
|
32
|
+
@metrics = { :timing => {}, :counter => {} }
|
33
|
+
end
|
34
|
+
|
35
|
+
def send_metrics
|
36
|
+
metrics = @metrics.dup
|
37
|
+
return unless metrics[:timing].any? || metrics[:counter].any?
|
38
|
+
init_metrics
|
39
|
+
[].tap do |m|
|
40
|
+
metrics[:counter].each do |metric, values|
|
41
|
+
m << "#{metric} #{values.sum}"
|
42
|
+
end
|
43
|
+
metrics[:timing].each do |metric, values|
|
44
|
+
m << "#{metric}:mean #{values.mean}"
|
45
|
+
m << "#{metric}:median #{values.median}"
|
46
|
+
m << "#{metric}:percentile_90 #{values.percentile(90)}"
|
47
|
+
m << "#{metric}:min #{values.min}"
|
48
|
+
m << "#{metric}:max #{values.max}"
|
49
|
+
m << "#{metric}:stddev #{values.standard_dev}" if values.count > 1
|
50
|
+
m << "#{metric} #{values.count}"
|
51
|
+
end
|
52
|
+
end.each_slice(@per_request) do |mm|
|
53
|
+
begin
|
54
|
+
@sender.send_metrics({ :metrics => mm, :environment => Honeybadger.configuration.environment_name, :hostname => Honeybadger.configuration.hostname })
|
55
|
+
rescue Exception => e
|
56
|
+
log(:error, "[Honeybadger::Monitor::Worker#send_metrics] Failed to send #{mm.count} metrics: #{e.class} - #{e.message}\nBacktrace:\n#{e.backtrace.join("\n\t")}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def add_metric(name, value, kind)
|
62
|
+
(@metrics[kind][name] ||= Honeybadger::Array.new) << value
|
63
|
+
end
|
64
|
+
|
65
|
+
def log(level, message)
|
66
|
+
Honeybadger.write_verbose_log(message, level)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/honeybadger/railtie.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'honeybadger'
|
2
|
+
require 'honeybadger/monitor'
|
2
3
|
require 'rails'
|
3
4
|
|
4
5
|
module Honeybadger
|
@@ -40,6 +41,15 @@ module Honeybadger
|
|
40
41
|
require 'honeybadger/rails/middleware/exceptions_catcher'
|
41
42
|
::ActionDispatch::ShowExceptions.send(:include,Honeybadger::Rails::Middleware::ExceptionsCatcher)
|
42
43
|
end
|
44
|
+
|
45
|
+
if Honeybadger.configuration.public?
|
46
|
+
if result = Honeybadger.sender.ping({ :version => Honeybadger::VERSION, :framework => Honeybadger.configuration.framework, :environment => Honeybadger.configuration.environment_name, :hostname => Honeybadger.configuration.hostname })
|
47
|
+
Honeybadger.configure(true) do |config|
|
48
|
+
config.features = result['features'] if result['features']
|
49
|
+
config.limit = result['limit'] if result['limit']
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
43
53
|
end
|
44
54
|
end
|
45
55
|
end
|
data/lib/honeybadger/sender.rb
CHANGED
@@ -5,9 +5,6 @@ module Honeybadger
|
|
5
5
|
Errno::EINVAL,
|
6
6
|
Errno::ECONNRESET,
|
7
7
|
EOFError,
|
8
|
-
Net::HTTPBadResponse,
|
9
|
-
Net::HTTPHeaderSyntaxError,
|
10
|
-
Net::ProtocolError,
|
11
8
|
Errno::ECONNREFUSED].freeze
|
12
9
|
|
13
10
|
def initialize(options = {})
|
@@ -34,38 +31,57 @@ module Honeybadger
|
|
34
31
|
#
|
35
32
|
# Returns error id from successful response
|
36
33
|
def send_to_honeybadger(notice)
|
37
|
-
if
|
38
|
-
log(:error, "
|
34
|
+
if !Honeybadger.configuration.features['notices']
|
35
|
+
log(:error, "Can't send error report -- the gem has been deactivated by the remote service. Try restarting your app or contacting support@honeybadger.io.")
|
39
36
|
return nil
|
40
37
|
end
|
41
38
|
|
42
|
-
|
43
|
-
|
44
|
-
http = setup_http_connection
|
45
|
-
headers = HEADERS
|
39
|
+
return nil unless api_key_ok?
|
46
40
|
|
47
|
-
|
41
|
+
data = notice.is_a?(String) ? notice : notice.to_json
|
48
42
|
|
49
43
|
response = begin
|
50
|
-
|
44
|
+
client.post do |p|
|
45
|
+
p.url NOTICES_URI
|
46
|
+
p.body = data
|
47
|
+
end
|
51
48
|
rescue *HTTP_ERRORS => e
|
52
49
|
log(:error, "Unable to contact the Honeybadger server. HTTP Error=#{e}")
|
53
50
|
nil
|
54
51
|
end
|
55
52
|
|
56
|
-
|
57
|
-
when Net::HTTPSuccess then
|
53
|
+
if response.success?
|
58
54
|
log(Honeybadger.configuration.debug ? :info : :debug, "Success: #{response.class}", response, data)
|
59
|
-
JSON.parse(response.body)
|
55
|
+
JSON.parse(response.body).fetch('id')
|
60
56
|
else
|
61
57
|
log(:error, "Failure: #{response.class}", response, data)
|
62
|
-
nil
|
63
58
|
end
|
59
|
+
|
64
60
|
rescue => e
|
65
61
|
log(:error, "[Honeybadger::Sender#send_to_honeybadger] Error: #{e.class} - #{e.message}\nBacktrace:\n#{e.backtrace.join("\n\t")}")
|
66
62
|
nil
|
67
63
|
end
|
68
64
|
|
65
|
+
def ping(data = {})
|
66
|
+
return nil unless api_key_ok?
|
67
|
+
|
68
|
+
response = client.post do |p|
|
69
|
+
p.url "/v1/ping"
|
70
|
+
p.body = data.to_json
|
71
|
+
end
|
72
|
+
|
73
|
+
if response.success?
|
74
|
+
JSON.parse(response.body)
|
75
|
+
else
|
76
|
+
log(:error, "Ping Failure", response, data)
|
77
|
+
nil
|
78
|
+
end
|
79
|
+
|
80
|
+
rescue => e
|
81
|
+
log(:error, "[Honeybadger::Sender#ping] Error: #{e.class} - #{e.message}\nBacktrace:\n#{e.backtrace.join("\n\t")}")
|
82
|
+
nil
|
83
|
+
end
|
84
|
+
|
69
85
|
attr_reader :api_key,
|
70
86
|
:proxy_host,
|
71
87
|
:proxy_port,
|
@@ -84,8 +100,34 @@ module Honeybadger
|
|
84
100
|
|
85
101
|
private
|
86
102
|
|
87
|
-
def
|
88
|
-
|
103
|
+
def api_key_ok?
|
104
|
+
if api_key.nil? || api_key == ''
|
105
|
+
log(:error, "API key not found.")
|
106
|
+
return nil
|
107
|
+
end
|
108
|
+
true
|
109
|
+
end
|
110
|
+
|
111
|
+
def client
|
112
|
+
request_options = { :timeout => http_read_timeout, :open_timeout => http_open_timeout }
|
113
|
+
request_options.merge!({ :proxy => { :uri => "#{protocol}://#{proxy_host}:#{proxy_port || port}", :user => proxy_user, :password => proxy_pass } }) if proxy_host
|
114
|
+
|
115
|
+
@client ||= Faraday.new(:request => request_options) do |conn|
|
116
|
+
conn.adapter Faraday.default_adapter
|
117
|
+
conn.url_prefix = "#{protocol}://#{host}:#{port}"
|
118
|
+
conn.headers['User-agent'] = "HB-Ruby #{Honeybadger::VERSION}; #{RUBY_VERSION}; #{RUBY_PLATFORM}"
|
119
|
+
conn.headers['X-API-Key'] = api_key.to_s
|
120
|
+
conn.headers['Content-Type'] = 'application/json'
|
121
|
+
conn.headers['Accept'] = 'text/json, application/json'
|
122
|
+
|
123
|
+
if secure?
|
124
|
+
conn.ssl[:verify_mode] = OpenSSL::SSL::VERIFY_PEER
|
125
|
+
conn.ssl[:ca_file] = Honeybadger.configuration.ca_bundle_path
|
126
|
+
end
|
127
|
+
end
|
128
|
+
rescue => e
|
129
|
+
log(:error, "[Honeybadger::Sender#client] Failure initializing the HTTP connection.\nError: #{e.class} - #{e.message}\nBacktrace:\n#{e.backtrace.join("\n\t")}")
|
130
|
+
raise e
|
89
131
|
end
|
90
132
|
|
91
133
|
def log(level, message, response = nil, data = nil)
|
@@ -94,31 +136,8 @@ module Honeybadger
|
|
94
136
|
|
95
137
|
# Log debug information:
|
96
138
|
Honeybadger.report_environment_info
|
97
|
-
Honeybadger.report_response_body(response.body) if response && response.
|
139
|
+
Honeybadger.report_response_body(response.body) if response && response.body =~ /\S/
|
98
140
|
Honeybadger.write_verbose_log("Notice: #{data}", :debug) if data && Honeybadger.configuration.debug
|
99
141
|
end
|
100
|
-
|
101
|
-
def setup_http_connection
|
102
|
-
http =
|
103
|
-
Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_pass).
|
104
|
-
new(url.host, url.port)
|
105
|
-
|
106
|
-
http.read_timeout = http_read_timeout
|
107
|
-
http.open_timeout = http_open_timeout
|
108
|
-
|
109
|
-
if secure?
|
110
|
-
http.use_ssl = true
|
111
|
-
|
112
|
-
http.ca_file = Honeybadger.configuration.ca_bundle_path
|
113
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
114
|
-
else
|
115
|
-
http.use_ssl = false
|
116
|
-
end
|
117
|
-
|
118
|
-
http
|
119
|
-
rescue => e
|
120
|
-
log(:error, "[Honeybadger::Sender#setup_http_connection] Failure initializing the HTTP connection.\nError: #{e.class} - #{e.message}\nBacktrace:\n#{e.backtrace.join("\n\t")}")
|
121
|
-
raise e
|
122
|
-
end
|
123
142
|
end
|
124
143
|
end
|