rollbar 2.2.1 → 2.3.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: a8387b8dd9b53558f27d84908e1f3ac8beb26204
4
- data.tar.gz: d8eec2f09315894700991fbaf1765d30cd0c697d
3
+ metadata.gz: 6e71e17b7e4734a7d1f0ef5b089a35786b962b4e
4
+ data.tar.gz: 6b91570fd7e15397aa2100e0e2e99339d99544b0
5
5
  SHA512:
6
- metadata.gz: 15191d6677c822f80dadeb608d41e1cd35e778e15a4f2e49254bd954e2db4179127406c841f05910cee36a8d2be6adabbb70704f18e53f6b9da0c773bb231585
7
- data.tar.gz: 59e4273d242a88151f509845334448c067eb63b97241785eb4b46db6fbe1afcb4a916760fa2351283df1b10357394c59026aaeb808784f5119295394123b1289
6
+ metadata.gz: 5d768005681a92731a4947f3f8afb7db45cf73f2cc51119495e731dd7cf8fdf3b58c7dc6220e234e47f3dc00acf1c1b50c4870763b7685e6e8ec362f5001cf5d
7
+ data.tar.gz: 0383bbc528d88144cf755ac2d7042fcb4165faa521d69c58f65f2a2ebb7be1db17dddd98cd5c41187e85fbc8264e20f0cc12555a32bd577725f49d3c2ade2b37
@@ -1,5 +1,20 @@
1
1
  # Change Log
2
2
 
3
+ ## 2.3.0
4
+
5
+ Internal changes:
6
+
7
+ - Use Oj instead of JSON gem for payload serializing. See [#300](https://github.com/rollbar/rollbar-gem/pull/300)
8
+ - Send nearest backtrace entry on failsafe messages. See [#290](https://github.com/rollbar/rollbar-gem/pull/290)
9
+ - Remove whitespace from config template. See [#295](https://github.com/rollbar/rollbar-gem/pull/295)
10
+
11
+ Bug fixes:
12
+
13
+ - Send correct hash value for delayed job 'handler' object. See [#301](https://github.com/rollbar/rollbar-gem/pull/301)
14
+ - Fix delayed_job crash reports. See [#293](https://github.com/rollbar/rollbar-gem/pull/293)
15
+ - Send session data instead of session store options. [#289](https://github.com/rollbar/rollbar-gem/pull/289)
16
+
17
+
3
18
  ## 2.2.1
4
19
 
5
20
  Improvement:
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=v2.2.1)](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.3.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', '~> 2.2.1'
15
+ gem 'rollbar', '~> 2.3.0'
16
16
  ```
17
17
 
18
18
  And then execute:
@@ -1,16 +1,17 @@
1
1
  # This file was generated by Appraisal
2
2
 
3
- source "https://rubygems.org"
3
+ source 'https://rubygems.org'
4
4
 
5
- gem "sqlite3", :platform => [:ruby, :mswin, :mingw]
6
- gem "jruby-openssl", :platform => :jruby
7
- gem "activerecord-jdbcsqlite3-adapter", :platform => :jruby
8
- gem "appraisal", '= 1.0.2'
9
- gem "rubysl", "~> 2.0", :platform => :rbx
10
- gem "racc", :platform => :rbx
11
- gem "minitest", :platform => :rbx
12
- gem "rubysl-test-unit", :platform => :rbx
13
- gem "rubinius-developer_tools", :platform => :rbx
14
- gem "rails", "3.0.20"
5
+ gem 'sqlite3', :platform => [:ruby, :mswin, :mingw]
6
+ gem 'jruby-openssl', :platform => :jruby
7
+ gem 'activerecord-jdbcsqlite3-adapter', :platform => :jruby
8
+ gem 'appraisal', '= 1.0.2'
9
+ gem 'rubysl', '~> 2.0', :platform => :rbx
10
+ gem 'racc', :platform => :rbx
11
+ gem 'minitest', :platform => :rbx
12
+ gem 'rubysl-test-unit', :platform => :rbx
13
+ gem 'rubinius-developer_tools', :platform => :rbx
14
+ gem 'rails', '3.0.20'
15
+ gem 'hitimes', '< 1.2.2'
15
16
 
16
- gemspec :path => "../"
17
+ gemspec :path => '../'
@@ -2,7 +2,7 @@ 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
-
5
+
6
6
  <%- if (defined? EY::Config) -%>
7
7
  # Here we'll disable in 'test' and 'development':
8
8
  if Rails.env.test? or Rails.env.development?
@@ -573,21 +573,11 @@ module Rollbar
573
573
  end
574
574
 
575
575
  def send_failsafe(message, exception)
576
- body = 'Failsafe from rollbar-gem: '
577
- log_error "[Rollbar] Sending failsafe response due to #{message}."
576
+ exception_reason = failsafe_reason(message, exception)
578
577
 
579
- if exception
580
- begin
581
- body += "#{exception.class.name}: #{message}"
582
- log_error "[Rollbar] #{exception.class.name}: #{exception}"
583
- rescue
584
- end
585
- else
586
- begin
587
- body += message.to_s
588
- rescue
589
- end
590
- end
578
+ log_error "[Rollbar] Sending failsafe response due to #{exception_reason}"
579
+
580
+ body = failsafe_body(exception_reason)
591
581
 
592
582
  failsafe_data = {
593
583
  :level => 'error',
@@ -619,6 +609,34 @@ module Rollbar
619
609
  failsafe_payload
620
610
  end
621
611
 
612
+ def failsafe_reason(message, exception)
613
+ body = ''
614
+
615
+ if exception
616
+ begin
617
+ backtrace = exception.backtrace || []
618
+ nearest_frame = backtrace[0]
619
+
620
+ exception_info = exception.class.name
621
+ exception_info += " in #{nearest_frame}" if nearest_frame
622
+
623
+ body += "#{exception_info}: #{message}"
624
+ rescue
625
+ end
626
+ else
627
+ begin
628
+ body += message.to_s
629
+ rescue
630
+ end
631
+ end
632
+
633
+ body
634
+ end
635
+
636
+ def failsafe_body(reason)
637
+ "Failsafe from rollbar-gem. #{reason}"
638
+ end
639
+
622
640
  def schedule_payload(payload)
623
641
  return if payload.nil?
624
642
 
@@ -778,14 +796,7 @@ module Rollbar
778
796
  end
779
797
 
780
798
  def monkey_patch_socket?
781
- return false unless defined?(ActiveSupport::VERSION::STRING)
782
-
783
- major, minor = ActiveSupport::VERSION::STRING.split('.').map(&:to_i)
784
-
785
- return true if major == 3
786
- return true if major == 4 && minor == 0
787
-
788
- false
799
+ defined?(ActiveSupport::VERSION::STRING)
789
800
  end
790
801
 
791
802
  def wrap_delayed_worker
@@ -1,20 +1,66 @@
1
+ require 'delayed_job'
2
+
1
3
  module Rollbar
2
4
  module Delayed
5
+ class << self
6
+ attr_accessor :wrapped
7
+ end
8
+
9
+ class JobData
10
+ attr_reader :job
11
+
12
+ def initialize(job)
13
+ @job = job
14
+ end
15
+
16
+ def to_hash
17
+ job_data = job.as_json
18
+ # Here job_data['handler'] is a YAML object comming
19
+ # from the storage backend
20
+ job_data['handler'] = job.payload_object.as_json
21
+
22
+ job_data
23
+ end
24
+ end
25
+
26
+ self.wrapped = false
27
+
3
28
  def self.wrap_worker
4
- return if @wrapped
5
- @wrapped = true
29
+ return if wrapped
30
+
31
+ around_invoke_job(&invoke_job_callback)
6
32
 
7
- ::Delayed::Worker.lifecycle.around(:invoke_job) do |job, *args, &block|
33
+ self.wrapped = true
34
+ end
35
+
36
+ def self.around_invoke_job(&block)
37
+ ::Delayed::Worker.lifecycle.around(:invoke_job, &block)
38
+ end
39
+
40
+ def self.invoke_job_callback
41
+ proc do |job, *args, &block|
8
42
  begin
9
43
  block.call(job, *args)
10
- rescue Exception => e
11
- if job.attempts >= ::Rollbar.configuration.dj_threshold
12
- data = ::Rollbar.configuration.report_dj_data ? job : nil
13
- ::Rollbar.scope(:request => data).error(e, :use_exception_level_filters => true)
14
- end
44
+ rescue => e
45
+ report(e, job)
46
+
15
47
  raise e
16
48
  end
17
49
  end
18
50
  end
51
+
52
+ def self.report(e, job)
53
+ return unless job.attempts <= ::Rollbar.configuration.dj_threshold
54
+
55
+ data = build_job_data(job)
56
+
57
+ ::Rollbar.scope(:request => data).error(e, :use_exception_level_filters => true)
58
+ end
59
+
60
+ def self.build_job_data(job)
61
+ return nil unless ::Rollbar.configuration.report_dj_data
62
+
63
+ JobData.new(job).to_hash
64
+ end
19
65
  end
20
66
  end
@@ -6,23 +6,20 @@ module Rollbar
6
6
  attr_accessor :dump_method
7
7
  attr_accessor :load_method
8
8
 
9
- def load_native_json
10
- require 'json' unless defined?(::JSON)
9
+ def load_oj
10
+ require 'oj'
11
11
 
12
- if ::JSON.respond_to?(:dump_default_options)
13
- options = ::JSON.dump_default_options
14
- else
15
- # Default options from json 1.1.9 up to 1.6.1
16
- options = { :allow_nan => true, :max_nesting => false }
17
- end
12
+ options = { :mode=> :compat,
13
+ :use_to_json => false,
14
+ :symbol_keys => false,
15
+ :circular => false
16
+ }
18
17
 
19
- self.dump_method = proc { |obj| ::JSON.generate(obj, options) }
20
- self.load_method = proc { |obj| ::JSON.load(obj) }
21
- self.backend_name = :json
18
+ self.dump_method = proc { |obj| Oj.dump(obj, options) }
19
+ self.load_method = proc { |obj| Oj.load(obj, options) }
20
+ self.backend_name = :oj
22
21
 
23
22
  true
24
- rescue StandardError, ScriptError => err
25
- Rollbar.log_debug('%p while loading JSON library: %s' % [err, err.message])
26
23
  end
27
24
 
28
25
  def dump(object)
@@ -34,7 +31,7 @@ module Rollbar
34
31
  end
35
32
 
36
33
  def setup
37
- load_native_json
34
+ load_oj
38
35
  end
39
36
  end
40
37
  end
@@ -25,7 +25,7 @@ module Rollbar
25
25
  post_params = rollbar_filtered_params(sensitive_params, rollbar_post_params(rack_req))
26
26
  raw_body_params = rollbar_filtered_params(sensitive_params, mergeable_raw_body_params(rack_req))
27
27
  cookies = rollbar_filtered_params(sensitive_params, rollbar_request_cookies(rack_req))
28
- session = rollbar_filtered_params(sensitive_params, env['rack.session.options'])
28
+ session = rollbar_filtered_params(sensitive_params, rollbar_request_session(rack_req))
29
29
  route_params = rollbar_filtered_params(sensitive_params, rollbar_route_params(env))
30
30
 
31
31
  params = request_params.merge(get_params).merge(post_params).merge(raw_body_params)
@@ -150,6 +150,14 @@ module Rollbar
150
150
  end
151
151
  end
152
152
 
153
+ def rollbar_request_session(rack_req)
154
+ session = rack_req.session
155
+
156
+ session.to_hash
157
+ rescue
158
+ {}
159
+ end
160
+
153
161
  def rollbar_request_cookies(rack_req)
154
162
  rack_req.cookies
155
163
  rescue
@@ -1,3 +1,3 @@
1
1
  module Rollbar
2
- VERSION = "2.2.1"
2
+ VERSION = "2.3.0"
3
3
  end
@@ -28,4 +28,5 @@ Gem::Specification.new do |gem|
28
28
  gem.add_development_dependency 'delayed_job'
29
29
  gem.add_development_dependency 'rake', '>= 0.9.0'
30
30
  gem.add_development_dependency 'redis'
31
+ gem.add_runtime_dependency 'oj', '~> 2.12.14'
31
32
  end
@@ -368,7 +368,7 @@ describe HomeController do
368
368
  end
369
369
  end
370
370
 
371
- context 'with multiple uploads' do
371
+ context 'with multiple uploads', :type => :request do
372
372
  it "saves attachment data for all uploads" do
373
373
  expect { post '/file_upload', :upload => [file1, file2] }.to raise_exception
374
374
  sent_params = Rollbar.last_report[:request][:params]['upload']
@@ -379,6 +379,17 @@ describe HomeController do
379
379
  end
380
380
  end
381
381
 
382
+ context 'with session data', :type => :request do
383
+ before { get '/set_session_data' }
384
+ it 'reports the session data' do
385
+ expect { get '/use_session_data' }.to raise_exception
386
+
387
+ session_data = Rollbar.last_report[:request][:session]
388
+
389
+ expect(session_data['some_value']).to be_eql('this-is-a-cool-value')
390
+ end
391
+ end
392
+
382
393
  after(:each) do
383
394
  Rollbar.configure do |config|
384
395
  config.logger = ::Rails.logger
@@ -0,0 +1,133 @@
1
+ require 'ostruct'
2
+ require 'delayed/backend/base'
3
+
4
+ # This code is taken from delayed_job/spec/delayed/backend/test.rb.
5
+ #
6
+ # It just works as a in memory job backend. Job#save is modified to create
7
+ # a new Delayed::Worker and call #work_off(1) so the job is processed inline.
8
+
9
+ module Delayed
10
+ module Backend
11
+ module Test
12
+ def self.run
13
+ worker.work_off(1)
14
+ end
15
+
16
+ def self.worker
17
+ @worker ||= ::Delayed::Worker.new
18
+ end
19
+
20
+ class Job
21
+ attr_accessor :id
22
+ attr_accessor :priority
23
+ attr_accessor :attempts
24
+ attr_accessor :handler
25
+ attr_accessor :last_error
26
+ attr_accessor :run_at
27
+ attr_accessor :locked_at
28
+ attr_accessor :locked_by
29
+ attr_accessor :failed_at
30
+ attr_accessor :queue
31
+
32
+ include Delayed::Backend::Base
33
+
34
+ cattr_accessor :id
35
+ self.id = 0
36
+
37
+ def initialize(hash = {})
38
+ self.attempts = 0
39
+ self.priority = 0
40
+ self.id = (self.class.id += 1)
41
+ hash.each { |k, v| send(:"#{k}=", v) }
42
+ end
43
+
44
+ def self.all
45
+ @jobs ||= []
46
+ end
47
+
48
+ def self.count
49
+ all.size
50
+ end
51
+
52
+ def self.delete_all
53
+ all.clear
54
+ end
55
+
56
+ def self.create(attrs = {})
57
+ new(attrs).tap do |o|
58
+ o.save
59
+ end
60
+ end
61
+
62
+ def self.create!(*args)
63
+ create(*args)
64
+ end
65
+
66
+ def self.clear_locks!(worker_name)
67
+ all.select { |j| j.locked_by == worker_name }.each do |j|
68
+ j.locked_by = nil
69
+ j.locked_at = nil
70
+ end
71
+ end
72
+
73
+ # Find a few candidate jobs to run (in case some immediately get locked by others).
74
+ def self.find_available(worker_name, limit = 5, max_run_time = Worker.max_run_time) # rubocop:disable CyclomaticComplexity, PerceivedComplexity
75
+ jobs = all.select do |j|
76
+ j.run_at <= db_time_now &&
77
+ (j.locked_at.nil? || j.locked_at < db_time_now - max_run_time || j.locked_by == worker_name) &&
78
+ !j.failed?
79
+ end
80
+ jobs.select! { |j| j.priority <= Worker.max_priority } if Worker.max_priority
81
+ jobs.select! { |j| j.priority >= Worker.min_priority } if Worker.min_priority
82
+ jobs.select! { |j| Worker.queues.include?(j.queue) } if Worker.queues.any?
83
+ jobs.sort_by! { |j| [j.priority, j.run_at] }[0..limit - 1]
84
+ end
85
+
86
+ # Lock this job for this worker.
87
+ # Returns true if we have the lock, false otherwise.
88
+ def lock_exclusively!(_max_run_time, worker)
89
+ now = self.class.db_time_now
90
+ if locked_by != worker
91
+ # We don't own this job so we will update the locked_by name and the locked_at
92
+ self.locked_at = now
93
+ self.locked_by = worker
94
+ end
95
+
96
+ true
97
+ end
98
+
99
+ def self.db_time_now
100
+ Time.current
101
+ end
102
+
103
+ def update_attributes(attrs = {})
104
+ attrs.each { |k, v| send(:"#{k}=", v) }
105
+ save
106
+ end
107
+
108
+ def destroy
109
+ self.class.all.delete(self)
110
+ end
111
+
112
+ def save
113
+ self.run_at ||= Time.current
114
+
115
+ self.class.all << self unless self.class.all.include?(self)
116
+
117
+ ::Delayed::Backend::Test.run
118
+
119
+ true
120
+ end
121
+
122
+ def save!
123
+ save
124
+ end
125
+
126
+ def reload
127
+ reset
128
+ self
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
File without changes
@@ -32,6 +32,16 @@ class HomeController < ApplicationController
32
32
  this = will_crash
33
33
  end
34
34
 
35
+ def set_session_data
36
+ session[:some_value] = 'this-is-a-cool-value'
37
+
38
+ render :json => {}
39
+ end
40
+
41
+ def use_session_data
42
+ oh = this_is_crashing!
43
+ end
44
+
35
45
  def current_user
36
46
  @current_user ||= User.find_by_id(cookies[:session_id])
37
47
  end
@@ -1,12 +1,16 @@
1
1
  Dummy::Application.routes.draw do
2
- root :to => "home#index"
2
+ root :to => 'home#index'
3
3
  resources :users do
4
4
  member { post :start_session }
5
5
  end
6
6
 
7
- get "/cause_exception" => "home#cause_exception"
8
- put "/deprecated_report_exception" => "home#deprecated_report_exception"
9
- match "/report_exception" => "home#report_exception", :via => [:get, :post, :put]
10
- get "/current_user" => "home#current_user"
11
- post "/file_upload" => "home#file_upload"
7
+ get '/cause_exception' => 'home#cause_exception'
8
+ put '/deprecated_report_exception' => 'home#deprecated_report_exception'
9
+ match '/report_exception' => 'home#report_exception',
10
+ :via => [:get, :post, :put]
11
+ get '/current_user' => 'home#current_user'
12
+ post '/file_upload' => 'home#file_upload'
13
+
14
+ get '/set_session_data' => 'home#set_session_data'
15
+ get '/use_session_data' => 'home#use_session_data'
12
16
  end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ require 'rollbar/delayed_job'
4
+ require 'delayed/backend/test'
5
+
6
+ describe Rollbar::Delayed::JobData do
7
+ describe '#to_hash' do
8
+ let(:handler) { { 'foo' => 'bar' } }
9
+
10
+ let(:attrs) do
11
+ {
12
+ 'id' => 1,
13
+ 'priority' => 0,
14
+ 'attempts' => 1,
15
+ 'handler' => handler.to_yaml
16
+ }
17
+ end
18
+
19
+ let(:job) do
20
+ ::Delayed::Backend::Test::Job.new(attrs)
21
+ end
22
+
23
+ subject { described_class.new(job) }
24
+
25
+ it 'returns the correct job data' do
26
+ expected_result = attrs.dup
27
+ expected_result.delete('id')
28
+ expected_result['handler'] = handler
29
+
30
+ result = subject.to_hash
31
+
32
+ expect(result).to be_eql(expected_result)
33
+ end
34
+ end
35
+ end
@@ -6,41 +6,54 @@ describe Rollbar::Delayed, :reconfigure_notifier => true do
6
6
  class FailingJob
7
7
  class TestException < Exception; end
8
8
 
9
- def perform
10
- fail(TestException, 'failing')
9
+ def do_job_please!(a, b)
10
+ this = will_crash_again!
11
11
  end
12
12
  end
13
13
 
14
- module DummyBackend
15
- class Job
16
- include Delayed::Backend::Base
14
+ before do
15
+ Rollbar::Delayed.wrap_worker
16
+ Delayed::Worker.backend = :test
17
17
 
18
- attr_accessor :handler, :attempts
18
+ Delayed::Backend::Test::Job.delete_all
19
+ end
19
20
 
20
- def initialize(options = {})
21
- @payload_object = options[:payload_object]
22
- @attempts = 0
23
- end
24
- end
21
+ let(:expected_args) do
22
+ [kind_of(NoMethodError), { :use_exception_level_filters => true }]
25
23
  end
26
24
 
27
- let(:logger) { Rollbar.logger }
25
+ context 'with delayed method without arguments failing' do
26
+ it 'sends the exception' do
27
+ expect(Rollbar).to receive(:scope).with(kind_of(Hash)).and_call_original
28
+ expect_any_instance_of(Rollbar::Notifier).to receive(:error).with(*expected_args)
28
29
 
29
- before do
30
- Rollbar::Delayed.wrap_worker
31
- Delayed::Worker.delay_jobs = false
32
- Delayed::Worker.backend = DummyBackend::Job
30
+ FailingJob.new.delay.do_job_please!(:foo, :bar)
31
+ end
33
32
  end
34
33
 
35
- let(:expected_args) do
36
- [kind_of(FailingJob::TestException), { :use_exception_level_filters => true}]
37
- end
38
34
 
39
- it 'sends the exception' do
40
- expect_any_instance_of(Rollbar::Notifier).to receive(:error).with(*expected_args)
35
+ describe '.build_job_data' do
36
+ let(:job) { double(:payload_object => {}) }
37
+
38
+ context 'if report_dj_data is disabled' do
39
+ before do
40
+ allow(Rollbar.configuration).to receive(:report_dj_data).and_return(false)
41
+ end
42
+
43
+ it 'returns nil' do
44
+ expect(described_class.build_job_data(job)).to be_nil
45
+ end
46
+ end
47
+
48
+ context 'with report_dj_data enabled' do
49
+ before do
50
+ allow(Rollbar.configuration).to receive(:report_dj_data).and_return(true)
51
+ end
41
52
 
42
- expect do
43
- Delayed::Job.enqueue(FailingJob.new)
44
- end.to raise_error(FailingJob::TestException)
53
+ it 'returns a hash' do
54
+ result = described_class.build_job_data(job)
55
+ expect(result).to be_kind_of(Hash)
56
+ end
57
+ end
45
58
  end
46
59
  end
@@ -7,23 +7,37 @@ describe Rollbar::JSON do
7
7
  Rollbar::JSON.setup
8
8
  end
9
9
 
10
+ let(:payload) do
11
+ { :foo => :bar }
12
+ end
13
+
14
+ let(:options) do
15
+ {
16
+ :mode => :compat,
17
+ :use_to_json => false,
18
+ :symbol_keys => false,
19
+ :circular => false
20
+ }
21
+ end
22
+
10
23
  describe '.dump' do
11
24
  it 'has JSON as backend' do
12
- expect(Rollbar::JSON.backend_name).to be_eql(:json)
25
+ expect(Rollbar::JSON.backend_name).to be_eql(:oj)
13
26
  end
14
27
 
28
+
15
29
  it 'calls JSON.generate' do
16
- expect(::JSON).to receive(:generate).once
30
+ expect(::Oj).to receive(:dump).once.with(payload, options)
17
31
 
18
- Rollbar::JSON.dump(:foo => :bar)
32
+ Rollbar::JSON.dump(payload)
19
33
  end
20
34
  end
21
35
 
22
36
  describe '.load' do
23
37
  it 'calls MultiJson.load' do
24
- expect(::JSON).to receive(:load).once
38
+ expect(::Oj).to receive(:load).once.with(payload, options)
25
39
 
26
- Rollbar::JSON.load(:foo => :bar)
40
+ Rollbar::JSON.load(payload)
27
41
  end
28
42
  end
29
43
  end
@@ -1564,14 +1564,14 @@ describe Rollbar do
1564
1564
  context "send_failsafe" do
1565
1565
  let(:exception) { StandardError.new }
1566
1566
 
1567
- it "should not crash when given a message and exception" do
1567
+ it "doesn't crash when given a message and exception" do
1568
1568
  sent_payload = notifier.send(:send_failsafe, "test failsafe", exception)
1569
1569
 
1570
- expected_message = 'Failsafe from rollbar-gem: StandardError: test failsafe'
1570
+ expected_message = 'Failsafe from rollbar-gem. StandardError: test failsafe'
1571
1571
  expect(sent_payload['data'][:body][:message][:body]).to be_eql(expected_message)
1572
1572
  end
1573
1573
 
1574
- it "should not crash when given all nils" do
1574
+ it "doesn't crash when given all nils" do
1575
1575
  notifier.send(:send_failsafe, nil, nil)
1576
1576
  end
1577
1577
 
@@ -1579,10 +1579,29 @@ describe Rollbar do
1579
1579
  it 'just sends the given message' do
1580
1580
  sent_payload = notifier.send(:send_failsafe, "test failsafe", nil)
1581
1581
 
1582
- expected_message = 'Failsafe from rollbar-gem: test failsafe'
1582
+ expected_message = 'Failsafe from rollbar-gem. test failsafe'
1583
1583
  expect(sent_payload['data'][:body][:message][:body]).to be_eql(expected_message)
1584
1584
  end
1585
1585
  end
1586
+
1587
+ context 'if the exception has a backtrace' do
1588
+ let(:backtrace) { ['func3', 'func2', 'func1'] }
1589
+ let(:failsafe_reason) { 'StandardError in func3: test failsafe' }
1590
+ let(:expected_body) { "Failsafe from rollbar-gem. #{failsafe_reason}" }
1591
+ let(:expected_log_message) do
1592
+ "[Rollbar] Sending failsafe response due to #{failsafe_reason}"
1593
+ end
1594
+
1595
+ before { exception.set_backtrace(backtrace) }
1596
+
1597
+ it 'adds the nearest frame to the message' do
1598
+ expect(notifier).to receive(:log_error).with(expected_log_message)
1599
+
1600
+ sent_payload = notifier.send(:send_failsafe, "test failsafe", exception)
1601
+
1602
+ expect(sent_payload['data'][:body][:message][:body]).to be_eql(expected_body)
1603
+ end
1604
+ end
1586
1605
  end
1587
1606
 
1588
1607
  context 'when reporting internal error with nil context' do
@@ -20,6 +20,7 @@ Rake::Task['dummy:db:setup'].invoke
20
20
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
21
21
 
22
22
  RSpec.configure do |config|
23
+ config.extend(Helpers)
23
24
  config.include(NotifierHelpers)
24
25
  config.include(FixtureHelpers)
25
26
  config.include(EncodingHelpers)
@@ -52,7 +53,3 @@ RSpec.configure do |config|
52
53
  end
53
54
  end
54
55
 
55
- def local?
56
- ENV['LOCAL'] == '1'
57
- end
58
-
@@ -0,0 +1,5 @@
1
+ module Helpers
2
+ def local?
3
+ ENV['LOCAL'] == '1'
4
+ end
5
+ end
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: 2.2.1
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rollbar, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-01 00:00:00.000000000 Z
11
+ date: 2015-09-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -178,6 +178,20 @@ dependencies:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: oj
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 2.12.14
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: 2.12.14
181
195
  description: Easy and powerful exception tracking for Ruby
182
196
  email:
183
197
  - support@rollbar.com
@@ -256,6 +270,8 @@ files:
256
270
  - spec/controllers/home_controller_spec.rb
257
271
  - spec/delay/sidekiq_spec.rb
258
272
  - spec/delay/sucker_punch_spec.rb
273
+ - spec/delayed/backend/test.rb
274
+ - spec/delayed/serialization/test.rb
259
275
  - spec/dummyapp/.gitignore
260
276
  - spec/dummyapp/Rakefile
261
277
  - spec/dummyapp/app/assets/javascripts/application.js
@@ -318,6 +334,7 @@ files:
318
334
  - spec/rollbar/delay/girl_friday_spec.rb
319
335
  - spec/rollbar/delay/resque_spec.rb
320
336
  - spec/rollbar/delay/thread_spec.rb
337
+ - spec/rollbar/delayed_job/job_data.rb
321
338
  - spec/rollbar/delayed_job_spec.rb
322
339
  - spec/rollbar/encoding/encoder_spec.rb
323
340
  - spec/rollbar/json_spec.rb
@@ -338,6 +355,7 @@ files:
338
355
  - spec/support/encoding_helpers.rb
339
356
  - spec/support/fixture_helpers.rb
340
357
  - spec/support/get_ip_raising.rb
358
+ - spec/support/helpers.rb
341
359
  - spec/support/notifier_helpers.rb
342
360
  - spec/support/shared_contexts.rb
343
361
  homepage: https://rollbar.com
@@ -368,6 +386,8 @@ test_files:
368
386
  - spec/controllers/home_controller_spec.rb
369
387
  - spec/delay/sidekiq_spec.rb
370
388
  - spec/delay/sucker_punch_spec.rb
389
+ - spec/delayed/backend/test.rb
390
+ - spec/delayed/serialization/test.rb
371
391
  - spec/dummyapp/.gitignore
372
392
  - spec/dummyapp/Rakefile
373
393
  - spec/dummyapp/app/assets/javascripts/application.js
@@ -430,6 +450,7 @@ test_files:
430
450
  - spec/rollbar/delay/girl_friday_spec.rb
431
451
  - spec/rollbar/delay/resque_spec.rb
432
452
  - spec/rollbar/delay/thread_spec.rb
453
+ - spec/rollbar/delayed_job/job_data.rb
433
454
  - spec/rollbar/delayed_job_spec.rb
434
455
  - spec/rollbar/encoding/encoder_spec.rb
435
456
  - spec/rollbar/json_spec.rb
@@ -450,5 +471,6 @@ test_files:
450
471
  - spec/support/encoding_helpers.rb
451
472
  - spec/support/fixture_helpers.rb
452
473
  - spec/support/get_ip_raising.rb
474
+ - spec/support/helpers.rb
453
475
  - spec/support/notifier_helpers.rb
454
476
  - spec/support/shared_contexts.rb