rollbar 0.12.7 → 0.12.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -1
- data/lib/rollbar.rb +42 -4
- data/lib/rollbar/util.rb +35 -0
- data/lib/rollbar/version.rb +1 -1
- data/spec/rollbar_spec.rb +66 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e51b5cb888086a9cd992d4c36cfc2fabd83b3635
|
4
|
+
data.tar.gz: 47c5991fb45cd69fe233e0dafc2d6c7c676c4196
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 894839031c7728ccd229396aa54d2125f33a0a067b1ce7fd09eb02f603db56a1a4f7f933679e3464bc8140d98c3ec9ee23236f25d8d803a621688b640f09494a
|
7
|
+
data.tar.gz: e64f0af2245fd337b668f1870c440e4c51211d31f301d05ab39bb14ec9eea51ff6bae5a1f0600cd984aef9a85386140b1684c2f909c5e6a7faa57e241e64ec07
|
data/CHANGELOG.md
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
**0.12.8**
|
4
|
+
- Added funcitonality to walk the payload and truncate strings to attempt to reduce size if the payload is too large (more than 32kb total)
|
5
|
+
|
3
6
|
**0.12.7**
|
4
7
|
- Fix error reporting errors when route controller or action is nil (bug introduced in 0.12.4)
|
5
8
|
|
6
9
|
**0.12.6**
|
7
|
-
- Added [#78](https://github.com/rollbar/rollbar-gem/pull/78),
|
10
|
+
- Added [#78](https://github.com/rollbar/rollbar-gem/pull/78), added configuration option to ignore specific person exceptions
|
8
11
|
|
9
12
|
**0.12.5**
|
10
13
|
- Fixed SIGSEGV with the delayed_job plugin and Ruby 2.1.0
|
data/lib/rollbar.rb
CHANGED
@@ -14,10 +14,13 @@ require 'rollbar/configuration'
|
|
14
14
|
require 'rollbar/request_data_extractor'
|
15
15
|
require 'rollbar/exception_reporter'
|
16
16
|
require 'rollbar/active_record_extension' if defined?(ActiveRecord)
|
17
|
+
require 'rollbar/util'
|
17
18
|
|
18
19
|
require 'rollbar/railtie' if defined?(Rails)
|
19
20
|
|
20
21
|
module Rollbar
|
22
|
+
MAX_PAYLOAD_SIZE = 32 * 1042 #32kb
|
23
|
+
|
21
24
|
class << self
|
22
25
|
attr_writer :configuration
|
23
26
|
attr_accessor :last_report
|
@@ -321,6 +324,10 @@ module Rollbar
|
|
321
324
|
end
|
322
325
|
|
323
326
|
def schedule_payload(payload)
|
327
|
+
if payload.nil?
|
328
|
+
return
|
329
|
+
end
|
330
|
+
|
324
331
|
log_info '[Rollbar] Scheduling payload'
|
325
332
|
|
326
333
|
if configuration.use_async
|
@@ -345,7 +352,28 @@ module Rollbar
|
|
345
352
|
:access_token => configuration.access_token,
|
346
353
|
:data => data
|
347
354
|
}
|
348
|
-
MultiJson.dump(payload)
|
355
|
+
result = MultiJson.dump(payload)
|
356
|
+
|
357
|
+
# Try to truncate strings in the payload a few times if the payload is too big
|
358
|
+
if result.bytesize > MAX_PAYLOAD_SIZE
|
359
|
+
thresholds = [1024, 512, 256]
|
360
|
+
thresholds.each_with_index do |threshold, i|
|
361
|
+
new_payload = payload.clone
|
362
|
+
|
363
|
+
truncate_payload(new_payload, threshold)
|
364
|
+
|
365
|
+
result = MultiJson.dump(new_payload)
|
366
|
+
|
367
|
+
if result.bytesize <= MAX_PAYLOAD_SIZE
|
368
|
+
break
|
369
|
+
elsif i == thresholds.length - 1
|
370
|
+
send_failsafe('Could not send payload due to it being too large after truncating attempts', nil)
|
371
|
+
return
|
372
|
+
end
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
376
|
+
result
|
349
377
|
end
|
350
378
|
|
351
379
|
def base_data(level = 'error')
|
@@ -380,7 +408,7 @@ module Rollbar
|
|
380
408
|
unless config.custom_data_method.nil?
|
381
409
|
data[:custom] = config.custom_data_method.call
|
382
410
|
end
|
383
|
-
|
411
|
+
|
384
412
|
data
|
385
413
|
end
|
386
414
|
|
@@ -505,9 +533,19 @@ module Rollbar
|
|
505
533
|
log_error "[Rollbar] Error sending failsafe : #{e}"
|
506
534
|
end
|
507
535
|
end
|
508
|
-
|
536
|
+
|
537
|
+
def truncate_payload(payload, byte_threshold)
|
538
|
+
truncator = Proc.new do |value|
|
539
|
+
if value.is_a?(String) and value.bytesize > byte_threshold
|
540
|
+
Rollbar::Util::truncate(value, byte_threshold)
|
541
|
+
else
|
542
|
+
value
|
543
|
+
end
|
544
|
+
end
|
545
|
+
|
546
|
+
Rollbar::Util::iterate_and_update(payload, truncator)
|
547
|
+
end
|
509
548
|
end
|
510
|
-
|
511
549
|
end
|
512
550
|
|
513
551
|
# Setting Ratchetio as an alias to Rollbar for ratchetio-gem backwards compatibility
|
data/lib/rollbar/util.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Rollbar
|
2
|
+
module Util
|
3
|
+
def self.iterate_and_update(obj, block)
|
4
|
+
if obj.is_a?(Array)
|
5
|
+
for i in 0 ... obj.size
|
6
|
+
value = obj[i]
|
7
|
+
|
8
|
+
if value.is_a?(Hash) || value.is_a?(Array)
|
9
|
+
self.iterate_and_update(value, block)
|
10
|
+
else
|
11
|
+
obj[i] = block.call(value)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
else
|
15
|
+
obj.each do |k, v|
|
16
|
+
if v.is_a?(Hash) || v.is_a?(Array)
|
17
|
+
self.iterate_and_update(v, block)
|
18
|
+
else
|
19
|
+
obj[k] = block.call(v)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.truncate(str, length)
|
26
|
+
ellipsis = '...'
|
27
|
+
|
28
|
+
if str.length <= length or str.length <= ellipsis.length
|
29
|
+
return str
|
30
|
+
end
|
31
|
+
|
32
|
+
str.unpack("U*").slice(0, length - ellipsis.length).pack("U*") + ellipsis
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/rollbar/version.rb
CHANGED
data/spec/rollbar_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
1
3
|
require 'logger'
|
2
4
|
require 'socket'
|
3
5
|
require 'spec_helper'
|
@@ -603,11 +605,75 @@ describe Rollbar do
|
|
603
605
|
end
|
604
606
|
|
605
607
|
context 'build_payload' do
|
608
|
+
before(:each) do
|
609
|
+
configure
|
610
|
+
Rollbar.configure do |config|
|
611
|
+
config.logger = logger_mock
|
612
|
+
end
|
613
|
+
end
|
614
|
+
|
615
|
+
let(:logger_mock) { double("Rails.logger").as_null_object }
|
616
|
+
|
606
617
|
it 'should build valid json' do
|
607
618
|
json = Rollbar.send(:build_payload, {:foo => {:bar => "baz"}})
|
608
619
|
hash = MultiJson.load(json)
|
609
620
|
hash["data"]["foo"]["bar"].should == "baz"
|
610
621
|
end
|
622
|
+
|
623
|
+
it 'should truncate large strings if the payload is too big' do
|
624
|
+
json = Rollbar.send(:build_payload, {:foo => {:bar => "baz"}, :large => 'a' * (64 * 1024), :small => 'b' * 1024})
|
625
|
+
hash = MultiJson.load(json)
|
626
|
+
hash["data"]["large"].should == '%s...' % ('a' * 1021)
|
627
|
+
hash["data"]["small"].should == 'b' * 1024
|
628
|
+
end
|
629
|
+
|
630
|
+
it 'should send a failsafe message if the payload cannot be reduced enough' do
|
631
|
+
logger_mock.should_receive(:error).with('[Rollbar] Sending failsafe response due to Could not send payload due to it being too large after truncating attempts.')
|
632
|
+
logger_mock.should_receive(:info).with('[Rollbar] Success')
|
633
|
+
|
634
|
+
orig_max = Rollbar::MAX_PAYLOAD_SIZE
|
635
|
+
|
636
|
+
Rollbar::MAX_PAYLOAD_SIZE = 1
|
637
|
+
Rollbar.report_exception(@exception)
|
638
|
+
|
639
|
+
Rollbar::MAX_PAYLOAD_SIZE = orig_max
|
640
|
+
end
|
641
|
+
end
|
642
|
+
|
643
|
+
context 'truncate_payload' do
|
644
|
+
it 'should truncate all nested strings in the payload' do
|
645
|
+
payload = {
|
646
|
+
:truncated => '1234567',
|
647
|
+
:not_truncated => '123456',
|
648
|
+
:hash => {
|
649
|
+
:inner_truncated => '123456789',
|
650
|
+
:inner_not_truncated => '567',
|
651
|
+
:array => ['12345678', '12', {:inner_inner => '123456789'}]
|
652
|
+
}
|
653
|
+
}
|
654
|
+
|
655
|
+
payload_copy = payload.clone
|
656
|
+
Rollbar.send(:truncate_payload, payload_copy, 6)
|
657
|
+
|
658
|
+
payload_copy[:truncated].should == '123...'
|
659
|
+
payload_copy[:not_truncated].should == '123456'
|
660
|
+
payload_copy[:hash][:inner_truncated].should == '123...'
|
661
|
+
payload_copy[:hash][:inner_not_truncated].should == '567'
|
662
|
+
payload_copy[:hash][:array].should == ['123...', '12', {:inner_inner => '123...'}]
|
663
|
+
end
|
664
|
+
|
665
|
+
it 'should truncate utf8 strings properly' do
|
666
|
+
payload = {
|
667
|
+
:truncated => 'Ŝǻмρļẻ śţяịņģ',
|
668
|
+
:not_truncated => '123456',
|
669
|
+
}
|
670
|
+
|
671
|
+
payload_copy = payload.clone
|
672
|
+
Rollbar.send(:truncate_payload, payload_copy, 6)
|
673
|
+
|
674
|
+
payload_copy[:truncated].should == "Ŝǻм..."
|
675
|
+
payload_copy[:not_truncated].should == '123456'
|
676
|
+
end
|
611
677
|
end
|
612
678
|
|
613
679
|
context 'base_data' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rollbar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.12.
|
4
|
+
version: 0.12.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Rue
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -167,6 +167,7 @@ files:
|
|
167
167
|
- lib/rollbar/rake_tasks.rb
|
168
168
|
- lib/rollbar/request_data_extractor.rb
|
169
169
|
- lib/rollbar/sidekiq.rb
|
170
|
+
- lib/rollbar/util.rb
|
170
171
|
- lib/rollbar/version.rb
|
171
172
|
- rollbar.gemspec
|
172
173
|
- spec/controllers/home_controller_spec.rb
|