rollbar 2.21.0 → 2.23.2

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
  SHA256:
3
- metadata.gz: b238c5e9208112f61a5b731fff4f6743b310d693568220e75e2c50191f2445b9
4
- data.tar.gz: c374dda5d39adaae28d4503be35ed2e2035c2454af036ff20014d7e021b19e8f
3
+ metadata.gz: 9073beef837ad644c6679c6f95599b7eb6e387d089c9f8d88448cbf39960ea22
4
+ data.tar.gz: 148751730bba10444641bd319314b7af7ee69a51e2c15cc686a909f797eec379
5
5
  SHA512:
6
- metadata.gz: 6db3b292b970bf003274851c9adc017c173ab7774320d8f3b9430ee580dc588035fc718b633c07349a4ac1070b1ff0f42b3786ccb44218241cb9b35e659b703b
7
- data.tar.gz: b2a3b923c55971b410da65d2ff073b7318e1a42f4ac5c7facae240f076ada135902769fcaad557d95bf4514546cf8304adc1a5e5d6e1ffae85e5f87d45196513
6
+ metadata.gz: c8b0529b951944385beba61f53f43c3ea4270fe38c94fb85639a55a833d2e67c92ae61e88325ba3e3c4a0b64492aab3c95bc6faa6f458df1e9ad792c1e38e77d
7
+ data.tar.gz: 6d12a2415ac6ba94b7e5b00b944a4de7afe5a4fa6e43c9d86618c944d0968e0aeb8d601a34363fd97b89bc4ff5316b7dfa2cff6a54aee1a7f198b5690391da23
data/.rubocop.yml CHANGED
@@ -1,3 +1,5 @@
1
+ require: rubocop-performance
2
+
1
3
  AllCops:
2
4
  Exclude:
3
5
  - 'vendor/**/*'
@@ -66,3 +68,133 @@ Style/FrozenStringLiteralComment:
66
68
  # If we do this, it will be in its own PR. It requires adding these magic comments
67
69
  # throughout the project, in order to prepare for a future Ruby 3.x.
68
70
  Enabled: false
71
+
72
+ #
73
+ # Performance cops are opt in, and `Enabled: true` is always required.
74
+ # Full list is here: https://github.com/rubocop-hq/rubocop-performance/tree/master/lib/rubocop/cop/performance
75
+ # For travis builds, Codacy will see and use these directives.
76
+ #
77
+ Performance/Caller:
78
+ Enabled: true
79
+ Exclude:
80
+ - spec/**/*
81
+
82
+ Performance/CaseWhenSplat:
83
+ Enabled: true
84
+ Exclude:
85
+ - spec/**/*
86
+
87
+ Performance/Casecmp:
88
+ Enabled: true
89
+ Exclude:
90
+ - spec/**/*
91
+
92
+ Performance/ChainArrayAllocation:
93
+ Enabled: true
94
+ Exclude:
95
+ - spec/**/*
96
+
97
+ Performance/CompareWithBlock:
98
+ Enabled: true
99
+ Exclude:
100
+ - spec/**/*
101
+
102
+ Performance/Count:
103
+ Enabled: true
104
+ Exclude:
105
+ - spec/**/*
106
+
107
+ Performance/Detect:
108
+ Enabled: true
109
+ Exclude:
110
+ - spec/**/*
111
+
112
+ Performance/DoubleStartEndWith:
113
+ Enabled: true
114
+ Exclude:
115
+ - spec/**/*
116
+
117
+ Performance/EndWith:
118
+ Enabled: true
119
+ Exclude:
120
+ - spec/**/*
121
+
122
+ Performance/FixedSize:
123
+ Enabled: true
124
+ Exclude:
125
+ - spec/**/*
126
+
127
+ Performance/FlatMap:
128
+ Enabled: true
129
+ Exclude:
130
+ - spec/**/*
131
+
132
+ Performance/InefficientHashSearch:
133
+ Enabled: true
134
+ Exclude:
135
+ - spec/**/*
136
+
137
+ Performance/OpenStruct:
138
+ Enabled: true
139
+ Exclude:
140
+ - spec/**/*
141
+
142
+ Performance/RangeInclude:
143
+ Enabled: true
144
+ Exclude:
145
+ - spec/**/*
146
+
147
+ Performance/RedundantBlockCall:
148
+ Enabled: true
149
+ Exclude:
150
+ - spec/**/*
151
+
152
+ Performance/RedundantMatch:
153
+ Enabled: true
154
+ Exclude:
155
+ - spec/**/*
156
+
157
+ Performance/RedundantMerge:
158
+ Enabled: true
159
+ Exclude:
160
+ - spec/**/*
161
+
162
+ Performance/RegexpMatch:
163
+ Enabled: true
164
+ Exclude:
165
+ - spec/**/*
166
+
167
+ Performance/ReverseEach:
168
+ Enabled: true
169
+ Exclude:
170
+ - spec/**/*
171
+
172
+ Performance/Size:
173
+ Enabled: true
174
+ Exclude:
175
+ - spec/**/*
176
+
177
+ Performance/StartWith:
178
+ Enabled: true
179
+ Exclude:
180
+ - spec/**/*
181
+
182
+ Performance/StringReplacement:
183
+ Enabled: true
184
+ Exclude:
185
+ - spec/**/*
186
+
187
+ Performance/TimesMap:
188
+ Enabled: true
189
+ Exclude:
190
+ - spec/**/*
191
+
192
+ Performance/UnfreezeString:
193
+ Enabled: true
194
+ Exclude:
195
+ - spec/**/*
196
+
197
+ Performance/UriDefaultParser:
198
+ Enabled: true
199
+ Exclude:
200
+ - spec/**/*
data/.travis.yml CHANGED
@@ -3,12 +3,6 @@ dist: trusty
3
3
  services:
4
4
  - redis-server
5
5
  language: ruby
6
- # Broken bundler on travis CI - https://github.com/bundler/bundler/issues/2784
7
- before_install:
8
- - gem update --system 2.7.7
9
- - gem --version
10
- - gem install bundler -v 1.6.1
11
- - bundle --version
12
6
 
13
7
  rvm:
14
8
  - 1.9.3
@@ -18,8 +12,8 @@ rvm:
18
12
  - 2.3.8
19
13
  - 2.4.5
20
14
  - 2.5.3
21
- - 2.6.0
22
- - 2.6.3
15
+ - 2.6.5
16
+ - 2.7.0
23
17
  - rbx
24
18
  # Travis's own rvm installer is failing on JRuby builds, TODO: reenable when fixed.
25
19
  # - jruby-9.1.9.0
@@ -73,9 +67,6 @@ matrix:
73
67
  allow_failures:
74
68
  - rvm: ruby-head
75
69
  - rvm: jruby-head
76
- # Ruby 2.6.x is still being eveluated and may have test failures
77
- - rvm: 2.6.0
78
- - rvm: 2.6.3
79
70
  # oraclejdk9 has a dependency issue that needs to be investigated
80
71
  - jdk: oraclejdk9
81
72
 
@@ -124,17 +115,17 @@ matrix:
124
115
  jdk: oraclejdk8
125
116
  - rvm: 2.5.3
126
117
  jdk: oraclejdk9
127
- - rvm: 2.6.0
118
+ - rvm: 2.6.5
128
119
  jdk: openjdk8
129
- - rvm: 2.6.0
120
+ - rvm: 2.6.5
130
121
  jdk: oraclejdk8
131
- - rvm: 2.6.0
122
+ - rvm: 2.6.5
132
123
  jdk: oraclejdk9
133
- - rvm: 2.6.3
124
+ - rvm: 2.7.0
134
125
  jdk: openjdk8
135
- - rvm: 2.6.3
126
+ - rvm: 2.7.0
136
127
  jdk: oraclejdk8
137
- - rvm: 2.6.3
128
+ - rvm: 2.7.0
138
129
  jdk: oraclejdk9
139
130
 
140
131
  - rvm: ruby-head
@@ -184,11 +175,14 @@ matrix:
184
175
  gemfile: gemfiles/rails52.gemfile
185
176
  - rvm: 2.1.0
186
177
  gemfile: gemfiles/rails60.gemfile
187
- # MRI 2.2.2 supports Rails 3.2.x and higher
178
+ # MRI 2.2.2 supports Rails 3.2.x and higher, except Rails 5.2.4 and higher*
179
+ # * ActionDispatch 5.2.4 uses Ruby 3.x safe navigation operator.
188
180
  - rvm: 2.2.2
189
181
  gemfile: gemfiles/rails30.gemfile
190
182
  - rvm: 2.2.2
191
183
  gemfile: gemfiles/rails31.gemfile
184
+ - rvm: 2.2.2
185
+ gemfile: gemfiles/rails52.gemfile
192
186
  # MRI 2.3.x supports Rails 4.0.x and higher
193
187
  - rvm: 2.3.8
194
188
  gemfile: gemfiles/rails30.gemfile
@@ -222,30 +216,39 @@ matrix:
222
216
  gemfile: gemfiles/rails40.gemfile
223
217
  - rvm: 2.5.3
224
218
  gemfile: gemfiles/rails41.gemfile
225
- - rvm: 2.6.0
219
+ - rvm: 2.6.5
226
220
  gemfile: gemfiles/rails30.gemfile
227
- - rvm: 2.6.0
221
+ - rvm: 2.6.5
228
222
  gemfile: gemfiles/rails31.gemfile
229
- - rvm: 2.6.0
223
+ - rvm: 2.6.5
230
224
  gemfile: gemfiles/rails32.gemfile
231
- - rvm: 2.6.0
225
+ - rvm: 2.6.5
232
226
  gemfile: gemfiles/rails40.gemfile
233
- - rvm: 2.6.0
227
+ - rvm: 2.6.5
234
228
  gemfile: gemfiles/rails41.gemfile
235
- - rvm: 2.6.0
229
+ - rvm: 2.6.5
236
230
  gemfile: gemfiles/rails42.gemfile
237
- - rvm: 2.6.3
231
+ # Rails 6.x tries to be compatible with Ruby 2.7, though
232
+ # it still throws a lot of warnings. No point testing earlier
233
+ # Rails with Ruby 2.7.
234
+ - rvm: 2.7.0
238
235
  gemfile: gemfiles/rails30.gemfile
239
- - rvm: 2.6.3
236
+ - rvm: 2.7.0
240
237
  gemfile: gemfiles/rails31.gemfile
241
- - rvm: 2.6.3
238
+ - rvm: 2.7.0
242
239
  gemfile: gemfiles/rails32.gemfile
243
- - rvm: 2.6.3
240
+ - rvm: 2.7.0
244
241
  gemfile: gemfiles/rails40.gemfile
245
- - rvm: 2.6.3
242
+ - rvm: 2.7.0
246
243
  gemfile: gemfiles/rails41.gemfile
247
- - rvm: 2.6.3
244
+ - rvm: 2.7.0
248
245
  gemfile: gemfiles/rails42.gemfile
246
+ - rvm: 2.7.0
247
+ gemfile: gemfiles/rails50.gemfile
248
+ - rvm: 2.7.0
249
+ gemfile: gemfiles/rails51.gemfile
250
+ - rvm: 2.7.0
251
+ gemfile: gemfiles/rails52.gemfile
249
252
  # JRuby JDBC Adapter is only compatible with Rails >= 5.x
250
253
  - rvm: jruby-9.1.9.0
251
254
  gemfile: gemfiles/rails30.gemfile
data/Gemfile CHANGED
@@ -46,6 +46,7 @@ end
46
46
 
47
47
  if RUBY_VERSION.start_with?('1.9')
48
48
  gem 'capistrano', '<= 3.4.1', :require => false
49
+ gem 'json', '1.8.6'
49
50
  gem 'shoryuken', '>= 4.0.0', '<= 4.0.2'
50
51
  gem 'sucker_punch', '~> 1.0'
51
52
  elsif RUBY_VERSION.start_with?('2')
@@ -73,6 +74,7 @@ gem 'girl_friday', '>= 0.11.1'
73
74
  gem 'redis'
74
75
  gem 'resque', '< 2.0.0'
75
76
  gem 'rubocop', :require => false
77
+ gem 'rubocop-performance', :require => false
76
78
  gem 'sinatra'
77
79
  gem 'webmock', :require => false
78
80
  gemspec
@@ -1 +1 @@
1
- !function(r){var e={};function o(n){if(e[n])return e[n].exports;var t=e[n]={i:n,l:!1,exports:{}};return r[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=e,o.d=function(r,e,n){o.o(r,e)||Object.defineProperty(r,e,{enumerable:!0,get:n})},o.r=function(r){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0})},o.t=function(r,e){if(1&e&&(r=o(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var t in r)o.d(n,t,function(e){return r[e]}.bind(null,t));return n},o.n=function(r){var e=r&&r.__esModule?function(){return r.default}:function(){return r};return o.d(e,"a",e),e},o.o=function(r,e){return Object.prototype.hasOwnProperty.call(r,e)},o.p="",o(o.s=0)}([function(r,e,o){var n=o(1),t=o(4);_rollbarConfig=_rollbarConfig||{},_rollbarConfig.rollbarJsUrl=_rollbarConfig.rollbarJsUrl||"https://cdnjs.cloudflare.com/ajax/libs/rollbar.js/2.8.1/rollbar.min.js",_rollbarConfig.async=void 0===_rollbarConfig.async||_rollbarConfig.async;var a=n.setupShim(window,_rollbarConfig),l=t(_rollbarConfig);window.rollbar=n.Rollbar,a.loadFull(window,document,!_rollbarConfig.async,_rollbarConfig,l)},function(r,e,o){var n=o(2);function t(r){return function(){try{return r.apply(this,arguments)}catch(r){try{console.error("[Rollbar]: Internal error",r)}catch(r){}}}}var a=0;function l(r,e){this.options=r,this._rollbarOldOnError=null;var o=a++;this.shimId=function(){return o},"undefined"!=typeof window&&window._rollbarShims&&(window._rollbarShims[o]={handler:e,messages:[]})}var i=o(3),d=function(r,e){return new l(r,e)},s=function(r){return new i(d,r)};function c(r){return t(function(){var e=Array.prototype.slice.call(arguments,0),o={shim:this,method:r,args:e,ts:new Date};window._rollbarShims[this.shimId()].messages.push(o)})}l.prototype.loadFull=function(r,e,o,n,a){var l=!1,i=e.createElement("script"),d=e.getElementsByTagName("script")[0],s=d.parentNode;i.crossOrigin="",i.src=n.rollbarJsUrl,o||(i.async=!0),i.onload=i.onreadystatechange=t(function(){if(!(l||this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState)){i.onload=i.onreadystatechange=null;try{s.removeChild(i)}catch(r){}l=!0,function(){var e;if(void 0===r._rollbarDidLoad){e=new Error("rollbar.js did not load");for(var o,n,t,l,i=0;o=r._rollbarShims[i++];)for(o=o.messages||[];n=o.shift();)for(t=n.args||[],i=0;i<t.length;++i)if("function"==typeof(l=t[i])){l(e);break}}"function"==typeof a&&a(e)}()}}),s.insertBefore(i,d)},l.prototype.wrap=function(r,e,o){try{var n;if(n="function"==typeof e?e:function(){return e||{}},"function"!=typeof r)return r;if(r._isWrap)return r;if(!r._rollbar_wrapped&&(r._rollbar_wrapped=function(){o&&"function"==typeof o&&o.apply(this,arguments);try{return r.apply(this,arguments)}catch(o){var e=o;throw e&&("string"==typeof e&&(e=new String(e)),e._rollbarContext=n()||{},e._rollbarContext._wrappedSource=r.toString(),window._rollbarWrappedError=e),e}},r._rollbar_wrapped._isWrap=!0,r.hasOwnProperty))for(var t in r)r.hasOwnProperty(t)&&(r._rollbar_wrapped[t]=r[t]);return r._rollbar_wrapped}catch(e){return r}};for(var p="log,debug,info,warn,warning,error,critical,global,configure,handleUncaughtException,handleAnonymousErrors,handleUnhandledRejection,captureEvent,captureDomContentLoaded,captureLoad".split(","),u=0;u<p.length;++u)l.prototype[p[u]]=c(p[u]);r.exports={setupShim:function(r,e){if(r){var o=e.globalAlias||"Rollbar";if("object"==typeof r[o])return r[o];r._rollbarShims={},r._rollbarWrappedError=null;var a=new s(e);return t(function(){e.captureUncaught&&(a._rollbarOldOnError=r.onerror,n.captureUncaughtExceptions(r,a,!0),n.wrapGlobals(r,a,!0)),e.captureUnhandledRejections&&n.captureUnhandledRejections(r,a,!0);var t=e.autoInstrument;return!1!==e.enabled&&(void 0===t||!0===t||"object"==typeof t&&t.network)&&r.addEventListener&&(r.addEventListener("load",a.captureLoad.bind(a)),r.addEventListener("DOMContentLoaded",a.captureDomContentLoaded.bind(a))),r[o]=a,a})()}},Rollbar:s}},function(r,e){function o(r,e,o){if(e.hasOwnProperty&&e.hasOwnProperty("addEventListener")){for(var n=e.addEventListener;n._rollbarOldAdd&&n.belongsToShim;)n=n._rollbarOldAdd;var t=function(e,o,t){n.call(this,e,r.wrap(o),t)};t._rollbarOldAdd=n,t.belongsToShim=o,e.addEventListener=t;for(var a=e.removeEventListener;a._rollbarOldRemove&&a.belongsToShim;)a=a._rollbarOldRemove;var l=function(r,e,o){a.call(this,r,e&&e._rollbar_wrapped||e,o)};l._rollbarOldRemove=a,l.belongsToShim=o,e.removeEventListener=l}}r.exports={captureUncaughtExceptions:function(r,e,o){if(r){var n;if("function"==typeof e._rollbarOldOnError)n=e._rollbarOldOnError;else if(r.onerror){for(n=r.onerror;n._rollbarOldOnError;)n=n._rollbarOldOnError;e._rollbarOldOnError=n}e.handleAnonymousErrors();var t=function(){var o=Array.prototype.slice.call(arguments,0);!function(r,e,o,n){r._rollbarWrappedError&&(n[4]||(n[4]=r._rollbarWrappedError),n[5]||(n[5]=r._rollbarWrappedError._rollbarContext),r._rollbarWrappedError=null),e.handleUncaughtException.apply(e,n),o&&o.apply(r,n)}(r,e,n,o)};o&&(t._rollbarOldOnError=n),r.onerror=t}},captureUnhandledRejections:function(r,e,o){if(r){"function"==typeof r._rollbarURH&&r._rollbarURH.belongsToShim&&r.removeEventListener("unhandledrejection",r._rollbarURH);var n=function(r){var o,n,t;try{o=r.reason}catch(r){o=void 0}try{n=r.promise}catch(r){n="[unhandledrejection] error getting `promise` from event"}try{t=r.detail,!o&&t&&(o=t.reason,n=t.promise)}catch(r){}o||(o="[unhandledrejection] error getting `reason` from event"),e&&e.handleUnhandledRejection&&e.handleUnhandledRejection(o,n)};n.belongsToShim=o,r._rollbarURH=n,r.addEventListener("unhandledrejection",n)}},wrapGlobals:function(r,e,n){if(r){var t,a,l="EventTarget,Window,Node,ApplicationCache,AudioTrackList,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload".split(",");for(t=0;t<l.length;++t)r[a=l[t]]&&r[a].prototype&&o(e,r[a].prototype,n)}}}},function(r,e){function o(r,e){this.impl=r(e,this),this.options=e,function(r){for(var e=function(r){return function(){var e=Array.prototype.slice.call(arguments,0);if(this.impl[r])return this.impl[r].apply(this.impl,e)}},o="log,debug,info,warn,warning,error,critical,global,configure,handleUncaughtException,handleAnonymousErrors,handleUnhandledRejection,_createItem,wrap,loadFull,shimId,captureEvent,captureDomContentLoaded,captureLoad".split(","),n=0;n<o.length;n++)r[o[n]]=e(o[n])}(o.prototype)}o.prototype._swapAndProcessMessages=function(r,e){var o,n,t;for(this.impl=r(this.options);o=e.shift();)n=o.method,t=o.args,this[n]&&"function"==typeof this[n]&&("captureDomContentLoaded"===n||"captureLoad"===n?this[n].apply(this,[t[0],o.ts]):this[n].apply(this,t));return this},r.exports=o},function(r,e){r.exports=function(r){return function(e){if(!e&&!window._rollbarInitialized){for(var o,n,t=(r=r||{}).globalAlias||"Rollbar",a=window.rollbar,l=function(r){return new a(r)},i=0;o=window._rollbarShims[i++];)n||(n=o.handler),o.handler._swapAndProcessMessages(l,o.messages);window[t]=n,window._rollbarInitialized=!0}}}}]);
1
+ !function(r){var e={};function o(n){if(e[n])return e[n].exports;var t=e[n]={i:n,l:!1,exports:{}};return r[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=e,o.d=function(r,e,n){o.o(r,e)||Object.defineProperty(r,e,{enumerable:!0,get:n})},o.r=function(r){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0})},o.t=function(r,e){if(1&e&&(r=o(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var t in r)o.d(n,t,function(e){return r[e]}.bind(null,t));return n},o.n=function(r){var e=r&&r.__esModule?function(){return r.default}:function(){return r};return o.d(e,"a",e),e},o.o=function(r,e){return Object.prototype.hasOwnProperty.call(r,e)},o.p="",o(o.s=0)}([function(r,e,o){var n=o(1),t=o(4);_rollbarConfig=_rollbarConfig||{},_rollbarConfig.rollbarJsUrl=_rollbarConfig.rollbarJsUrl||"https://cdnjs.cloudflare.com/ajax/libs/rollbar.js/2.12.3/rollbar.min.js",_rollbarConfig.async=void 0===_rollbarConfig.async||_rollbarConfig.async;var a=n.setupShim(window,_rollbarConfig),l=t(_rollbarConfig);window.rollbar=n.Rollbar,a.loadFull(window,document,!_rollbarConfig.async,_rollbarConfig,l)},function(r,e,o){var n=o(2);function t(r){return function(){try{return r.apply(this,arguments)}catch(r){try{console.error("[Rollbar]: Internal error",r)}catch(r){}}}}var a=0;function l(r,e){this.options=r,this._rollbarOldOnError=null;var o=a++;this.shimId=function(){return o},"undefined"!=typeof window&&window._rollbarShims&&(window._rollbarShims[o]={handler:e,messages:[]})}var i=o(3),s=function(r,e){return new l(r,e)},d=function(r){return new i(s,r)};function c(r){return t(function(){var e=Array.prototype.slice.call(arguments,0),o={shim:this,method:r,args:e,ts:new Date};window._rollbarShims[this.shimId()].messages.push(o)})}l.prototype.loadFull=function(r,e,o,n,a){var l=!1,i=e.createElement("script"),s=e.getElementsByTagName("script")[0],d=s.parentNode;i.crossOrigin="",i.src=n.rollbarJsUrl,o||(i.async=!0),i.onload=i.onreadystatechange=t(function(){if(!(l||this.readyState&&"loaded"!==this.readyState&&"complete"!==this.readyState)){i.onload=i.onreadystatechange=null;try{d.removeChild(i)}catch(r){}l=!0,function(){var e;if(void 0===r._rollbarDidLoad){e=new Error("rollbar.js did not load");for(var o,n,t,l,i=0;o=r._rollbarShims[i++];)for(o=o.messages||[];n=o.shift();)for(t=n.args||[],i=0;i<t.length;++i)if("function"==typeof(l=t[i])){l(e);break}}"function"==typeof a&&a(e)}()}}),d.insertBefore(i,s)},l.prototype.wrap=function(r,e,o){try{var n;if(n="function"==typeof e?e:function(){return e||{}},"function"!=typeof r)return r;if(r._isWrap)return r;if(!r._rollbar_wrapped&&(r._rollbar_wrapped=function(){o&&"function"==typeof o&&o.apply(this,arguments);try{return r.apply(this,arguments)}catch(o){var e=o;throw e&&("string"==typeof e&&(e=new String(e)),e._rollbarContext=n()||{},e._rollbarContext._wrappedSource=r.toString(),window._rollbarWrappedError=e),e}},r._rollbar_wrapped._isWrap=!0,r.hasOwnProperty))for(var t in r)r.hasOwnProperty(t)&&(r._rollbar_wrapped[t]=r[t]);return r._rollbar_wrapped}catch(e){return r}};for(var p="log,debug,info,warn,warning,error,critical,global,configure,handleUncaughtException,handleAnonymousErrors,handleUnhandledRejection,captureEvent,captureDomContentLoaded,captureLoad".split(","),u=0;u<p.length;++u)l.prototype[p[u]]=c(p[u]);r.exports={setupShim:function(r,e){if(r){var o=e.globalAlias||"Rollbar";if("object"==typeof r[o])return r[o];r._rollbarShims={},r._rollbarWrappedError=null;var a=new d(e);return t(function(){e.captureUncaught&&(a._rollbarOldOnError=r.onerror,n.captureUncaughtExceptions(r,a,!0),e.wrapGlobalEventHandlers&&n.wrapGlobals(r,a,!0)),e.captureUnhandledRejections&&n.captureUnhandledRejections(r,a,!0);var t=e.autoInstrument;return!1!==e.enabled&&(void 0===t||!0===t||"object"==typeof t&&t.network)&&r.addEventListener&&(r.addEventListener("load",a.captureLoad.bind(a)),r.addEventListener("DOMContentLoaded",a.captureDomContentLoaded.bind(a))),r[o]=a,a})()}},Rollbar:d}},function(r,e){function o(r,e,o){if(e.hasOwnProperty&&e.hasOwnProperty("addEventListener")){for(var n=e.addEventListener;n._rollbarOldAdd&&n.belongsToShim;)n=n._rollbarOldAdd;var t=function(e,o,t){n.call(this,e,r.wrap(o),t)};t._rollbarOldAdd=n,t.belongsToShim=o,e.addEventListener=t;for(var a=e.removeEventListener;a._rollbarOldRemove&&a.belongsToShim;)a=a._rollbarOldRemove;var l=function(r,e,o){a.call(this,r,e&&e._rollbar_wrapped||e,o)};l._rollbarOldRemove=a,l.belongsToShim=o,e.removeEventListener=l}}r.exports={captureUncaughtExceptions:function(r,e,o){if(r){var n;if("function"==typeof e._rollbarOldOnError)n=e._rollbarOldOnError;else if(r.onerror){for(n=r.onerror;n._rollbarOldOnError;)n=n._rollbarOldOnError;e._rollbarOldOnError=n}e.handleAnonymousErrors();var t=function(){var o=Array.prototype.slice.call(arguments,0);!function(r,e,o,n){r._rollbarWrappedError&&(n[4]||(n[4]=r._rollbarWrappedError),n[5]||(n[5]=r._rollbarWrappedError._rollbarContext),r._rollbarWrappedError=null);var t=e.handleUncaughtException.apply(e,n);o&&o.apply(r,n),"anonymous"===t&&(e.anonymousErrorsPending+=1)}(r,e,n,o)};o&&(t._rollbarOldOnError=n),r.onerror=t}},captureUnhandledRejections:function(r,e,o){if(r){"function"==typeof r._rollbarURH&&r._rollbarURH.belongsToShim&&r.removeEventListener("unhandledrejection",r._rollbarURH);var n=function(r){var o,n,t;try{o=r.reason}catch(r){o=void 0}try{n=r.promise}catch(r){n="[unhandledrejection] error getting `promise` from event"}try{t=r.detail,!o&&t&&(o=t.reason,n=t.promise)}catch(r){}o||(o="[unhandledrejection] error getting `reason` from event"),e&&e.handleUnhandledRejection&&e.handleUnhandledRejection(o,n)};n.belongsToShim=o,r._rollbarURH=n,r.addEventListener("unhandledrejection",n)}},wrapGlobals:function(r,e,n){if(r){var t,a,l="EventTarget,Window,Node,ApplicationCache,AudioTrackList,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload".split(",");for(t=0;t<l.length;++t)r[a=l[t]]&&r[a].prototype&&o(e,r[a].prototype,n)}}}},function(r,e){function o(r,e){this.impl=r(e,this),this.options=e,function(r){for(var e=function(r){return function(){var e=Array.prototype.slice.call(arguments,0);if(this.impl[r])return this.impl[r].apply(this.impl,e)}},o="log,debug,info,warn,warning,error,critical,global,configure,handleUncaughtException,handleAnonymousErrors,handleUnhandledRejection,_createItem,wrap,loadFull,shimId,captureEvent,captureDomContentLoaded,captureLoad".split(","),n=0;n<o.length;n++)r[o[n]]=e(o[n])}(o.prototype)}o.prototype._swapAndProcessMessages=function(r,e){var o,n,t;for(this.impl=r(this.options);o=e.shift();)n=o.method,t=o.args,this[n]&&"function"==typeof this[n]&&("captureDomContentLoaded"===n||"captureLoad"===n?this[n].apply(this,[t[0],o.ts]):this[n].apply(this,t));return this},r.exports=o},function(r,e){r.exports=function(r){return function(e){if(!e&&!window._rollbarInitialized){for(var o,n,t=(r=r||{}).globalAlias||"Rollbar",a=window.rollbar,l=function(r){return new a(r)},i=0;o=window._rollbarShims[i++];)n||(n=o.handler),o.handler._swapAndProcessMessages(l,o.messages);window[t]=n,window._rollbarInitialized=!0}}}}]);
@@ -27,6 +27,10 @@ platforms :rbx do
27
27
  gem 'rubysl', '~> 2.0' unless RUBY_VERSION.start_with?('1')
28
28
  end
29
29
 
30
+ if RUBY_VERSION < '2.0.0'
31
+ gem 'json', '1.8.6'
32
+ end
33
+
30
34
  if RUBY_VERSION < '2.2.2'
31
35
  gem 'sidekiq', '~> 2.13.0'
32
36
  else
@@ -15,7 +15,7 @@ is_jruby = defined?(JRUBY_VERSION) || (defined?(RUBY_ENGINE) && 'jruby' == RUBY_
15
15
  gem 'appraisal'
16
16
  gem 'activerecord-jdbcsqlite3-adapter', :platform => :jruby
17
17
  gem 'jruby-openssl', :platform => :jruby
18
- gem 'rails', '6.0.0.rc1'
18
+ gem 'rails', '6.0.2.1'
19
19
  gem 'sqlite3', '~> 1.4', :platform => [:ruby, :mswin, :mingw]
20
20
 
21
21
  gem 'rspec-core', '~> 3.8.0'
@@ -17,6 +17,7 @@ module Rollbar
17
17
  attr_accessor :disable_monkey_patch
18
18
  attr_accessor :disable_rack_monkey_patch
19
19
  attr_accessor :disable_core_monkey_patch
20
+ attr_accessor :enable_error_context
20
21
  attr_accessor :dj_threshold
21
22
  attr_accessor :enabled
22
23
  attr_accessor :endpoint
@@ -57,6 +58,7 @@ module Rollbar
57
58
  attr_reader :transform
58
59
  attr_accessor :verify_ssl_peer
59
60
  attr_accessor :use_async
61
+ attr_accessor :async_json_payload
60
62
  attr_reader :use_eventmachine
61
63
  attr_accessor :web_base
62
64
  attr_accessor :write_to_file
@@ -66,8 +68,10 @@ module Rollbar
66
68
  attr_accessor :raise_on_error
67
69
  attr_accessor :transmit
68
70
  attr_accessor :log_payload
71
+ attr_accessor :backtrace_cleaner
69
72
 
70
73
  attr_reader :project_gem_paths
74
+ attr_accessor :configured_options
71
75
 
72
76
  alias safely? safely
73
77
 
@@ -86,6 +90,7 @@ module Rollbar
86
90
  @disable_monkey_patch = false
87
91
  @disable_core_monkey_patch = false
88
92
  @disable_rack_monkey_patch = false
93
+ @enable_error_context = true
89
94
  @dj_threshold = 0
90
95
  @enabled = nil # set to true when configure is called
91
96
  @endpoint = DEFAULT_ENDPOINT
@@ -114,10 +119,10 @@ module Rollbar
114
119
  @locals = {}
115
120
  @scrub_fields = [:passwd, :password, :password_confirmation, :secret,
116
121
  :confirm_password, :password_confirmation, :secret_token,
117
- :api_key, :access_token, :session_id]
122
+ :api_key, :access_token, :accessToken, :session_id]
118
123
  @scrub_user = true
119
124
  @scrub_password = true
120
- @randomize_scrub_length = true
125
+ @randomize_scrub_length = false
121
126
  @scrub_whitelist = []
122
127
  @uncaught_exception_level = 'error'
123
128
  @scrub_headers = ['Authorization']
@@ -125,6 +130,7 @@ module Rollbar
125
130
  @safely = false
126
131
  @transform = []
127
132
  @use_async = false
133
+ @async_json_payload = false
128
134
  @use_eventmachine = false
129
135
  @verify_ssl_peer = true
130
136
  @web_base = DEFAULT_WEB_BASE
@@ -138,10 +144,13 @@ module Rollbar
138
144
  @log_payload = false
139
145
  @collect_user_ip = true
140
146
  @anonymize_user_ip = false
147
+ @backtrace_cleaner = nil
141
148
  @hooks = {
142
149
  :on_error_response => nil, # params: response
143
150
  :on_report_internal_error => nil # params: exception
144
151
  }
152
+
153
+ @configured_options = ConfiguredOptions.new(self)
145
154
  end
146
155
 
147
156
  def initialize_copy(orig)
@@ -153,6 +162,15 @@ module Rollbar
153
162
  end
154
163
  end
155
164
 
165
+ def wrapped_clone
166
+ original_clone.tap do |new_config|
167
+ new_config.configured_options = ConfiguredOptions.new(new_config)
168
+ new_config.configured_options.configured = configured_options.configured
169
+ end
170
+ end
171
+ alias original_clone clone
172
+ alias clone wrapped_clone
173
+
156
174
  def merge(options)
157
175
  new_configuration = clone
158
176
  new_configuration.merge!(options)
@@ -220,9 +238,10 @@ module Rollbar
220
238
  value.is_a?(Hash) ? use_sidekiq(value) : use_sidekiq
221
239
  end
222
240
 
223
- def use_thread
241
+ def use_thread(options = {})
224
242
  require 'rollbar/delay/thread'
225
243
  @use_async = true
244
+ Rollbar::Delay::Thread.options = options
226
245
  @async_handler = Rollbar::Delay::Thread
227
246
  end
228
247
 
@@ -249,7 +268,10 @@ module Rollbar
249
268
  found = Gem::Specification.each.select { |spec| name === spec.name }
250
269
  puts "[Rollbar] No gems found matching #{name.inspect}" if found.empty?
251
270
  found
252
- end.flatten.uniq.map(&:gem_dir)
271
+ end
272
+ @project_gem_paths.flatten!
273
+ @project_gem_paths.uniq!
274
+ @project_gem_paths.map!(&:gem_dir)
253
275
  end
254
276
 
255
277
  def before_process=(*handler)
@@ -303,4 +325,26 @@ module Rollbar
303
325
  hook(symbol).call(*args) if hook(symbol).is_a?(Proc)
304
326
  end
305
327
  end
328
+
329
+ class ConfiguredOptions
330
+ attr_accessor :configuration, :configured
331
+
332
+ def initialize(configuration)
333
+ @configuration = configuration
334
+ @configured = {}
335
+ end
336
+
337
+ def method_missing(method, *args, &block)
338
+ return super unless configuration.respond_to?(method)
339
+
340
+ method_string = method.to_s
341
+ configured[method_string.chomp('=').to_sym] = args.first if method_string.end_with?('=')
342
+
343
+ configuration.send(method, *args, &block)
344
+ end
345
+
346
+ def respond_to_missing?(method)
347
+ configuration.respond_to?(method) || super
348
+ end
349
+ end
306
350
  end
@@ -12,13 +12,9 @@ module Rollbar
12
12
 
13
13
  def queue
14
14
  @queue ||= queue_class.new(nil, :size => 5) do |payload|
15
- begin
16
- Rollbar.process_from_async_handler(payload)
17
- rescue StandardError
18
- # According to https://github.com/mperham/girl_friday/wiki#error-handling
19
- # we reraise the exception so it can be handled some way
20
- raise
21
- end
15
+ Rollbar.process_from_async_handler(payload)
16
+
17
+ # Do not rescue. GirlFriday will call the error handler.
22
18
  end
23
19
  end
24
20
  end
@@ -24,9 +24,8 @@ module Rollbar
24
24
 
25
25
  def perform(payload)
26
26
  Rollbar.process_from_async_handler(payload)
27
- rescue StandardError
28
- # Raise the exception so Resque can track the errored job
29
- raise
27
+
28
+ # Do not rescue. Resque will call the error handler.
30
29
  end
31
30
  end
32
31
  end
@@ -17,10 +17,8 @@ module Rollbar
17
17
 
18
18
  def perform(*args)
19
19
  Rollbar.process_from_async_handler(*args)
20
- rescue StandardError
21
- # Raise the exception so Sidekiq can track the errored job
22
- # and retry it
23
- raise
20
+
21
+ # Do not rescue. Sidekiq will call the error handler.
24
22
  end
25
23
  end
26
24
  end
@@ -33,7 +33,7 @@ module Rollbar
33
33
 
34
34
  def perform(*args)
35
35
  Rollbar.process_from_async_handler(*args)
36
- rescue StandardError
36
+
37
37
  # SuckerPunch can configure an exception handler with:
38
38
  #
39
39
  # SuckerPunch.exception_handler { # do something here }
@@ -41,9 +41,8 @@ module Rollbar
41
41
  # This is just passed to Celluloid.exception_handler which will
42
42
  # push the reiceved block to an array of handlers, by default empty, [].
43
43
  #
44
- # We reraise the exception here casue it's safe and users could have defined
45
- # their own exception handler for SuckerPunch
46
- raise
44
+
45
+ # Do not rescue. SuckerPunch will call the error handler.
47
46
  end
48
47
  end
49
48
  end
@@ -9,7 +9,10 @@ module Rollbar
9
9
  Error = Class.new(StandardError)
10
10
  TimeoutError = Class.new(Error)
11
11
 
12
+ DEFAULT_PRIORITY = 1
13
+
12
14
  class << self
15
+ attr_writer :options
13
16
  attr_reader :reaper
14
17
 
15
18
  def call(payload)
@@ -20,6 +23,10 @@ module Rollbar
20
23
  thread
21
24
  end
22
25
 
26
+ def options
27
+ @options || {}
28
+ end
29
+
23
30
  private
24
31
 
25
32
  def threads
@@ -61,9 +68,16 @@ module Rollbar
61
68
  end
62
69
  end # class << self
63
70
 
71
+ def priority
72
+ self.class.options[:priority] || DEFAULT_PRIORITY
73
+ end
74
+
64
75
  def call(payload)
76
+ priority = self.priority
77
+
65
78
  ::Thread.new do
66
79
  begin
80
+ ::Thread.current.priority = priority
67
81
  Rollbar.process_from_async_handler(payload)
68
82
  rescue StandardError
69
83
  # Here we swallow the exception:
@@ -3,7 +3,6 @@ module Rollbar
3
3
  class Encoder
4
4
  ALL_ENCODINGS = [::Encoding::UTF_8, ::Encoding::ISO_8859_1, ::Encoding::ASCII_8BIT, ::Encoding::US_ASCII].freeze
5
5
  ASCII_ENCODINGS = [::Encoding::US_ASCII, ::Encoding::ASCII_8BIT, ::Encoding::ISO_8859_1].freeze
6
- ENCODING_OPTIONS = { :invalid => :replace, :undef => :replace, :replace => '' }.freeze
7
6
  UTF8 = 'UTF-8'.freeze
8
7
  BINARY = 'binary'.freeze
9
8
 
@@ -21,7 +20,13 @@ module Rollbar
21
20
  encoded_value = if encoding == ::Encoding::UTF_8 && value.valid_encoding?
22
21
  value
23
22
  else
24
- force_encoding(value).encode(*encoding_args(value))
23
+ force_encoding(value).encode(
24
+ *encoding_args(value),
25
+ # Ruby 2.7 requires this to look like keyword args,
26
+ # and Ruby 1.9.3 doesn't understand keyword args, so
27
+ # don't use hash rockets here and both will be happy.
28
+ invalid: :replace, undef: :replace, replace: '' # rubocop:disable Style/HashSyntax
29
+ )
25
30
  end
26
31
 
27
32
  object.is_a?(Symbol) ? encoded_value.to_sym : encoded_value
@@ -54,7 +59,6 @@ module Rollbar
54
59
  def encoding_args(value)
55
60
  args = [UTF8]
56
61
  args << BINARY if ASCII_ENCODINGS.include?(value.encoding)
57
- args << ENCODING_OPTIONS
58
62
 
59
63
  args
60
64
  end
data/lib/rollbar/item.rb CHANGED
@@ -84,7 +84,8 @@ module Rollbar
84
84
  :server => server_data,
85
85
  :notifier => {
86
86
  :name => 'rollbar-gem',
87
- :version => VERSION
87
+ :version => VERSION,
88
+ :configured_options => configured_options
88
89
  },
89
90
  :body => build_body
90
91
  }
@@ -102,6 +103,22 @@ module Rollbar
102
103
  data
103
104
  end
104
105
 
106
+ def configured_options
107
+ if Gem.loaded_specs['activesupport'] && Gem.loaded_specs['activesupport'].version < Gem::Version.new('4.1')
108
+ # There are too many types that crash ActiveSupport JSON serialization, and not worth
109
+ # the risk just to send this diagnostic object. In versions < 4.1, ActiveSupport hooks
110
+ # Ruby's JSON.generate so deeply there's no workaround.
111
+ 'not serialized in ActiveSupport < 4.1'
112
+ elsif configuration.use_async && !configuration.async_json_payload
113
+ # The setting allows serialization to be performed by each handler,
114
+ # and this usually means it is actually performed by ActiveSupport,
115
+ # which cannot safely serialize this key.
116
+ 'not serialized when async_json_payload is not set'
117
+ else
118
+ scrub(configuration.configured_options.configured)
119
+ end
120
+ end
121
+
105
122
  def dump
106
123
  # Ensure all keys are strings since we can receive the payload inline or
107
124
  # from an async handler job, which can be serialized.
@@ -166,13 +183,19 @@ module Rollbar
166
183
  end
167
184
 
168
185
  def build_extra
186
+ merged_extra = Util.deep_merge(scrub(extra), scrub(error_context))
187
+
169
188
  if custom_data_method? && !Rollbar::Util.method_in_stack(:custom_data, __FILE__)
170
- Util.deep_merge(scrub(custom_data), scrub(extra) || {})
189
+ Util.deep_merge(scrub(custom_data), merged_extra)
171
190
  else
172
- scrub(extra)
191
+ merged_extra.empty? ? nil : merged_extra # avoid putting an empty {} in the payload.
173
192
  end
174
193
  end
175
194
 
195
+ def error_context
196
+ exception.respond_to?(:rollbar_context) && exception.rollbar_context
197
+ end
198
+
176
199
  def scrub(data)
177
200
  return data unless data.is_a? Hash
178
201
 
@@ -55,7 +55,7 @@ module Rollbar
55
55
  current_exception = exception
56
56
 
57
57
  while current_exception.respond_to?(:cause) && (cause = current_exception.cause) && cause.is_a?(Exception) && !visited.include?(cause)
58
- traces << trace_data(cause)
58
+ traces.unshift(trace_data(cause))
59
59
  visited << cause
60
60
  current_exception = cause
61
61
  end
@@ -74,10 +74,20 @@ module Rollbar
74
74
  end
75
75
 
76
76
  def map_frames(current_exception)
77
- exception_backtrace(current_exception).map do |frame|
77
+ frames = cleaned_backtrace(current_exception).map do |frame|
78
78
  Rollbar::Item::Frame.new(self, frame,
79
79
  :configuration => configuration).to_h
80
- end.reverse
80
+ end
81
+ frames.reverse!
82
+ end
83
+
84
+ def cleaned_backtrace(current_exception)
85
+ normalized_backtrace = exception_backtrace(current_exception)
86
+ if configuration.backtrace_cleaner
87
+ configuration.backtrace_cleaner.clean(normalized_backtrace)
88
+ else
89
+ normalized_backtrace
90
+ end
81
91
  end
82
92
 
83
93
  # Returns the backtrace to be sent to our API. There are 3 options:
@@ -97,6 +97,8 @@ module Rollbar
97
97
  end
98
98
 
99
99
  def locals_data(filename, lineno)
100
+ return unless configuration.locals[:enabled]
101
+
100
102
  ::Rollbar::Item::Locals.locals_for_location(filename, lineno)
101
103
  end
102
104
 
@@ -1,5 +1,6 @@
1
1
  require 'rollbar/notifier'
2
2
  require 'rollbar/scrubbers/params'
3
+ require 'rollbar/util'
3
4
 
4
5
  module Rollbar
5
6
  class Item
@@ -39,8 +40,51 @@ module Rollbar
39
40
  end
40
41
  end
41
42
 
43
+ # Prepare objects to be handled by the payload serializer.
44
+ #
45
+ # Hashes and Arrays are traversed. Then all types execpt strings and
46
+ # immediates are exported using #inspect. Sending the object itself to the
47
+ # serializer can result in large recursive expansions, especially in Rails
48
+ # environments with ActiveRecord, ActiveSupport, etc. on the stack.
49
+ # Other export options could be #to_s, #to_h, and #as_json. Several of these
50
+ # will omit the class name, or are not implemented for many types.
51
+ #
52
+ # #inspect has the advantage that it is specifically intended for debugging
53
+ # output. If the user wants more or different information in the payload
54
+ # about a specific type, #inspect is the correct place to implement it.
55
+ # Likewise the default implementation should be oriented toward usefulness
56
+ # in debugging.
57
+ #
58
+ # Because #inspect outputs a string, it can be handled well by the string
59
+ # truncation strategy for large payloads.
60
+ #
42
61
  def prepare_value(value)
43
- value.to_s
62
+ return simple_value?(value) ? value : value.inspect unless value.is_a?(Hash) || value.is_a?(Array)
63
+
64
+ cloned_value = ::Rollbar::Util.deep_copy(value)
65
+ ::Rollbar::Util.iterate_and_update_with_block(cloned_value) do |v|
66
+ simple_value?(v) ? v : v.inspect
67
+ end
68
+
69
+ cloned_value
70
+ end
71
+
72
+ def simple_classes
73
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
74
+ [String, Symbol, Integer, Float, TrueClass, FalseClass, NilClass]
75
+ else
76
+ [String, Symbol, Fixnum, Bignum, Float, TrueClass, FalseClass, NilClass] # rubocop:disable Lint/UnifiedInteger
77
+ end
78
+ end
79
+
80
+ def simple_value?(value)
81
+ simple_classes.each do |klass|
82
+ # Use instance_of? so that subclasses and module containers will
83
+ # be treated like complex object types, not simple values.
84
+ return true if value.instance_of?(klass)
85
+ end
86
+
87
+ false
44
88
  end
45
89
 
46
90
  def scrub(hash)
@@ -83,7 +83,12 @@ module Rollbar
83
83
  response = ::Rack::Response.new(response_string, app_result[0],
84
84
  app_result[1])
85
85
 
86
- response.finish
86
+ finished = response.finish
87
+
88
+ # Rack < 2.x Response#finish returns self in array[2]. Rack >= 2.x returns self.body.
89
+ # Always return with the response object here regardless of rack version.
90
+ finished[2] = response
91
+ finished
87
92
  end
88
93
 
89
94
  def build_body_with_js(env, body, head_open_end)
@@ -42,21 +42,21 @@ module Rollbar
42
42
  # Similar to configure below, but used only internally within the gem
43
43
  # to configure it without initializing any of the third party hooks
44
44
  def preconfigure
45
- yield(configuration)
45
+ yield(configuration.configured_options)
46
46
  end
47
47
 
48
48
  # Configures the notifier instance
49
49
  def configure
50
50
  configuration.enabled = true if configuration.enabled.nil?
51
51
 
52
- yield(configuration)
52
+ yield(configuration.configured_options)
53
53
  end
54
54
 
55
55
  def reconfigure
56
56
  self.configuration = Configuration.new
57
57
  configuration.enabled = true
58
58
 
59
- yield(configuration)
59
+ yield(configuration.configured_options)
60
60
  end
61
61
 
62
62
  def unconfigure
@@ -211,7 +211,9 @@ module Rollbar
211
211
  end
212
212
  rescue StandardError => e
213
213
  log_error("[Rollbar] Error processing the item: #{e.class}, #{e.message}. Item: #{item.payload.inspect}")
214
- raise e
214
+ raise e unless via_failsafe?(item)
215
+
216
+ log_error('[Rollbar] Item has already failed. Not re-raising')
215
217
  end
216
218
 
217
219
  # We will reraise exceptions in this method so async queues
@@ -238,16 +240,19 @@ module Rollbar
238
240
  # Using Rollbar.silenced we avoid the above behavior but Sidekiq
239
241
  # will have a chance to retry the original job.
240
242
  def process_from_async_handler(payload)
241
- payload = Rollbar::JSON.load(payload) if payload.is_a?(String)
242
-
243
- item = Item.build_with(payload,
244
- :notifier => self,
245
- :configuration => configuration,
246
- :logger => logger)
247
-
248
243
  Rollbar.silenced do
249
244
  begin
250
- process_item(item)
245
+ if payload.is_a?(String)
246
+ # The final payload has already been built.
247
+ send_body(payload)
248
+ else
249
+ item = Item.build_with(payload,
250
+ :notifier => self,
251
+ :configuration => configuration,
252
+ :logger => logger)
253
+
254
+ process_item(item)
255
+ end
251
256
  rescue StandardError => e
252
257
  report_internal_error(e)
253
258
 
@@ -509,14 +514,18 @@ module Rollbar
509
514
 
510
515
  ## Delivery functions
511
516
 
512
- def send_item_using_eventmachine(item, uri)
513
- body = item.dump
514
- return unless body
517
+ def send_using_eventmachine(body)
518
+ uri = URI.parse(configuration.endpoint)
515
519
 
516
- headers = { 'X-Rollbar-Access-Token' => item['access_token'] }
520
+ headers = { 'X-Rollbar-Access-Token' => configuration.access_token }
517
521
  options = http_proxy_for_em(uri)
518
522
  req = EventMachine::HttpRequest.new(uri.to_s, options).post(:body => body, :head => headers)
519
523
 
524
+ eventmachine_callback(req)
525
+ eventmachine_errback(req)
526
+ end
527
+
528
+ def eventmachine_callback(req)
520
529
  req.callback do
521
530
  if req.response_header.status == 200
522
531
  log_info '[Rollbar] Success'
@@ -525,7 +534,9 @@ module Rollbar
525
534
  log_info "[Rollbar] Response: #{req.response}"
526
535
  end
527
536
  end
537
+ end
528
538
 
539
+ def eventmachine_errback(req)
529
540
  req.errback do
530
541
  log_warning "[Rollbar] Call to API failed, status code: #{req.response_header.status}"
531
542
  log_info "[Rollbar] Error's response: #{req.response}"
@@ -538,14 +549,20 @@ module Rollbar
538
549
  body = item.dump
539
550
  return unless body
540
551
 
541
- uri = URI.parse(configuration.endpoint)
542
-
543
552
  if configuration.use_eventmachine
544
- send_item_using_eventmachine(item, uri)
553
+ send_using_eventmachine(body)
545
554
  return
546
555
  end
547
556
 
548
- handle_response(do_post(uri, body, item['access_token']))
557
+ send_body(body)
558
+ end
559
+
560
+ def send_body(body)
561
+ log_info '[Rollbar] Sending json'
562
+
563
+ uri = URI.parse(configuration.endpoint)
564
+
565
+ handle_response(do_post(uri, body, configuration.access_token))
549
566
  end
550
567
 
551
568
  def do_post(uri, body, access_token)
@@ -737,8 +754,11 @@ module Rollbar
737
754
  end
738
755
 
739
756
  def process_async_item(item)
757
+ # Send async payloads as JSON string when async_json_payload is set.
758
+ payload = configuration.async_json_payload ? item.dump : item.payload
759
+
740
760
  configuration.async_handler ||= default_async_handler
741
- configuration.async_handler.call(item.payload)
761
+ configuration.async_handler.call(payload)
742
762
  rescue StandardError
743
763
  if configuration.failover_handlers.empty?
744
764
  log_error '[Rollbar] Async handler failed, and there are no failover handlers configured. See the docs for "failover_handlers"'
@@ -772,5 +792,9 @@ module Rollbar
772
792
  uuid_url = Util.uuid_rollbar_url(data, configuration)
773
793
  log_info "[Rollbar] Details: #{uuid_url} (only available if report was successful)"
774
794
  end
795
+
796
+ def via_failsafe?(item)
797
+ item.payload.fetch('data', {}).fetch(:failsafe, false)
798
+ end
775
799
  end
776
800
  end
@@ -14,5 +14,9 @@ module Rollbar
14
14
  end
15
15
  end
16
16
 
17
- # Automatically add to ActionMailer::DeliveryJob
18
- ActionMailer::DeliveryJob.send(:include, Rollbar::ActiveJob) if defined?(ActionMailer::DeliveryJob)
17
+ if defined?(ActiveSupport) && ActiveSupport.respond_to?(:on_load)
18
+ ActiveSupport.on_load(:action_mailer) do
19
+ # Automatically add to ActionMailer::DeliveryJob
20
+ ActionMailer::DeliveryJob.send(:include, Rollbar::ActiveJob) if defined?(ActionMailer::DeliveryJob)
21
+ end
22
+ end
@@ -0,0 +1,11 @@
1
+ module RollbarErrorContext
2
+ attr_accessor :rollbar_context
3
+ end
4
+
5
+ Rollbar.plugins.define('error_context') do
6
+ dependency { configuration.enable_error_context }
7
+
8
+ execute! do
9
+ StandardError.send(:include, RollbarErrorContext)
10
+ end
11
+ end
@@ -6,11 +6,7 @@ module Rollbar
6
6
  if Rollbar.configuration.randomize_scrub_length
7
7
  random_filtered_value
8
8
  else
9
- '*' * (begin
10
- value.length
11
- rescue StandardError
12
- 8
13
- end)
9
+ '*' * 6
14
10
  end
15
11
  end
16
12
 
@@ -11,7 +11,7 @@ module Rollbar
11
11
  end
12
12
 
13
13
  def call(payload)
14
- new_payload = Rollbar::Util.deep_copy(payload)
14
+ new_payload = payload
15
15
  body = new_payload['data']['body']
16
16
 
17
17
  if body['trace_chain']
@@ -9,7 +9,7 @@ module Rollbar
9
9
  result.bytesize > MAX_PAYLOAD_SIZE
10
10
  end
11
11
 
12
- def select_frames(frames, range = 150)
12
+ def select_frames(frames, range = 50)
13
13
  return frames unless frames.count > range * 2
14
14
 
15
15
  frames[0, range] + frames[-range, range]
@@ -6,7 +6,7 @@ module Rollbar
6
6
  class StringsStrategy
7
7
  include ::Rollbar::Truncation::Mixin
8
8
 
9
- STRING_THRESHOLDS = [1024, 512, 256].freeze
9
+ STRING_THRESHOLDS = [1024, 512, 256, 128].freeze
10
10
 
11
11
  def self.call(payload)
12
12
  new.call(payload)
@@ -29,7 +29,9 @@ module Rollbar
29
29
 
30
30
  def truncate_strings_proc(threshold)
31
31
  proc do |value|
32
- if value.is_a?(String) && value.bytesize > threshold
32
+ # Rollbar::Util.truncate will operate on characters, not bytes,
33
+ # so use value.length, not bytesize.
34
+ if value.is_a?(String) && value.length > threshold
33
35
  Rollbar::Util.truncate(value, threshold)
34
36
  else
35
37
  value
data/lib/rollbar/util.rb CHANGED
@@ -2,6 +2,10 @@ require 'rollbar/util/hash'
2
2
 
3
3
  module Rollbar
4
4
  module Util # :nodoc:
5
+ def self.iterate_and_update_with_block(obj, &block)
6
+ iterate_and_update(obj, block)
7
+ end
8
+
5
9
  def self.iterate_and_update(obj, block, seen = {})
6
10
  return if obj.frozen? || seen[obj.object_id]
7
11
 
@@ -1,3 +1,3 @@
1
1
  module Rollbar
2
- VERSION = '2.21.0'.freeze
2
+ VERSION = '2.23.2'.freeze
3
3
  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.21.0
4
+ version: 2.23.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rollbar, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-12 00:00:00.000000000 Z
11
+ date: 2020-01-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Easy and powerful exception tracking for Ruby
14
14
  email:
@@ -95,6 +95,7 @@ files:
95
95
  - lib/rollbar/plugins/delayed_job.rb
96
96
  - lib/rollbar/plugins/delayed_job/job_data.rb
97
97
  - lib/rollbar/plugins/delayed_job/plugin.rb
98
+ - lib/rollbar/plugins/error_context.rb
98
99
  - lib/rollbar/plugins/goalie.rb
99
100
  - lib/rollbar/plugins/rack.rb
100
101
  - lib/rollbar/plugins/rails.rb
@@ -157,8 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
158
  - !ruby/object:Gem::Version
158
159
  version: '0'
159
160
  requirements: []
160
- rubyforge_project:
161
- rubygems_version: 2.7.7
161
+ rubygems_version: 3.1.2
162
162
  signing_key:
163
163
  specification_version: 4
164
164
  summary: Reports exceptions to Rollbar