rollbar 0.13.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/rollbar.rb +31 -9
- data/lib/rollbar/railtie.rb +2 -2
- data/lib/rollbar/util.rb +16 -1
- data/lib/rollbar/version.rb +1 -1
- data/spec/rollbar_spec.rb +57 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f2c782eb71538b4fa602e2e56c56233559858f7
|
4
|
+
data.tar.gz: 6ad6c0a6b66963dc0b0a2bdb0705df9d95e4f468
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fddd828f6ff42f93a0211e4967baf4a99ff1c93f1b5c1ee1a231004627b80c5b18dfbf6684d94a141144e29bebd17e5d9e6d977844506fb62cd7524272e29ebe
|
7
|
+
data.tar.gz: f6820508de41ddc3fcb9ff89bab83da096a6b778d97bdca10297982561f139d6f1c7591d120bb9165a3bcc3601d7ca5f17c89a137cb49f114b00c8c01273f77c
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
**1.0.0**
|
4
|
+
- Clean up some unused requires
|
5
|
+
- Strip out invalid UTF-8 characters from payload keys/values, fixes [#85](https://github.com/rollbar/rollbar-gem/issues/85)
|
6
|
+
- Bumping to 1.0 due to the suggestion in [#119](https://github.com/rollbar/rollbar-gem/issues/119)
|
7
|
+
|
3
8
|
**0.13.2**
|
4
9
|
- Sidekiq payload is no longer mutated when Rollbar reports a Sidekiq job exception
|
5
10
|
- Fix sucker_punch async reporting when using a forking application server such as Unicorn (`preload_app true`). Jobs are now instantiated for every report instead of a reused global job instance
|
data/lib/rollbar.rb
CHANGED
@@ -1,23 +1,26 @@
|
|
1
1
|
require 'net/https'
|
2
|
-
|
3
|
-
require 'securerandom' if defined?(SecureRandom)
|
4
2
|
require 'socket'
|
5
3
|
require 'thread'
|
6
4
|
require 'uri'
|
7
|
-
|
8
|
-
require 'girl_friday' if defined?(GirlFriday)
|
9
|
-
require 'sucker_punch' if defined?(SuckerPunch)
|
10
5
|
require 'multi_json'
|
11
6
|
|
7
|
+
begin
|
8
|
+
require 'securerandom'
|
9
|
+
rescue LoadError
|
10
|
+
end
|
11
|
+
|
12
12
|
require 'rollbar/version'
|
13
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
17
|
require 'rollbar/util'
|
18
|
-
|
19
18
|
require 'rollbar/railtie' if defined?(Rails)
|
20
19
|
|
20
|
+
unless ''.respond_to? :encode
|
21
|
+
require 'iconv'
|
22
|
+
end
|
23
|
+
|
21
24
|
module Rollbar
|
22
25
|
MAX_PAYLOAD_SIZE = 128 * 1024 #128kb
|
23
26
|
|
@@ -30,7 +33,7 @@ module Rollbar
|
|
30
33
|
def preconfigure
|
31
34
|
yield(configuration)
|
32
35
|
end
|
33
|
-
|
36
|
+
|
34
37
|
# Configures the gem.
|
35
38
|
#
|
36
39
|
# Call on app startup to set the `access_token` (required) and other config params.
|
@@ -47,7 +50,7 @@ module Rollbar
|
|
47
50
|
configuration.enabled = true
|
48
51
|
end
|
49
52
|
yield(configuration)
|
50
|
-
|
53
|
+
|
51
54
|
require_hooks
|
52
55
|
end
|
53
56
|
|
@@ -252,7 +255,7 @@ module Rollbar
|
|
252
255
|
require 'rollbar/delayed_job'
|
253
256
|
Rollbar::Delayed::wrap_worker
|
254
257
|
end
|
255
|
-
|
258
|
+
|
256
259
|
require 'rollbar/sidekiq' if defined?(Sidekiq)
|
257
260
|
require 'rollbar/goalie' if defined?(Goalie)
|
258
261
|
require 'rollbar/rack' if defined?(Rack)
|
@@ -444,6 +447,9 @@ module Rollbar
|
|
444
447
|
:access_token => configuration.access_token,
|
445
448
|
:data => data
|
446
449
|
}
|
450
|
+
|
451
|
+
enforce_valid_utf8(payload)
|
452
|
+
|
447
453
|
result = MultiJson.dump(payload)
|
448
454
|
|
449
455
|
# Try to truncate strings in the payload a few times if the payload is too big
|
@@ -602,6 +608,22 @@ module Rollbar
|
|
602
608
|
log_error "[Rollbar] Error sending failsafe : #{e}"
|
603
609
|
end
|
604
610
|
end
|
611
|
+
|
612
|
+
def enforce_valid_utf8(payload)
|
613
|
+
normalizer = Proc.new do |value|
|
614
|
+
if value.is_a?(String)
|
615
|
+
if value.respond_to? :encode
|
616
|
+
value.encode('UTF-8', 'binary', :invalid => :replace, :undef => :replace, :replace => '')
|
617
|
+
else
|
618
|
+
::Iconv.conv('UTF-8//IGNORE', 'UTF-8', value)
|
619
|
+
end
|
620
|
+
else
|
621
|
+
value
|
622
|
+
end
|
623
|
+
end
|
624
|
+
|
625
|
+
Rollbar::Util::iterate_and_update(payload, normalizer)
|
626
|
+
end
|
605
627
|
|
606
628
|
def truncate_payload(payload, byte_threshold)
|
607
629
|
truncator = Proc.new do |value|
|
data/lib/rollbar/railtie.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'rails'
|
1
|
+
require 'rails/railtie'
|
2
2
|
require 'rollbar'
|
3
3
|
|
4
4
|
module Rollbar
|
@@ -6,7 +6,7 @@ module Rollbar
|
|
6
6
|
rake_tasks do
|
7
7
|
require 'rollbar/rake_tasks'
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
if defined? ActiveRecord
|
11
11
|
initializer 'rollbar.middleware.rails' do |app|
|
12
12
|
require 'rollbar/middleware/rails/rollbar_request_store'
|
data/lib/rollbar/util.rb
CHANGED
@@ -12,12 +12,27 @@ module Rollbar
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
else
|
15
|
+
key_updates = []
|
16
|
+
|
15
17
|
obj.each do |k, v|
|
18
|
+
new_key = nil
|
19
|
+
|
16
20
|
if v.is_a?(Hash) || v.is_a?(Array)
|
17
21
|
self.iterate_and_update(v, block)
|
22
|
+
new_key = block.call(k)
|
18
23
|
else
|
24
|
+
new_key = block.call(k)
|
19
25
|
obj[k] = block.call(v)
|
20
26
|
end
|
27
|
+
|
28
|
+
if new_key != k
|
29
|
+
key_updates.push([k, new_key])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
key_updates.each do |old_key, new_key|
|
34
|
+
obj[new_key] = obj[old_key]
|
35
|
+
obj.delete(old_key)
|
21
36
|
end
|
22
37
|
end
|
23
38
|
end
|
@@ -32,4 +47,4 @@ module Rollbar
|
|
32
47
|
str.unpack("U*").slice(0, length - ellipsis.length).pack("U*") + ellipsis
|
33
48
|
end
|
34
49
|
end
|
35
|
-
end
|
50
|
+
end
|
data/lib/rollbar/version.rb
CHANGED
data/spec/rollbar_spec.rb
CHANGED
@@ -666,6 +666,25 @@ describe Rollbar do
|
|
666
666
|
hash = MultiJson.load(json)
|
667
667
|
hash["data"]["foo"]["bar"].should == "baz"
|
668
668
|
end
|
669
|
+
|
670
|
+
it 'should strip out invalid utf-8' do
|
671
|
+
json = Rollbar.send(:build_payload, {
|
672
|
+
:good_key => "\255bad value",
|
673
|
+
"bad\255 key" => "good value",
|
674
|
+
"bad key 2\255" => "bad \255value",
|
675
|
+
:hash => {
|
676
|
+
"bad array \255key" => ["bad\255 array element", "good array element"]
|
677
|
+
}
|
678
|
+
})
|
679
|
+
|
680
|
+
hash = MultiJson.load(json)
|
681
|
+
hash["data"]["good_key"].should == 'bad value'
|
682
|
+
hash["data"]["bad key"].should == 'good value'
|
683
|
+
hash["data"]["bad key 2"].should == 'bad value'
|
684
|
+
hash["data"]["hash"].should == {
|
685
|
+
"bad array key" => ["bad array element", "good array element"]
|
686
|
+
}
|
687
|
+
end
|
669
688
|
|
670
689
|
it 'should truncate large strings if the payload is too big' do
|
671
690
|
json = Rollbar.send(:build_payload, {:foo => {:bar => "baz"}, :large => 'a' * (128 * 1024), :small => 'b' * 1024})
|
@@ -686,6 +705,44 @@ describe Rollbar do
|
|
686
705
|
Rollbar::MAX_PAYLOAD_SIZE = orig_max
|
687
706
|
end
|
688
707
|
end
|
708
|
+
|
709
|
+
context 'enforce_valid_utf8' do
|
710
|
+
it 'should replace invalid utf8 values' do
|
711
|
+
payload = {
|
712
|
+
:bad_value => "bad value 1\255",
|
713
|
+
:bad_value_2 => "bad\255 value 2",
|
714
|
+
"bad\255 key" => "good value",
|
715
|
+
:hash => {
|
716
|
+
:inner_bad_value => "\255\255bad value 3",
|
717
|
+
"inner \255bad key" => 'inner good value',
|
718
|
+
"bad array key\255" => [
|
719
|
+
'good array value 1',
|
720
|
+
"bad\255 array value 1\255",
|
721
|
+
{
|
722
|
+
:inner_inner_bad => "bad inner \255inner value"
|
723
|
+
}
|
724
|
+
]
|
725
|
+
}
|
726
|
+
}
|
727
|
+
|
728
|
+
payload_copy = payload.clone
|
729
|
+
Rollbar.send(:enforce_valid_utf8, payload_copy)
|
730
|
+
|
731
|
+
payload_copy[:bad_value].should == "bad value 1"
|
732
|
+
payload_copy[:bad_value_2].should == "bad value 2"
|
733
|
+
payload_copy["bad key"].should == "good value"
|
734
|
+
payload_copy.keys.should_not include("bad\456 key")
|
735
|
+
payload_copy[:hash][:inner_bad_value].should == "bad value 3"
|
736
|
+
payload_copy[:hash]["inner bad key"].should == 'inner good value'
|
737
|
+
payload_copy[:hash]["bad array key"].should == [
|
738
|
+
'good array value 1',
|
739
|
+
'bad array value 1',
|
740
|
+
{
|
741
|
+
:inner_inner_bad => 'bad inner inner value'
|
742
|
+
}
|
743
|
+
]
|
744
|
+
end
|
745
|
+
end
|
689
746
|
|
690
747
|
context 'truncate_payload' do
|
691
748
|
it 'should truncate all nested strings in the payload' 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.
|
4
|
+
version: 1.0.0
|
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-07-
|
11
|
+
date: 2014-07-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|