rollbar 1.5.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c44f500c23b54909d0aad2fd733826f930cfaf9e
4
- data.tar.gz: 93a929d8d6b08b8015848b1a591fa209ddd14161
3
+ metadata.gz: 4dd960fba2b048a769f6de1c197af1db2b8ac13f
4
+ data.tar.gz: 40540eb9711481d7340bfe7f2714b9ef2aa59c5d
5
5
  SHA512:
6
- metadata.gz: f4a82ff17e2d2ee1f4bc65aef0be7c2ad1fcccc1b4129b91916c22cb67aa53b2b013f1480f895cc0219f70d516ea6f0a75c83b25dc2d4f5c656f33d2cf5f8e88
7
- data.tar.gz: ff01f87388099db81156bd5a2c83587dcb4eeab5bd3a72da42db76422bf313fc73c4ad6b0fe5690485d6e0d1de835f81462a7f146003abd529dfbc4b2d714f95
6
+ metadata.gz: 8146d9676a4979c7d08f18cbb84559426168c769a5b08e61539e2421409a559563bd7dc4fba94da92f57ad347840d557398e75da9c1b3c5f31c9fa899024b66e
7
+ data.tar.gz: 322436eea5226b598a8988776c80e68886c429c5d021e2136ca45c6521eaaad235bda9d13259d611719172368ab77c8484e815391ffa8926400c1e5d3c869cd2
data/.gitignore CHANGED
@@ -19,3 +19,4 @@ test/tmp
19
19
  test/version_tmp
20
20
  tmp
21
21
  *.swp
22
+ .idea/
@@ -1,4 +1,6 @@
1
1
  sudo: false
2
+ services:
3
+ - redis-server
2
4
  language: ruby
3
5
  # Broken bundler on travis CI - https://github.com/bundler/bundler/issues/2784
4
6
  before_install:
@@ -15,17 +17,79 @@ rvm:
15
17
  - jruby-19mode
16
18
  - jruby-head
17
19
  - rbx
20
+ jdk:
21
+ - openjdk6
22
+ - openjdk7
23
+ - oraclejdk7
24
+ - oraclejdk8
18
25
  env:
19
26
  - SKIP_DUMMY_ROLLBAR=true
20
27
  - SKIP_DUMMY_ROLLBAR=false
28
+ gemfile:
29
+ - gemfiles/rails30.gemfile
30
+ - gemfiles/rails31.gemfile
31
+ - gemfiles/rails32.gemfile
32
+ - gemfiles/rails40.gemfile
33
+ - gemfiles/rails41.gemfile
21
34
  matrix:
22
35
  allow_failures:
23
36
  - rvm: ruby-head
24
37
  - rvm: jruby-18mode
25
- - rvm: jruby-19mode
26
38
  - rvm: jruby-head
27
- - rvm: rbx
39
+
40
+ # NOTE: Allowing this to fail because of some strange error in rspec-core `undefined method `example_group_finished'`.
41
+ # Seems to work with oraclejdk7.
42
+ - rvm: jruby-19mode
43
+ jdk: openjdk7
44
+ env: SKIP_DUMMY_ROLLBAR=false
45
+
28
46
  exclude:
47
+ # Don't run tests for non-jruby environments with the JDK.
48
+ # NOTE: openjdk7 is missing from these exclusions so that Travis will run at least 1 build for the given rvm.
49
+ - rvm: 1.8.7
50
+ jdk: openjdk6
51
+ - rvm: 1.8.7
52
+ jdk: oraclejdk7
53
+ - rvm: 1.8.7
54
+ jdk: oraclejdk8
55
+ - rvm: 1.9.2
56
+ jdk: openjdk6
57
+ - rvm: 1.9.2
58
+ jdk: oraclejdk7
59
+ - rvm: 1.9.2
60
+ jdk: oraclejdk8
61
+ - rvm: 1.9.3
62
+ jdk: openjdk6
63
+ - rvm: 1.9.3
64
+ jdk: oraclejdk7
65
+ - rvm: 1.9.3
66
+ jdk: oraclejdk8
67
+ - rvm: 2.0.0
68
+ jdk: openjdk6
69
+ - rvm: 2.0.0
70
+ jdk: oraclejdk7
71
+ - rvm: 2.0.0
72
+ jdk: oraclejdk8
73
+ - rvm: 2.1.0
74
+ jdk: openjdk6
75
+ - rvm: 2.1.0
76
+ jdk: oraclejdk7
77
+ - rvm: 2.1.0
78
+ jdk: oraclejdk8
79
+ - rvm: ruby-head
80
+ jdk: openjdk6
81
+ - rvm: ruby-head
82
+ jdk: oraclejdk7
83
+ - rvm: ruby-head
84
+ jdk: oraclejdk8
85
+ - rvm: rbx
86
+ jdk: openjdk6
87
+ - rvm: rbx
88
+ jdk: oraclejdk7
89
+ - rvm: rbx
90
+ jdk: oraclejdk8
91
+
92
+ # TODO: comment as to why these are excluded
29
93
  - rvm: 1.8.7
30
94
  gemfile: gemfiles/rails40.gemfile
31
95
  - rvm: 1.8.7
@@ -84,9 +148,3 @@ matrix:
84
148
  gemfile: gemfiles/rails40.gemfile
85
149
  - rvm: rbx
86
150
  gemfile: gemfiles/rails41.gemfile
87
- gemfile:
88
- - gemfiles/rails30.gemfile
89
- - gemfiles/rails31.gemfile
90
- - gemfiles/rails32.gemfile
91
- - gemfiles/rails40.gemfile
92
- - gemfiles/rails41.gemfile
@@ -1,10 +1,26 @@
1
1
  # Change Log
2
2
 
3
+ ## 2.0.0
4
+
5
+ Possibly breaking changes:
6
+
7
+ - If active_support version < 4.1.0 is installed, this gem will now monkeypatch `BasicSocket#to_json`. This is needed to work around a bug causing JSON serialization to fail when the payload contains a Socket instance. We don't expect this to break anything for anyone, unless you are using active_support version < 4.1.0 and also happened to be relying on the buggy Socket serialization behavior.
8
+
9
+ Bug fixes:
10
+
11
+ - Use the JSON gem or native by default. Along with the aforementioned monkeypatch, this fixes the existing bug in active_support < 4.1.0 serializing Socket instances. To disable the monkeypatch, set `config.disable_core_monkey_patch = true`.
12
+ - Add Encoding module, with Encoder and LegacyEncoder classes. This fixes some issues with ISO-8859 strings
13
+
14
+ Other changes:
15
+
16
+ - Update README.md and warn about upgrade to capistrano >= 3.1
17
+ - Fix error in code example for custom Async handlers
18
+
3
19
  ## 1.5.3
4
20
 
5
21
  Bug fixes:
6
22
 
7
- - Run `rollbar-rails-runner` in the context of `Rails` module so we avoid namespace conflitcs. See [#242](https://github.com/rollbar/rollbar-gem/pull/242)
23
+ - Run `rollbar-rails-runner` in the context of `Rails` module so we avoid namespace conflicts. See [#242](https://github.com/rollbar/rollbar-gem/pull/242)
8
24
 
9
25
  ## 1.5.2
10
26
 
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Rollbar notifier for Ruby [![Build Status](https://api.travis-ci.org/rollbar/rollbar-gem.svg?branch=v1.5.3)](https://travis-ci.org/rollbar/rollbar-gem/branches)
1
+ # Rollbar notifier for Ruby [![Build Status](https://api.travis-ci.org/rollbar/rollbar-gem.svg?branch=v2.0.0)](https://travis-ci.org/rollbar/rollbar-gem/branches)
2
2
 
3
3
  <!-- RemoveNext -->
4
4
  [Rollbar](https://rollbar.com) is an error tracking service for Ruby and other languages. The Rollbar service will alert you of problems with your code and help you understand them in a ways never possible before. We love it and we hope you will too.
@@ -12,7 +12,7 @@ This is the Ruby library for Rollbar. It will instrument many kinds of Ruby appl
12
12
  Add this line to your application's Gemfile:
13
13
 
14
14
  ```ruby
15
- gem 'rollbar', '~> 1.5.3'
15
+ gem 'rollbar', '~> 2.0.0
16
16
  ```
17
17
 
18
18
  And then execute:
@@ -121,13 +121,13 @@ begin
121
121
  rescue NoMethodError => e
122
122
  # simple exception report (level can be 'debug', 'info', 'warning', 'error' and 'critical')
123
123
  Rollbar.log('error', e)
124
-
124
+
125
125
  # same functionality as above
126
126
  Rollbar.error(e)
127
-
127
+
128
128
  # with a description
129
129
  Rollbar.error(e, 'The user info hash doesn\'t contain the correct data')
130
-
130
+
131
131
  # with extra data giving more insight about the exception
132
132
  Rollbar.error(e, :user_info => user_info, :job_id => job_id)
133
133
  end
@@ -154,7 +154,7 @@ after_validation :report_validation_errors_to_rollbar
154
154
 
155
155
  ### Advanced usage
156
156
 
157
- You can use `Rollbar.scope()` to copy a notifier instance and customize the payload data for one-off reporting. The hash argument to `scope()` will be merged into the copied notifier's "payload options", a hash that will be merged into the final payload just before it is reported to Rollbar.
157
+ You can use `Rollbar.scope()` to copy a notifier instance and customize the payload data for one-off reporting. The hash argument to `scope()` will be merged into the copied notifier's "payload options", a hash that will be merged into the final payload just before it is reported to Rollbar.
158
158
 
159
159
  For example:
160
160
 
@@ -504,7 +504,7 @@ config.use_thread
504
504
  You can supply your own handler using ```config.async_handler```. The object to set for `async_handler` should respond to `#call` and receive the payload. The handler should schedule the payload for later processing (i.e. with a delayed_job, in a resque queue, etc.) and should itself return immediately. For example:
505
505
 
506
506
  ```ruby
507
- config.use_async
507
+ config.use_async = true
508
508
  config.async_handler = Proc.new { |payload|
509
509
  Thread.new { Rollbar.process_payload_safely(payload) }
510
510
  }
@@ -590,6 +590,8 @@ set :rollbar_env, Proc.new { fetch :stage }
590
590
  set :rollbar_role, Proc.new { :app }
591
591
  ```
592
592
 
593
+ NOTE: We've seen problems with Capistrano version `3.0.x` where the revision reported is incorrect. Version `3.1.0` and higher works correctly.
594
+
593
595
  ### Capistrano 2
594
596
 
595
597
  Add the following to ```deploy.rb```:
@@ -665,6 +667,14 @@ require 'json'
665
667
  MultiJson.use(:json_common)
666
668
  ```
667
669
 
670
+ If you are using jRuby with Oracle and JDK7, you may be expecting some errors sending reports to our API. This is caused by a bug in that JDK and the primer number used in the SSL algorithm. In order to fix this you can set the next configuration:
671
+
672
+ ```ruby
673
+ Rollbar.configure do|config|
674
+ config.endpoint = 'https://api-alt.rollbar.com/api/1/item/'
675
+ end
676
+ ```
677
+
668
678
 
669
679
  ## Help / Support
670
680
 
@@ -2,21 +2,22 @@ require 'rollbar/rails'
2
2
  Rollbar.configure do |config|
3
3
  # Without configuration, Rollbar is enabled in all environments.
4
4
  # To disable in specific environments, set config.enabled=false.
5
- <% if (defined? EY::Config) %>
5
+
6
+ <%- if (defined? EY::Config) -%>
6
7
  # Here we'll disable in 'test' and 'development':
7
8
  if Rails.env.test? or Rails.env.development?
8
9
  config.enabled = false
9
10
  else
10
11
  config.access_token = EY::Config.get('rollbar', 'ROLLBAR_ACCESS_TOKEN')
11
12
  end
12
- <% else %>
13
+ <%- else -%>
13
14
  config.access_token = <%= access_token_expr %>
14
15
 
15
16
  # Here we'll disable in 'test':
16
17
  if Rails.env.test?
17
18
  config.enabled = false
18
19
  end
19
- <% end %>
20
+ <%- end -%>
20
21
 
21
22
  # By default, Rollbar will try to call the `current_user` controller method
22
23
  # to fetch the logged-in user object, and then call that object's `id`,
@@ -2,7 +2,6 @@ require 'net/https'
2
2
  require 'socket'
3
3
  require 'thread'
4
4
  require 'uri'
5
- require 'multi_json'
6
5
  require 'forwardable'
7
6
 
8
7
  begin
@@ -11,7 +10,9 @@ rescue LoadError
11
10
  end
12
11
 
13
12
  require 'rollbar/version'
13
+ require 'rollbar/json'
14
14
  require 'rollbar/configuration'
15
+ require 'rollbar/encoding'
15
16
  require 'rollbar/logger_proxy'
16
17
  require 'rollbar/exception_reporter'
17
18
  require 'rollbar/util'
@@ -20,10 +21,6 @@ require 'rollbar/delay/girl_friday'
20
21
  require 'rollbar/delay/thread'
21
22
  require 'rollbar/truncation'
22
23
 
23
- unless ''.respond_to? :encode
24
- require 'iconv'
25
- end
26
-
27
24
  module Rollbar
28
25
  ATTACHMENT_CLASSES = %w[
29
26
  ActionDispatch::Http::UploadedFile
@@ -444,28 +441,7 @@ module Rollbar
444
441
  end
445
442
 
446
443
  def enforce_valid_utf8(payload)
447
- normalizer = lambda do |object|
448
- is_symbol = object.is_a?(Symbol)
449
-
450
- return object unless object == object.to_s || is_symbol
451
-
452
- value = object.to_s
453
-
454
- if value.respond_to? :encode
455
- options = { :invalid => :replace, :undef => :replace, :replace => '' }
456
- ascii_encodings = [Encoding.find('US-ASCII'), Encoding.find('ASCII-8BIT')]
457
-
458
- args = ['UTF-8']
459
- args << 'binary' if ascii_encodings.include?(value.encoding)
460
- args << options
461
-
462
- encoded_value = value.encode(*args)
463
- else
464
- encoded_value = ::Iconv.conv('UTF-8//IGNORE', 'UTF-8', value)
465
- end
466
-
467
- is_symbol ? encoded_value.to_sym : encoded_value
468
- end
444
+ normalizer = lambda { |object| Encoding.encode(object) }
469
445
 
470
446
  Rollbar::Util.iterate_and_update(payload, normalizer)
471
447
  end
@@ -508,7 +484,7 @@ module Rollbar
508
484
 
509
485
  def send_payload(payload)
510
486
  log_info '[Rollbar] Sending payload'
511
- payload = MultiJson.load(payload) if payload.is_a?(String)
487
+ payload = Rollbar::JSON.load(payload) if payload.is_a?(String)
512
488
 
513
489
  if configuration.use_eventmachine
514
490
  send_payload_using_eventmachine(payload)
@@ -648,7 +624,7 @@ module Rollbar
648
624
  rescue
649
625
  next unless handler == failover_handlers.last
650
626
 
651
- log_error "[Rollbar] All failover handlers failed while processing payload: #{MultiJson.dump(payload)}"
627
+ log_error "[Rollbar] All failover handlers failed while processing payload: #{Rollbar::JSON.dump(payload)}"
652
628
  end
653
629
  end
654
630
  end
@@ -660,10 +636,10 @@ module Rollbar
660
636
  result = Truncation.truncate(stringified_payload)
661
637
  return result unless Truncation.truncate?(result)
662
638
 
663
- original_size = MultiJson.dump(payload).bytesize
639
+ original_size = Rollbar::JSON.dump(payload).bytesize
664
640
  final_size = result.bytesize
665
641
  send_failsafe("Could not send payload due to it being too large after truncating attempts. Original size: #{original_size} Final size: #{final_size}", nil)
666
- log_error "[Rollbar] Payload too large to be sent: #{MultiJson.dump(payload)}"
642
+ log_error "[Rollbar] Payload too large to be sent: #{Rollbar::JSON.dump(payload)}"
667
643
 
668
644
  nil
669
645
  end
@@ -710,14 +686,17 @@ module Rollbar
710
686
 
711
687
  yield(configuration)
712
688
 
689
+ configure_json_backend
713
690
  require_hooks
714
- # This monkey patch is always needed in order
715
- # to use Rollbar.scoped
716
- require 'rollbar/core_ext/thread'
691
+ require_core_extensions
717
692
 
718
693
  reset_notifier!
719
694
  end
720
695
 
696
+ def configure_json_backend
697
+ Rollbar::JSON.setup
698
+ end
699
+
721
700
  def reconfigure
722
701
  @configuration = Configuration.new
723
702
  @configuration.enabled = true
@@ -750,6 +729,28 @@ module Rollbar
750
729
  require 'rollbar/better_errors' if defined?(BetterErrors)
751
730
  end
752
731
 
732
+ def require_core_extensions
733
+ # This monkey patch is always needed in order
734
+ # to use Rollbar.scoped
735
+ require 'rollbar/core_ext/thread'
736
+
737
+ return if configuration.disable_core_monkey_patch
738
+
739
+ # Needed to avoid active_support (< 4.1.0) bug serializing JSONs
740
+ require 'rollbar/core_ext/basic_socket' if monkey_patch_socket?
741
+ end
742
+
743
+ def monkey_patch_socket?
744
+ return false unless defined?(ActiveSupport::VERSION::STRING)
745
+
746
+ major, minor = ActiveSupport::VERSION::STRING.split('.').map(&:to_i)
747
+
748
+ return true if major == 3
749
+ return true if major == 4 && minor == 0
750
+
751
+ false
752
+ end
753
+
753
754
  def wrap_delayed_worker
754
755
  return unless defined?(Delayed) && defined?(Delayed::Worker) && configuration.delayed_job_enabled
755
756
 
@@ -11,6 +11,7 @@ module Rollbar
11
11
  attr_accessor :delayed_job_enabled
12
12
  attr_accessor :default_logger
13
13
  attr_accessor :disable_monkey_patch
14
+ attr_accessor :disable_core_monkey_patch
14
15
  attr_accessor :dj_threshold
15
16
  attr_accessor :enabled
16
17
  attr_accessor :endpoint
@@ -53,6 +54,7 @@ module Rollbar
53
54
  @default_logger = lambda { Logger.new(STDERR) }
54
55
  @delayed_job_enabled = true
55
56
  @disable_monkey_patch = false
57
+ @disable_core_monkey_patch = false
56
58
  @dj_threshold = 0
57
59
  @enabled = nil # set to true when configure is called
58
60
  @endpoint = DEFAULT_ENDPOINT
@@ -0,0 +1,7 @@
1
+ require 'socket'
2
+
3
+ class BasicSocket
4
+ def as_json
5
+ to_s
6
+ end
7
+ end
@@ -0,0 +1,21 @@
1
+ module Rollbar
2
+ module Encoding
3
+ def self.encode(object)
4
+ can_be_encoded = object.is_a?(Symbol) || object.is_a?(String)
5
+
6
+ return object unless can_be_encoded
7
+
8
+ encoding_class.new(object).encode
9
+ end
10
+
11
+ def self.encoding_class
12
+ if String.instance_methods.include?(:encode)
13
+ require 'rollbar/encoding/encoder'
14
+ Encoder
15
+ else
16
+ require 'rollbar/encoding/legacy_encoder'
17
+ LegacyEncoder
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,54 @@
1
+ module Rollbar
2
+ module Encoding
3
+ class Encoder
4
+ ALL_ENCODINGS = [::Encoding::UTF_8, ::Encoding::ISO_8859_1, ::Encoding::ASCII_8BIT, ::Encoding::US_ASCII]
5
+ ASCII_ENCODINGS = [::Encoding::US_ASCII, ::Encoding::ASCII_8BIT, ::Encoding::ISO_8859_1]
6
+ ENCODING_OPTIONS = { :invalid => :replace, :undef => :replace, :replace => '' }
7
+
8
+ attr_accessor :object
9
+
10
+ def initialize(object)
11
+ @object = object
12
+ end
13
+
14
+ def encode
15
+ value = object.to_s
16
+
17
+ encoded_value = force_encoding(value).encode(*encoding_args(value))
18
+
19
+ object.is_a?(Symbol) ? encoded_value.to_sym : encoded_value
20
+ end
21
+
22
+ private
23
+
24
+ def force_encoding(value)
25
+ return value if value.frozen?
26
+
27
+ value.force_encoding(detect_encoding(value)) if value.encoding == ::Encoding::UTF_8
28
+
29
+ value
30
+ end
31
+
32
+ def detect_encoding(v)
33
+ value = v.dup
34
+
35
+ ALL_ENCODINGS.detect do |encoding|
36
+ begin
37
+ value.force_encoding(encoding).encode(::Encoding::UTF_8).codepoints
38
+ true
39
+ rescue
40
+ false
41
+ end
42
+ end
43
+ end
44
+
45
+ def encoding_args(value)
46
+ args = ['UTF-8']
47
+ args << 'binary' if ASCII_ENCODINGS.include?(value.encoding)
48
+ args << ENCODING_OPTIONS
49
+
50
+ args
51
+ end
52
+ end
53
+ end
54
+ end