bugsnag 1.1.5 → 1.2.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -1
- data/Gemfile.lock +5 -5
- data/README.md +132 -22
- data/VERSION +1 -1
- data/bugsnag.gemspec +13 -8
- data/lib/bugsnag.rb +39 -18
- data/lib/bugsnag/configuration.rb +54 -43
- data/lib/bugsnag/helpers.rb +35 -21
- data/lib/bugsnag/middleware/callbacks.rb +19 -0
- data/lib/bugsnag/middleware/rack_request.rb +48 -0
- data/lib/bugsnag/middleware/rails2_request.rb +45 -0
- data/lib/bugsnag/middleware/rails3_request.rb +27 -0
- data/lib/bugsnag/middleware/warden_user.rb +47 -0
- data/lib/bugsnag/middleware_stack.rb +64 -0
- data/lib/bugsnag/notification.rb +146 -57
- data/lib/bugsnag/rack.rb +34 -49
- data/lib/bugsnag/rails.rb +12 -3
- data/lib/bugsnag/rails/action_controller_rescue.rb +33 -21
- data/lib/bugsnag/rails/controller_methods.rb +34 -50
- data/lib/bugsnag/railtie.rb +26 -14
- data/lib/bugsnag/tasks.rb +1 -1
- data/lib/{tasks → bugsnag/tasks}/bugsnag.rake +5 -0
- metadata +31 -17
- data/lib/bugsnag/delay/resque.rb +0 -21
data/Gemfile
CHANGED
@@ -3,7 +3,7 @@ source "http://rubygems.org"
|
|
3
3
|
# Example:
|
4
4
|
# gem "activesupport", ">= 2.3.5"
|
5
5
|
gem "multi_json", "~> 1.0"
|
6
|
-
gem "httparty", "
|
6
|
+
gem "httparty", ">= 0.5", "< 1.0"
|
7
7
|
|
8
8
|
# Add dependencies to develop your gem here.
|
9
9
|
# Include everything needed to run rake, tests, features, etc.
|
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
activesupport (3.2.
|
4
|
+
activesupport (3.2.8)
|
5
5
|
i18n (~> 0.6)
|
6
6
|
multi_json (~> 1.0)
|
7
7
|
git (1.2.5)
|
8
|
-
httparty (0.
|
8
|
+
httparty (0.9.0)
|
9
9
|
multi_json (~> 1.0)
|
10
10
|
multi_xml
|
11
|
-
i18n (0.6.
|
11
|
+
i18n (0.6.1)
|
12
12
|
jeweler (1.6.4)
|
13
13
|
bundler (~> 1.0)
|
14
14
|
git (>= 1.2.5)
|
@@ -21,14 +21,14 @@ GEM
|
|
21
21
|
shoulda-context (~> 1.0)
|
22
22
|
shoulda-matchers (~> 1.2)
|
23
23
|
shoulda-context (1.0.0)
|
24
|
-
shoulda-matchers (1.
|
24
|
+
shoulda-matchers (1.3.0)
|
25
25
|
activesupport (>= 3.0.0)
|
26
26
|
|
27
27
|
PLATFORMS
|
28
28
|
ruby
|
29
29
|
|
30
30
|
DEPENDENCIES
|
31
|
-
httparty (
|
31
|
+
httparty (>= 0.5, < 1.0)
|
32
32
|
jeweler (~> 1.6.4)
|
33
33
|
multi_json (~> 1.0)
|
34
34
|
rcov
|
data/README.md
CHANGED
@@ -12,8 +12,19 @@ as fast as possible. [Create a free account](http://bugsnag.com) to start
|
|
12
12
|
capturing exceptions from your applications.
|
13
13
|
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
Contents
|
16
|
+
--------
|
17
|
+
|
18
|
+
- [How to Install](#how-to-install)
|
19
|
+
- [Sending Custom Data With Exceptions](#sending-custom-data-with-exceptions)
|
20
|
+
- [Sending Non-Fatal Exceptions](#sending-non-fatal-exceptions)
|
21
|
+
- [Configuration](#configuration)
|
22
|
+
- [Bugsnag Middleware](#bugsnag-middleware)
|
23
|
+
- [Deploy Tracking](#deploy-tracking)
|
24
|
+
|
25
|
+
|
26
|
+
How to Install
|
27
|
+
--------------
|
17
28
|
|
18
29
|
1. Add the `bugsnag` gem to your `Gemfile`
|
19
30
|
|
@@ -27,7 +38,9 @@ How to Install (Rails)
|
|
27
38
|
bundle install
|
28
39
|
```
|
29
40
|
|
30
|
-
3.
|
41
|
+
3. Configure the Bugsnag module with your API key.
|
42
|
+
|
43
|
+
In rails apps, put this code to a new file at `config/initializers/bugsnag.rb`
|
31
44
|
|
32
45
|
```ruby
|
33
46
|
Bugsnag.configure do |config|
|
@@ -35,45 +48,87 @@ How to Install (Rails)
|
|
35
48
|
end
|
36
49
|
```
|
37
50
|
|
38
|
-
|
39
|
-
------------------------
|
51
|
+
4. **Rack/Sinatra apps only**: Activate the Bugsnag Rack middleware
|
40
52
|
|
41
|
-
```ruby
|
42
|
-
|
53
|
+
```ruby
|
54
|
+
use Bugsnag::Rack
|
55
|
+
```
|
43
56
|
|
44
|
-
|
45
|
-
|
57
|
+
|
58
|
+
Sending Custom Data With Exceptions
|
59
|
+
-----------------------------------
|
60
|
+
|
61
|
+
It is often useful to send additional meta-data about your app, such as
|
62
|
+
information about the currently logged in user, along with any
|
63
|
+
exceptions, to help debug problems.
|
64
|
+
|
65
|
+
### Rails Apps
|
66
|
+
|
67
|
+
In any rails controller you can define a `before_bugsnag_notify` callback,
|
68
|
+
which allows you to add this additional data by calling `add_tab` on the
|
69
|
+
exception notification object.
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
class MyController < ApplicationController
|
73
|
+
# Define the filter
|
74
|
+
before_bugsnag_notify :add_user_info_to_bugsnag
|
75
|
+
|
76
|
+
# Your controller code here
|
77
|
+
|
78
|
+
private
|
79
|
+
def add_user_info_to_bugsnag(notif)
|
80
|
+
# Add some app-specific data which will be displayed on a custom
|
81
|
+
# "User Info" tab on each error page on bugsnag.com
|
82
|
+
notif.add_tab(:user_info, {
|
83
|
+
name: current_user.name
|
84
|
+
})
|
85
|
+
end
|
46
86
|
end
|
87
|
+
```
|
88
|
+
|
89
|
+
### Other Ruby Apps
|
90
|
+
|
91
|
+
In other ruby apps, you can provide lambda functions to execute before any
|
92
|
+
`Bugsnag.notify` calls as follows. Don't forget to clear the callbacks at the
|
93
|
+
end of each request or session.
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
# Set a before notify callback
|
97
|
+
Bugsnag.before_notify_callbacks << lambda {|notif|
|
98
|
+
notif.add_tab(:user_info, {
|
99
|
+
name: current_user.name
|
100
|
+
})
|
101
|
+
}
|
47
102
|
|
48
|
-
|
103
|
+
# Your app code here
|
104
|
+
|
105
|
+
# Clear the callbacks
|
106
|
+
Bugsnag.before_notify_callbacks.clear
|
49
107
|
```
|
50
108
|
|
109
|
+
You can read more about how callbacks work in the
|
110
|
+
[Bugsnag Middleware](#bugsnag-middleware) documentation below.
|
111
|
+
|
51
112
|
|
52
|
-
|
53
|
-
|
113
|
+
Sending Non-Fatal Exceptions
|
114
|
+
----------------------------
|
54
115
|
|
55
|
-
If you would like to send non-fatal exceptions to Bugsnag,
|
56
|
-
|
116
|
+
If you would like to send non-fatal exceptions to Bugsnag, you can call
|
117
|
+
`Bugsnag.notify`:
|
57
118
|
|
58
119
|
```ruby
|
59
|
-
|
120
|
+
Bugsnag.notify(RuntimeError.new("Something broke"))
|
60
121
|
```
|
61
122
|
|
62
123
|
You can also send additional meta-data with your exception:
|
63
124
|
|
64
125
|
```ruby
|
65
|
-
|
126
|
+
Bugsnag.notify(RuntimeError.new("Something broke"), {
|
66
127
|
:username => "bob-hoskins",
|
67
128
|
:registered_user => true
|
68
129
|
})
|
69
130
|
```
|
70
131
|
|
71
|
-
Anywhere else in your ruby code, you can call `Bugsnag.notify`:
|
72
|
-
|
73
|
-
```ruby
|
74
|
-
Bugsnag.notify(RuntimeError.new("Something broke"));
|
75
|
-
```
|
76
|
-
|
77
132
|
|
78
133
|
Configuration
|
79
134
|
-------------
|
@@ -195,6 +250,61 @@ By default, `ignore_classes` contains the following classes:
|
|
195
250
|
]
|
196
251
|
```
|
197
252
|
|
253
|
+
###logger
|
254
|
+
|
255
|
+
Sets which logger to use for Bugsnag log messages. In rails apps, this is
|
256
|
+
automatically set to use `Rails.logger`, otherwise it will be set to
|
257
|
+
`Logger.new(STDOUT)`.
|
258
|
+
|
259
|
+
###middleware
|
260
|
+
|
261
|
+
Provides access to the middleware stack, see the
|
262
|
+
[Bugsnag Middleware](#bugsnag-middleware) section below for details.
|
263
|
+
|
264
|
+
|
265
|
+
Bugsnag Middleware
|
266
|
+
------------------
|
267
|
+
|
268
|
+
The Bugsnag Notifier for Ruby provides its own middleware system, similar to
|
269
|
+
the one used in Rack applications. Middleware allows you to execute code
|
270
|
+
before and after an exception is sent to bugsnag.com, so you can do things
|
271
|
+
such as:
|
272
|
+
|
273
|
+
- Send application-specific information along with exceptions, eg. the name
|
274
|
+
of the currently logged in user,
|
275
|
+
- Write exception information to your internal logging system.
|
276
|
+
|
277
|
+
To make your own middleware, create a class that looks like this:
|
278
|
+
|
279
|
+
```ruby
|
280
|
+
class MyMiddleware
|
281
|
+
def initialize(bugsnag)
|
282
|
+
@bugsnag = bugsnag
|
283
|
+
end
|
284
|
+
|
285
|
+
def call(notification)
|
286
|
+
# Your custom "before notify" code
|
287
|
+
|
288
|
+
@bugsnag.call(notification)
|
289
|
+
|
290
|
+
# Your custom "after notify" code
|
291
|
+
end
|
292
|
+
end
|
293
|
+
```
|
294
|
+
|
295
|
+
You can then add your middleware to the middleware stack as follows:
|
296
|
+
|
297
|
+
```ruby
|
298
|
+
Bugsnag.configure do |config|
|
299
|
+
config.middleware.use MyMiddleware
|
300
|
+
end
|
301
|
+
```
|
302
|
+
|
303
|
+
You can also view the order of the currently activated middleware by running `rake bugsnag:middleware`.
|
304
|
+
|
305
|
+
Check out Bugsnag's [built in middleware classes](https://github.com/bugsnag/bugsnag-ruby/tree/master/lib/bugsnag/middleware)
|
306
|
+
for some real examples of middleware in action.
|
307
|
+
|
198
308
|
|
199
309
|
Deploy Tracking
|
200
310
|
---------------
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0.beta
|
data/bugsnag.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "bugsnag"
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.2.0.beta"
|
9
9
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["James Smith"]
|
12
|
-
s.date = "2012-09-
|
12
|
+
s.date = "2012-09-29"
|
13
13
|
s.description = "Ruby notifier for bugsnag.com"
|
14
14
|
s.email = "james@bugsnag.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -28,8 +28,13 @@ Gem::Specification.new do |s|
|
|
28
28
|
"lib/bugsnag.rb",
|
29
29
|
"lib/bugsnag/capistrano.rb",
|
30
30
|
"lib/bugsnag/configuration.rb",
|
31
|
-
"lib/bugsnag/delay/resque.rb",
|
32
31
|
"lib/bugsnag/helpers.rb",
|
32
|
+
"lib/bugsnag/middleware/callbacks.rb",
|
33
|
+
"lib/bugsnag/middleware/rack_request.rb",
|
34
|
+
"lib/bugsnag/middleware/rails2_request.rb",
|
35
|
+
"lib/bugsnag/middleware/rails3_request.rb",
|
36
|
+
"lib/bugsnag/middleware/warden_user.rb",
|
37
|
+
"lib/bugsnag/middleware_stack.rb",
|
33
38
|
"lib/bugsnag/notification.rb",
|
34
39
|
"lib/bugsnag/rack.rb",
|
35
40
|
"lib/bugsnag/rails.rb",
|
@@ -37,9 +42,9 @@ Gem::Specification.new do |s|
|
|
37
42
|
"lib/bugsnag/rails/controller_methods.rb",
|
38
43
|
"lib/bugsnag/railtie.rb",
|
39
44
|
"lib/bugsnag/tasks.rb",
|
45
|
+
"lib/bugsnag/tasks/bugsnag.rake",
|
40
46
|
"lib/bugsnag/version.rb",
|
41
47
|
"lib/resque/failure/bugsnag.rb",
|
42
|
-
"lib/tasks/bugsnag.rake",
|
43
48
|
"rails/init.rb",
|
44
49
|
"test/helper.rb",
|
45
50
|
"test/test_bugsnag.rb"
|
@@ -55,20 +60,20 @@ Gem::Specification.new do |s|
|
|
55
60
|
|
56
61
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
57
62
|
s.add_runtime_dependency(%q<multi_json>, ["~> 1.0"])
|
58
|
-
s.add_runtime_dependency(%q<httparty>, ["
|
63
|
+
s.add_runtime_dependency(%q<httparty>, ["< 1.0", ">= 0.5"])
|
59
64
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
60
65
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
61
66
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
62
67
|
else
|
63
68
|
s.add_dependency(%q<multi_json>, ["~> 1.0"])
|
64
|
-
s.add_dependency(%q<httparty>, ["
|
69
|
+
s.add_dependency(%q<httparty>, ["< 1.0", ">= 0.5"])
|
65
70
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
66
71
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
67
72
|
s.add_dependency(%q<rcov>, [">= 0"])
|
68
73
|
end
|
69
74
|
else
|
70
75
|
s.add_dependency(%q<multi_json>, ["~> 1.0"])
|
71
|
-
s.add_dependency(%q<httparty>, ["
|
76
|
+
s.add_dependency(%q<httparty>, ["< 1.0", ">= 0.5"])
|
72
77
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
73
78
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
74
79
|
s.add_dependency(%q<rcov>, [">= 0"])
|
data/lib/bugsnag.rb
CHANGED
@@ -14,12 +14,15 @@ module Bugsnag
|
|
14
14
|
LOG_PREFIX = "** [Bugsnag] "
|
15
15
|
|
16
16
|
class << self
|
17
|
-
# Configure the
|
18
|
-
def configure
|
19
|
-
|
17
|
+
# Configure the Bugsnag notifier application-wide settings.
|
18
|
+
def configure(config_hash=nil)
|
19
|
+
if config_hash
|
20
|
+
config_hash.each do |k,v|
|
21
|
+
configuration.send("#{k}=", v) rescue nil if configuration.respond_to?("#{k}=")
|
22
|
+
end
|
23
|
+
end
|
20
24
|
|
21
|
-
|
22
|
-
require "bugsnag/delay/resque" if configuration.delay_with_resque && defined?(Resque)
|
25
|
+
yield(configuration) if block_given?
|
23
26
|
|
24
27
|
# Log that we are ready to rock
|
25
28
|
if configuration.api_key && !@logged_ready
|
@@ -29,40 +32,58 @@ module Bugsnag
|
|
29
32
|
end
|
30
33
|
|
31
34
|
# Explicitly notify of an exception
|
32
|
-
def notify(exception,
|
33
|
-
Notification.new(exception, configuration
|
35
|
+
def notify(exception, overrides=nil, request_data=nil)
|
36
|
+
Notification.new(exception, configuration, overrides, request_data).deliver
|
34
37
|
end
|
35
38
|
|
36
39
|
# Notify of an exception unless it should be ignored
|
37
|
-
def notify_or_ignore(exception,
|
38
|
-
notification = Notification.new(exception, configuration
|
40
|
+
def notify_or_ignore(exception, overrides=nil, request_data=nil)
|
41
|
+
notification = Notification.new(exception, configuration, overrides, request_data)
|
39
42
|
notification.deliver unless notification.ignore?
|
40
43
|
end
|
41
44
|
|
42
45
|
# Auto notify of an exception, called from rails and rack exception
|
43
46
|
# rescuers, unless auto notification is disabled, or we should ignore this
|
44
47
|
# error class
|
45
|
-
def auto_notify(exception,
|
46
|
-
notify_or_ignore(exception,
|
48
|
+
def auto_notify(exception, overrides=nil, request_data=nil)
|
49
|
+
notify_or_ignore(exception, overrides, request_data) if configuration.auto_notify
|
47
50
|
end
|
48
51
|
|
49
52
|
# Log wrapper
|
50
53
|
def log(message)
|
51
|
-
configuration.logger.info(LOG_PREFIX
|
54
|
+
configuration.logger.info("#{LOG_PREFIX}#{message}")
|
52
55
|
end
|
53
56
|
|
54
57
|
# Warning logger
|
55
58
|
def warn(message)
|
56
|
-
|
57
|
-
configuration.logger.warn(LOG_PREFIX + message)
|
58
|
-
else
|
59
|
-
puts "#{LOG_PREFIX}#{message}"
|
60
|
-
end
|
59
|
+
configuration.logger.warn("#{LOG_PREFIX}#{message}")
|
61
60
|
end
|
62
61
|
|
63
|
-
# Configuration
|
62
|
+
# Configuration getters
|
64
63
|
def configuration
|
65
64
|
@configuration ||= Bugsnag::Configuration.new
|
66
65
|
end
|
66
|
+
|
67
|
+
# Set "per-request" data, temporal data for use in bugsnag middleware
|
68
|
+
def set_request_data(key, value)
|
69
|
+
Bugsnag.configuration.set_request_data(key, value)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Clear all "per-request" data, temporal data for use in bugsnag middleware
|
73
|
+
# This method should be called after each distinct request or session ends
|
74
|
+
# Eg. After completing a page request in a web app
|
75
|
+
def clear_request_data
|
76
|
+
Bugsnag.configuration.clear_request_data
|
77
|
+
end
|
78
|
+
|
79
|
+
# Allow access to "before notify" callbacks
|
80
|
+
def before_notify_callbacks
|
81
|
+
Bugsnag.configuration.request_data[:before_callbacks] ||= []
|
82
|
+
end
|
83
|
+
|
84
|
+
# Allow access to "after notify" callbacks
|
85
|
+
def after_notify_callbacks
|
86
|
+
Bugsnag.configuration.request_data[:after_callbacks] ||= []
|
87
|
+
end
|
67
88
|
end
|
68
89
|
end
|
@@ -1,36 +1,27 @@
|
|
1
|
+
require "set"
|
2
|
+
require "logger"
|
3
|
+
require "bugsnag/middleware_stack"
|
4
|
+
|
1
5
|
module Bugsnag
|
2
6
|
class Configuration
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
attr_accessor :api_key
|
8
|
+
attr_accessor :release_stage
|
9
|
+
attr_accessor :notify_release_stages
|
10
|
+
attr_accessor :auto_notify
|
11
|
+
attr_accessor :use_ssl
|
12
|
+
attr_accessor :project_root
|
13
|
+
attr_accessor :app_version
|
14
|
+
attr_accessor :params_filters
|
15
|
+
attr_accessor :ignore_classes
|
16
|
+
attr_accessor :endpoint
|
17
|
+
attr_accessor :logger
|
18
|
+
attr_accessor :middleware
|
13
19
|
|
14
|
-
|
20
|
+
THREAD_LOCAL_NAME = "bugsnag_req_data"
|
15
21
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
line.sub(/#{Bugsnag.configuration.project_root}\//, "")
|
20
|
-
else
|
21
|
-
line
|
22
|
-
end
|
23
|
-
},
|
24
|
-
lambda { |line| line.gsub(/^\.\//, "") },
|
25
|
-
lambda { |line|
|
26
|
-
if defined?(Gem)
|
27
|
-
Gem.path.inject(line) do |line, path|
|
28
|
-
line.gsub(/#{path}\//, "")
|
29
|
-
end
|
30
|
-
end
|
31
|
-
},
|
32
|
-
lambda { |line| line if line !~ %r{lib/bugsnag} }
|
33
|
-
].freeze
|
22
|
+
DEFAULT_ENDPOINT = "notify.bugsnag.com"
|
23
|
+
|
24
|
+
DEFAULT_PARAMS_FILTERS = ["password"].freeze
|
34
25
|
|
35
26
|
DEFAULT_IGNORE_CLASSES = [
|
36
27
|
"ActiveRecord::RecordNotFound",
|
@@ -40,26 +31,46 @@ module Bugsnag
|
|
40
31
|
"ActionController::UnknownAction",
|
41
32
|
"AbstractController::ActionNotFound",
|
42
33
|
"Mongoid::Errors::DocumentNotFound"
|
43
|
-
]
|
44
|
-
|
34
|
+
].freeze
|
45
35
|
|
46
36
|
def initialize
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
37
|
+
# Set up the defaults
|
38
|
+
self.release_stage = "production"
|
39
|
+
self.notify_release_stages = ["production"]
|
40
|
+
self.auto_notify = true
|
41
|
+
self.use_ssl = false
|
42
|
+
self.params_filters = Set.new(DEFAULT_PARAMS_FILTERS)
|
43
|
+
self.ignore_classes = Set.new(DEFAULT_IGNORE_CLASSES)
|
44
|
+
self.endpoint = DEFAULT_ENDPOINT
|
45
|
+
|
46
|
+
# Set up logging
|
47
|
+
self.logger = Logger.new(STDOUT)
|
48
|
+
self.logger.level = Logger::WARN if self.release_stage == "production"
|
49
|
+
|
50
|
+
# Configure the bugsnag middleware stack
|
51
|
+
self.middleware = Bugsnag::MiddlewareStack.new
|
52
|
+
self.middleware.use Bugsnag::Middleware::Callbacks
|
53
|
+
end
|
54
|
+
|
55
|
+
def should_notify?
|
56
|
+
@notify_release_stages.include?(@release_stage)
|
57
|
+
end
|
58
|
+
|
59
|
+
def request_data
|
60
|
+
Thread.current[THREAD_LOCAL_NAME] ||= {}
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_request_data(key, value)
|
64
|
+
Bugsnag.warn "Overwriting request data for key #{key.to_s}" if self.request_data[key]
|
65
|
+
self.request_data[key] = value
|
53
66
|
end
|
54
67
|
|
55
|
-
def
|
56
|
-
|
57
|
-
hash.merge(option.to_sym => send(option))
|
58
|
-
end
|
68
|
+
def unset_request_data(key, value)
|
69
|
+
self.request_data.delete(key)
|
59
70
|
end
|
60
71
|
|
61
|
-
def
|
62
|
-
|
72
|
+
def clear_request_data
|
73
|
+
Thread.current[THREAD_LOCAL_NAME] = nil
|
63
74
|
end
|
64
75
|
end
|
65
76
|
end
|