rollbar 1.5.3 → 2.0.0

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 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