raygun4ruby 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +40 -4
- data/lib/raygun.rb +37 -13
- data/lib/raygun/affected_user.rb +59 -0
- data/lib/raygun/client.rb +23 -5
- data/lib/raygun/configuration.rb +25 -15
- data/lib/raygun/error.rb +10 -0
- data/lib/raygun/middleware/rails_insert_affected_user.rb +7 -12
- data/lib/raygun/version.rb +1 -1
- data/test/unit/{rails_insert_affected_user_test.rb → affected_user_test.rb} +38 -16
- data/test/unit/client_test.rb +126 -316
- data/test/unit/configuration_test.rb +33 -0
- data/test/unit/raygun_test.rb +41 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 177fe25eed9a04d4924bf9a49ce89e521cdc3af3
|
4
|
+
data.tar.gz: 4b1ee81e75e37b688a24bb9bc18a8ac187eb2e90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 240b3595f0525d734fd067e33db5f21a0f20e3c47901c44c019fb046d35c4566fe685e48343721049507afc711fc30364aa11bffb1d218526a1d28391db06f14
|
7
|
+
data.tar.gz: c9054cb36202bab19b695cc08de7c8e48cff4c50cd1e5fa911f9aac217076a0e08cf6984bb2429ffe79d0f0c8c9d6f1e486daf9b4b80de02dea4ae2d767acb09
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## 1.3.0 (10/03/2017)
|
2
|
+
|
3
|
+
Features:
|
4
|
+
- Improve affected user handling to let you specify all Raygun parameters, identifier, email, first name, full name and uuid. See [README.md](https://github.com/MindscapeHQ/raygun4ruby#affected-user-tracking) for details
|
5
|
+
- Pass a user object as the third parameter to `Raygun.track_exception` to have affected user tracking for manually tracked exceptions, see the above link for more information on configuring this
|
6
|
+
- If the exception instance responds to `:raygun_custom_data` that method will be called and the return value merged into the `custom_data` hash sent to Raygun. For convenience a `Raygun::Error` class is provided that takes this custom data as a second argument
|
7
|
+
- Allowed `Configuration.custom_data` to be set to a proc to allow a global custom data hook for all exceptions. It is passed as arguments the exception and the environment hash
|
8
|
+
- Added `Configuration.debug` to enable logging the reason why an exception was not reported
|
9
|
+
|
1
10
|
## 1.2.1 (09/03/2017)
|
2
11
|
|
3
12
|
Bugfixes:
|
data/README.md
CHANGED
@@ -74,6 +74,13 @@ rescue Exception => e
|
|
74
74
|
Raygun.track_exception(e)
|
75
75
|
end
|
76
76
|
|
77
|
+
# You may also pass a user object as the third argument to allow affected user tracking, like so
|
78
|
+
begin
|
79
|
+
# your lovely code here
|
80
|
+
rescue Exception => e
|
81
|
+
# The second argument is the request environment variables
|
82
|
+
Raygun.track_exception(e, {}, user)
|
83
|
+
end
|
77
84
|
```
|
78
85
|
|
79
86
|
You can also pass a Hash as the second parameter to `track_exception`. It should look like a [Rack Env Hash](http://rack.rubyforge.org/doc/SPEC.html)
|
@@ -151,6 +158,26 @@ end
|
|
151
158
|
|
152
159
|
```
|
153
160
|
|
161
|
+
Custom data can also be specified globally either by setting `config.custom_data` to a hash
|
162
|
+
|
163
|
+
```ruby
|
164
|
+
Raygun.setup do |config|
|
165
|
+
config.api_key = "YOUR_RAYGUN_API_KEY"
|
166
|
+
config.custom_data = {custom_data: 'goes here'}
|
167
|
+
end
|
168
|
+
```
|
169
|
+
|
170
|
+
or to a proc, which gets passed the exception and environment hash
|
171
|
+
|
172
|
+
```ruby
|
173
|
+
Raygun.setup do |config|
|
174
|
+
config.api_key = "YOUR_RAYGUN_API_KEY"
|
175
|
+
config.custom_data do |e, env|
|
176
|
+
{message: e.message, server: env["SERVER_NAME"]}
|
177
|
+
end
|
178
|
+
end
|
179
|
+
```
|
180
|
+
|
154
181
|
### Ignoring Some Errors
|
155
182
|
|
156
183
|
You can ignore certain types of Exception using the `ignore` option in the setup block, like so:
|
@@ -199,21 +226,30 @@ end
|
|
199
226
|
|
200
227
|
Raygun can now track how many users have been affected by an error.
|
201
228
|
|
202
|
-
By default, Raygun looks for a method called `current_user` on your controller, and
|
229
|
+
By default, Raygun looks for a method called `current_user` on your controller, and it will populate the user's information based on a default method name mapping.
|
203
230
|
|
204
|
-
|
231
|
+
(e.g Raygun will call `email` to populate the user's email, and `first_name` for the user's first name)
|
232
|
+
|
233
|
+
You can inspect and customize this mapping using `config.affected_user_mapping`, like so:
|
205
234
|
|
206
235
|
```ruby
|
207
236
|
Raygun.setup do |config|
|
208
237
|
config.api_key = "MY_SWEET_API_KEY"
|
209
238
|
config.affected_user_method = :my_current_user # `current_user` by default
|
210
|
-
|
239
|
+
# To augment the defaults with your unique methods you can do the following
|
240
|
+
config.affected_user_mapping = Raygun::AffectedUser::DEFAULT_MAPPING.merge({
|
241
|
+
identifier: :some_custom_unique_identifier,
|
242
|
+
# If you set the key to a proc it will be passed the user object and you can construct the value your self
|
243
|
+
full_name: ->(user) { "#{user.first_name} #{user.last_name}" }
|
244
|
+
})
|
211
245
|
end
|
212
246
|
```
|
213
247
|
|
248
|
+
To see the defaults check out [affected_user.rb](https://github.com/MindscapeHQ/raygun4ruby/tree/master/lib/raygun/affected_user.rb)
|
249
|
+
|
214
250
|
If you're using Rails, most authentication systems will have this method set and you should be good to go.
|
215
251
|
|
216
|
-
The count of unique affected users will appear on the error group in the Raygun dashboard. If your user has an `
|
252
|
+
The count of unique affected users will appear on the error group in the Raygun dashboard. If your user has an `Email` attribute, and that email has a Gravatar associated with that address, you will also see your user's avatar.
|
217
253
|
|
218
254
|
If you wish to keep it anonymous, you could set this identifier to something like `SecureRandom.uuid` and store that in a cookie, like so:
|
219
255
|
|
data/lib/raygun.rb
CHANGED
@@ -5,17 +5,20 @@ require "socket"
|
|
5
5
|
require "rack"
|
6
6
|
require "ostruct"
|
7
7
|
|
8
|
+
begin
|
9
|
+
require "pry"
|
10
|
+
rescue LoadError
|
11
|
+
end
|
12
|
+
|
8
13
|
require "raygun/version"
|
9
14
|
require "raygun/configuration"
|
10
15
|
require "raygun/client"
|
11
16
|
require "raygun/middleware/rack_exception_interceptor"
|
12
17
|
require "raygun/testable"
|
18
|
+
require "raygun/error"
|
19
|
+
require "raygun/affected_user"
|
13
20
|
require "raygun/services/apply_whitelist_filter_to_payload"
|
14
21
|
require "raygun/railtie" if defined?(Rails)
|
15
|
-
begin
|
16
|
-
require "pry"
|
17
|
-
rescue LoadError
|
18
|
-
end
|
19
22
|
|
20
23
|
module Raygun
|
21
24
|
|
@@ -46,10 +49,10 @@ module Raygun
|
|
46
49
|
!!configuration.api_key
|
47
50
|
end
|
48
51
|
|
49
|
-
def track_exception(exception_instance, env = {}, retry_count = 1)
|
52
|
+
def track_exception(exception_instance, env = {}, user = nil, retry_count = 1)
|
50
53
|
if should_report?(exception_instance)
|
51
54
|
log("[Raygun] Tracking Exception...")
|
52
|
-
Client.new.track_exception(exception_instance, env)
|
55
|
+
Client.new.track_exception(exception_instance, env, user)
|
53
56
|
end
|
54
57
|
rescue Exception => e
|
55
58
|
if configuration.failsafe_logger
|
@@ -63,7 +66,7 @@ module Raygun
|
|
63
66
|
env[:custom_data] ||= {}
|
64
67
|
env[:custom_data].merge!(original_stacktrace: exception_instance.backtrace)
|
65
68
|
|
66
|
-
track_exception(new_exception, env, retry_count - 1)
|
69
|
+
track_exception(new_exception, env, user, retry_count - 1)
|
67
70
|
else
|
68
71
|
raise e
|
69
72
|
end
|
@@ -83,17 +86,38 @@ module Raygun
|
|
83
86
|
configuration.failsafe_logger.info(message)
|
84
87
|
end
|
85
88
|
|
89
|
+
def deprecation_warning(message)
|
90
|
+
if defined?(ActiveSupport::Deprecation)
|
91
|
+
ActiveSupport::Deprecation.warn(message)
|
92
|
+
else
|
93
|
+
puts message
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
86
97
|
private
|
87
98
|
|
88
|
-
|
89
|
-
|
99
|
+
def print_api_key_warning
|
100
|
+
$stderr.puts(NO_API_KEY_MESSAGE)
|
101
|
+
end
|
102
|
+
|
103
|
+
def should_report?(exception)
|
104
|
+
if configuration.silence_reporting
|
105
|
+
if configuration.debug
|
106
|
+
log('[Raygun] skipping reporting because Configuration.silence_reporting is enabled')
|
107
|
+
end
|
108
|
+
|
109
|
+
return false
|
90
110
|
end
|
91
111
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
112
|
+
if configuration.ignore.flatten.include?(exception.class.to_s)
|
113
|
+
if configuration.debug
|
114
|
+
log("[Raygun] skipping reporting of exception #{exception.class} because it is in the ignore list")
|
115
|
+
end
|
116
|
+
|
117
|
+
return false
|
96
118
|
end
|
97
119
|
|
120
|
+
true
|
121
|
+
end
|
98
122
|
end
|
99
123
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Raygun
|
2
|
+
class AffectedUser
|
3
|
+
|
4
|
+
DEFAULT_MAPPING = {
|
5
|
+
identifier: [ :id, :username ],
|
6
|
+
email: :email,
|
7
|
+
full_name: [ :full_name, :name ],
|
8
|
+
first_name: :first_name,
|
9
|
+
uuid: :uuid
|
10
|
+
}.freeze
|
11
|
+
SUPPORTED_ATTRIBUTES = DEFAULT_MAPPING.keys.freeze
|
12
|
+
NAME_TO_RAYGUN_NAME_MAPPING = {
|
13
|
+
identifier: :Identifier,
|
14
|
+
email: :Email,
|
15
|
+
full_name: :FullName,
|
16
|
+
first_name: :FirstName,
|
17
|
+
uuid: :UUID
|
18
|
+
}.freeze
|
19
|
+
|
20
|
+
class << self
|
21
|
+
def information_hash(user_object)
|
22
|
+
if user_object.nil? || user_object.is_a?(String)
|
23
|
+
handle_anonymous_user(user_object)
|
24
|
+
else
|
25
|
+
handle_known_user(user_object)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def handle_anonymous_user(user_object)
|
32
|
+
result = { IsAnonymous: true }
|
33
|
+
result[:Identifier] = user_object unless user_object.nil?
|
34
|
+
result
|
35
|
+
end
|
36
|
+
|
37
|
+
def handle_known_user(user_object)
|
38
|
+
SUPPORTED_ATTRIBUTES.reduce({ IsAnonymous: false }) do |result, attribute|
|
39
|
+
mapping = Raygun.configuration.affected_user_mapping
|
40
|
+
method = mapping[attribute]
|
41
|
+
|
42
|
+
value = if method.is_a? Proc
|
43
|
+
method.call(user_object)
|
44
|
+
else
|
45
|
+
attributes = Array(method)
|
46
|
+
attribute_to_use = attributes.select do |attr|
|
47
|
+
user_object.respond_to?(attr, true)
|
48
|
+
end.first
|
49
|
+
|
50
|
+
user_object.send(attribute_to_use) unless attribute_to_use == nil
|
51
|
+
end
|
52
|
+
|
53
|
+
result[NAME_TO_RAYGUN_NAME_MAPPING[attribute]] = value unless value == nil
|
54
|
+
result
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/raygun/client.rb
CHANGED
@@ -23,8 +23,8 @@ module Raygun
|
|
23
23
|
Raygun.configuration.api_key || print_api_key_warning
|
24
24
|
end
|
25
25
|
|
26
|
-
def track_exception(exception_instance, env = {})
|
27
|
-
create_entry(build_payload_hash(exception_instance, env))
|
26
|
+
def track_exception(exception_instance, env = {}, user = nil)
|
27
|
+
create_entry(build_payload_hash(exception_instance, env, user))
|
28
28
|
end
|
29
29
|
|
30
30
|
private
|
@@ -141,8 +141,14 @@ module Raygun
|
|
141
141
|
end
|
142
142
|
|
143
143
|
# see http://raygun.io/raygun-providers/rest-json-api?v=1
|
144
|
-
def build_payload_hash(exception_instance, env = {})
|
144
|
+
def build_payload_hash(exception_instance, env = {}, user = nil)
|
145
145
|
custom_data = filter_custom_data(env) || {}
|
146
|
+
exception_custom_data = if exception_instance.respond_to?(:raygun_custom_data)
|
147
|
+
exception_instance.raygun_custom_data
|
148
|
+
else
|
149
|
+
{}
|
150
|
+
end
|
151
|
+
|
146
152
|
tags = env.delete(:tags) || []
|
147
153
|
|
148
154
|
if rails_env
|
@@ -153,19 +159,31 @@ module Raygun
|
|
153
159
|
|
154
160
|
grouping_key = env.delete(:grouping_key)
|
155
161
|
|
162
|
+
configuration_custom_data = Raygun.configuration.custom_data
|
163
|
+
configured_custom_data = if configuration_custom_data.is_a?(Proc)
|
164
|
+
configuration_custom_data.call(exception_instance, env)
|
165
|
+
else
|
166
|
+
configuration_custom_data
|
167
|
+
end
|
168
|
+
|
156
169
|
error_details = {
|
157
170
|
machineName: hostname,
|
158
171
|
version: version,
|
159
172
|
client: client_details,
|
160
173
|
error: error_details(exception_instance),
|
161
|
-
userCustomData:
|
174
|
+
userCustomData: exception_custom_data.merge(custom_data).merge(configured_custom_data),
|
162
175
|
tags: Raygun.configuration.tags.concat(tags).compact.uniq,
|
163
176
|
request: request_information(env)
|
164
177
|
}
|
165
178
|
|
166
179
|
error_details.merge!(groupingKey: grouping_key) if grouping_key
|
167
180
|
|
168
|
-
|
181
|
+
user_details = if affected_user_present?(env)
|
182
|
+
user_information(env)
|
183
|
+
elsif user != nil
|
184
|
+
AffectedUser.information_hash(user)
|
185
|
+
end
|
186
|
+
error_details.merge!(user: user_details) unless user_details == nil
|
169
187
|
|
170
188
|
if Raygun.configuration.filter_payload_with_whitelist
|
171
189
|
error_details = filter_payload_with_whitelist(error_details)
|
data/lib/raygun/configuration.rb
CHANGED
@@ -11,6 +11,17 @@ module Raygun
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
def self.proc_config_option(name)
|
15
|
+
define_method(name) do |&block|
|
16
|
+
set_value(name, block) unless block == nil
|
17
|
+
read_value(name)
|
18
|
+
end
|
19
|
+
|
20
|
+
define_method("#{name}=") do |value|
|
21
|
+
set_value(name, value)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
14
25
|
# Your Raygun API Key - this can be found on your dashboard at Raygun.io
|
15
26
|
config_option :api_key
|
16
27
|
|
@@ -21,7 +32,7 @@ module Raygun
|
|
21
32
|
config_option :version
|
22
33
|
|
23
34
|
# Custom Data to send with each exception
|
24
|
-
|
35
|
+
proc_config_option :custom_data
|
25
36
|
|
26
37
|
# Tags to send with each exception
|
27
38
|
config_option :tags
|
@@ -38,21 +49,24 @@ module Raygun
|
|
38
49
|
# Which controller method should we call to find out the affected user?
|
39
50
|
config_option :affected_user_method
|
40
51
|
|
41
|
-
#
|
42
|
-
config_option :
|
52
|
+
# Mapping of methods for the affected user object - which methods should we call for user information
|
53
|
+
config_option :affected_user_mapping
|
43
54
|
|
44
55
|
# Which parameter keys should we filter out by default?
|
45
|
-
|
56
|
+
proc_config_option :filter_parameters
|
46
57
|
|
47
58
|
# Should we switch to a white listing mode for keys instead of the default blacklist?
|
48
59
|
config_option :filter_payload_with_whitelist
|
49
60
|
|
50
61
|
# If :filter_payload_with_whitelist is true, which keys should we whitelist?
|
51
|
-
|
62
|
+
proc_config_option :whitelist_payload_shape
|
52
63
|
|
53
64
|
# Hash of proxy settings - :address, :port (defaults to 80), :username and :password (both default to nil)
|
54
65
|
config_option :proxy_settings
|
55
66
|
|
67
|
+
# Set this to true to have raygun4ruby log the reason why it skips reporting an exception
|
68
|
+
config_option :debug
|
69
|
+
|
56
70
|
# Exception classes to ignore by default
|
57
71
|
IGNORE_DEFAULT = ['ActiveRecord::RecordNotFound',
|
58
72
|
'ActionController::RoutingError',
|
@@ -96,11 +110,12 @@ module Raygun
|
|
96
110
|
tags: [],
|
97
111
|
enable_reporting: true,
|
98
112
|
affected_user_method: :current_user,
|
99
|
-
|
113
|
+
affected_user_mapping: AffectedUser::DEFAULT_MAPPING,
|
100
114
|
filter_parameters: DEFAULT_FILTER_PARAMETERS,
|
101
115
|
filter_payload_with_whitelist: false,
|
102
116
|
whitelist_payload_shape: DEFAULT_WHITELIST_PAYLOAD_SHAPE,
|
103
|
-
proxy_settings: {}
|
117
|
+
proxy_settings: {},
|
118
|
+
debug: false
|
104
119
|
})
|
105
120
|
end
|
106
121
|
|
@@ -120,14 +135,9 @@ module Raygun
|
|
120
135
|
self.enable_reporting = !value
|
121
136
|
end
|
122
137
|
|
123
|
-
def
|
124
|
-
|
125
|
-
read_value(:
|
126
|
-
end
|
127
|
-
|
128
|
-
def whitelist_payload_shape(&filter_proc)
|
129
|
-
set_value(:whitelist_payload_shape, filter_proc) if block_given?
|
130
|
-
read_value(:whitelist_payload_shape)
|
138
|
+
def affected_user_identifier_methods
|
139
|
+
Raygun.deprecation_warning("Please note: You should now user config.affected_user_method_mapping.Identifier instead of config.affected_user_identifier_methods")
|
140
|
+
read_value(:affected_user_method_mapping).Identifier
|
131
141
|
end
|
132
142
|
|
133
143
|
private
|
data/lib/raygun/error.rb
ADDED
@@ -8,24 +8,19 @@ module Raygun
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def call(env)
|
11
|
-
|
11
|
+
@app.call(env)
|
12
12
|
rescue Exception => exception
|
13
|
-
|
14
|
-
|
13
|
+
controller = env["action_controller.instance"]
|
14
|
+
affected_user_method = Raygun.configuration.affected_user_method
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
user.send(m)
|
19
|
-
else
|
20
|
-
user
|
21
|
-
end
|
16
|
+
if controller && controller.respond_to?(affected_user_method, true)
|
17
|
+
user = controller.send(affected_user_method)
|
22
18
|
|
23
|
-
|
24
|
-
end
|
19
|
+
env["raygun.affected_user"] = Raygun::AffectedUser.information_hash(user)
|
25
20
|
end
|
21
|
+
|
26
22
|
raise exception
|
27
23
|
end
|
28
|
-
|
29
24
|
end
|
30
25
|
end
|
31
26
|
end
|
data/lib/raygun/version.rb
CHANGED