rollbar 2.21.0 → 2.23.2

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