Skip to content

Commit 2244996

Browse files
authored
Merge pull request #129 from MindscapeHQ/tl/timeout-post-call
Timeout network request to send crash reports to API
2 parents deea6a0 + d8fac63 commit 2244996

File tree

13 files changed

+123
-20
lines changed

13 files changed

+123
-20
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 2.7.0 (19/02/2018)
2+
3+
Features
4+
- Add configuration option to control network timeouts when sending error reports, default value is 10 seconds ([#129](https://github.com/MindscapeHQ/raygun4ruby/pull/129))
5+
16
## 2.6.0 (25/10/2017)
27

38
Features

Rakefile

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@ namespace :test do
88
desc "Test the basics of the adapter"
99
Rake::TestTask.new(:units) do |t|
1010
t.test_files = FileList["test/unit/*_test.rb", "specs/**/*_spec.rb"]
11-
t.verbose = true
1211
end
1312

1413
desc "Run a test against the live API"
1514
Rake::TestTask.new(:integration) do |t|
1615
t.test_files = FileList["test/integration/*_test.rb"]
17-
t.verbose = true
1816
end
1917

2018
end

lib/raygun.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ def default_configuration
5151
configuration.defaults
5252
end
5353

54+
def reset_configuration
55+
@configuration = Configuration.new
56+
end
57+
5458
def configured?
5559
!!configuration.api_key
5660
end
@@ -118,7 +122,7 @@ def deprecation_warning(message)
118122
def track_exception_async(*args)
119123
future = Concurrent::Future.execute { track_exception_sync(*args) }
120124
future.add_observer(lambda do |_, value, reason|
121-
if value == nil || value.response.code != "202"
125+
if value == nil || !value.responds_to?(:response) || value.response.code != "202"
122126
log("unexpected response from Raygun, could indicate error: #{value.inspect}")
123127
end
124128
end, :call)
@@ -127,7 +131,10 @@ def track_exception_async(*args)
127131
def track_exception_sync(exception_instance, env, user, retry_count)
128132
if should_report?(exception_instance)
129133
log('attempting to send exception')
130-
Client.new.track_exception(exception_instance, env, user)
134+
resp = Client.new.track_exception(exception_instance, env, user)
135+
log('sent payload to api')
136+
137+
resp
131138
end
132139
rescue Exception => e
133140
log('error sending exception to raygun, see failsafe logger for more information')

lib/raygun/client.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ def initialize
1616

1717
enable_http_proxy if Raygun.configuration.proxy_settings[:address]
1818
self.class.base_uri Raygun.configuration.api_url
19+
self.class.default_timeout(Raygun.configuration.error_report_send_timeout)
1920
end
2021

2122
def require_api_key
@@ -242,7 +243,13 @@ def build_payload_hash(exception_instance, env = {}, user = nil)
242243
def create_entry(payload_hash)
243244
Raygun.log('sending payload to api')
244245

245-
self.class.post("/entries", verify_peer: true, verify: true, headers: @headers, body: JSON.generate(payload_hash))
246+
self.class.post(
247+
"/entries",
248+
verify_peer: true,
249+
verify: true,
250+
headers: @headers,
251+
body: JSON.generate(payload_hash),
252+
)
246253
end
247254

248255
def filter_params_with_blacklist(params_hash = {}, extra_filter_keys = nil)

lib/raygun/configuration.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ def self.proc_config_option(name)
7777
# Should the exceptions to Raygun be sent asynchronously?
7878
config_option :send_in_background
7979

80+
# How long to wait for the POST request to the API server before timing out
81+
config_option :error_report_send_timeout
82+
8083
# Exception classes to ignore by default
8184
IGNORE_DEFAULT = ['ActiveRecord::RecordNotFound',
8285
'ActionController::RoutingError',
@@ -129,7 +132,8 @@ def initialize
129132
api_url: 'https://api.raygun.io/',
130133
breadcrumb_level: :info,
131134
record_raw_data: false,
132-
send_in_background: false
135+
send_in_background: false,
136+
error_report_send_timeout: 10
133137
)
134138
end
135139

lib/raygun/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module Raygun
2-
VERSION = "2.6.0"
2+
VERSION = "2.7.0"
33
end

raygun4ruby.gemspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ Gem::Specification.new do |spec|
2525
spec.add_runtime_dependency "concurrent-ruby"
2626

2727
spec.add_development_dependency "bundler", ">= 1.1"
28-
spec.add_development_dependency "rake", "0.9.6"
29-
spec.add_development_dependency "fakeweb", ["~> 1.3"]
28+
spec.add_development_dependency "rake", "~> 11"
3029
spec.add_development_dependency "timecop"
3130
spec.add_development_dependency "minitest", "~> 4.2"
3231
spec.add_development_dependency "redis-namespace", ">= 1.3.1"
3332
spec.add_development_dependency "resque"
3433
spec.add_development_dependency "sidekiq", [">= 3", "< 3.2.2"]
3534
spec.add_development_dependency "mocha"
3635
spec.add_development_dependency "pry"
36+
spec.add_development_dependency "webmock"
3737
end

specs/raygun/raygun_spec.rb

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
require_relative '../spec_helper'
2+
require 'stringio'
3+
4+
describe Raygun do
5+
let(:failsafe_logger) { FakeLogger.new }
6+
7+
describe '#track_exception' do
8+
context 'send in background' do
9+
before do
10+
Raygun.setup do |c|
11+
c.send_in_background = true
12+
c.api_url = 'http://example.api'
13+
c.api_key = 'foo'
14+
c.debug = true
15+
c.failsafe_logger = failsafe_logger
16+
end
17+
end
18+
19+
context 'request times out' do
20+
before do
21+
stub_request(:post, 'http://example.api/entries').to_timeout
22+
end
23+
24+
it 'logs the failure to the failsafe logger' do
25+
error = StandardError.new
26+
27+
Raygun.track_exception(error)
28+
29+
# Occasionally doesn't write to the failsafe logger, add small timeout to add some safety
30+
sleep 0.1
31+
failsafe_logger.get.must_match /Problem reporting exception to Raygun/
32+
end
33+
end
34+
end
35+
end
36+
37+
describe '#reset_configuration' do
38+
it 'clears any customized configuration options' do
39+
Raygun.setup do |c|
40+
c.api_url = 'http://test.api'
41+
end
42+
43+
Raygun.configuration.api_url.must_equal 'http://test.api'
44+
45+
Raygun.reset_configuration
46+
47+
Raygun.configuration.api_url.must_equal Raygun.default_configuration.api_url
48+
end
49+
end
50+
end

specs/spec_helper.rb

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,28 @@
22
require_relative "../lib/raygun.rb"
33
require "minitest/autorun"
44
require "minitest/pride"
5-
require "fakeweb"
65
require "timecop"
76
require "mocha/mini_test"
7+
require "webmock/minitest"
8+
require 'stringio'
89

910
alias :context :describe
11+
12+
class FakeLogger
13+
def initialize
14+
@logger = StringIO.new
15+
end
16+
17+
def info(message)
18+
@logger.write(message)
19+
end
20+
21+
def reset
22+
@logger.string = ""
23+
end
24+
25+
def get
26+
@logger.string
27+
end
28+
end
29+

test/test_helper.rb

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
require_relative "../lib/raygun.rb"
33
require "minitest/autorun"
44
require "minitest/pride"
5-
require "fakeweb"
65
require "timecop"
76
require "mocha/mini_test"
87
require 'stringio'
@@ -47,20 +46,17 @@ def teardown
4746
class Raygun::UnitTest < MiniTest::Unit::TestCase
4847

4948
def setup
50-
FakeWeb.allow_net_connect = false
5149
Raygun.configuration.api_key = "test api key"
5250
end
5351

54-
def fake_successful_entry
55-
FakeWeb.register_uri(:post, "https://api.raygun.io/entries", body: "", status: 202)
56-
end
57-
5852
def teardown
59-
FakeWeb.clean_registry
60-
FakeWeb.allow_net_connect = true
6153
reset_configuration
6254
end
6355

56+
def fake_successful_entry
57+
stub_request(:post, 'https://api.raygun.io/entries').to_return(status: 202)
58+
end
59+
6460
def reset_configuration
6561
Raygun.configuration = Raygun::Configuration.new
6662
end

0 commit comments

Comments
 (0)