raygun4ruby 0.0.6 → 0.0.9
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 +7 -0
- data/README.md +47 -0
- data/lib/raygun/client.rb +27 -7
- data/lib/raygun/configuration.rb +11 -3
- data/lib/raygun/middleware/rack_exception_interceptor.rb +18 -0
- data/lib/raygun/middleware/rails_insert_affected_user.rb +32 -0
- data/lib/raygun/railtie.rb +7 -3
- data/lib/raygun/version.rb +1 -1
- data/lib/raygun.rb +2 -2
- metadata +21 -40
- data/lib/raygun/rack_exception_interceptor.rb +0 -16
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 364f723004d0b0a022bb82d74551e274466cd296
|
4
|
+
data.tar.gz: 2a403d1dc79b9ea1c580e4f232284769894a3eaf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a7597177c7877ca08356ded80ba631e437b173b1e3fa9409458e564c4b5174a0aa5b35156d4e8dabe7d5aefc991e790b4c4da23553248f6c52dc3af6483a296b
|
7
|
+
data.tar.gz: 57f578a39ae59d7ef0dc1c275b945b86b4b23e26bf51f5cb41a60ba30eac727dac4956e38f68b3aa255669c578a1dba8be2864c5930fb6bb462311faa9ea68f8
|
data/README.md
CHANGED
@@ -62,6 +62,19 @@ end
|
|
62
62
|
|
63
63
|
(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))
|
64
64
|
|
65
|
+
###Custom User Data
|
66
|
+
Custom data can be added to `track_exception` by passing a custom_data key in the second parameter hash.
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
|
70
|
+
begin
|
71
|
+
# more lovely code
|
72
|
+
rescue Exception => e
|
73
|
+
Raygun.track_exception(e, custom_data: {my: 'custom data', goes: 'here'})
|
74
|
+
end
|
75
|
+
|
76
|
+
```
|
77
|
+
|
65
78
|
###Ignoring Some Errors
|
66
79
|
|
67
80
|
You can ignore certain types of Exception using the `ignore` option in the setup block, like so:
|
@@ -75,6 +88,40 @@ end
|
|
75
88
|
|
76
89
|
You can also check which [exceptions are ignored by default](https://github.com/MindscapeHQ/raygun4ruby/blob/master/lib/raygun/configuration.rb#L26)
|
77
90
|
|
91
|
+
###Affected User Tracking
|
92
|
+
|
93
|
+
Raygun can now track how many users have been affected by an error.
|
94
|
+
|
95
|
+
By default, Raygun looks for a method called `current_user` on your controller, and calls either `email`, `username` or `id` on the object returned by that method.
|
96
|
+
|
97
|
+
You can customize those method names in your configuration block:
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
Raygun.setup do |config|
|
101
|
+
config.api_key = "MY_SWEET_API_KEY"
|
102
|
+
config.affected_user_method = :my_current_user # `current_user` by default
|
103
|
+
config.affected_user_identifier_methods << :login # `[ :email, :username, :id ]` by default - will use the first that works
|
104
|
+
end
|
105
|
+
```
|
106
|
+
|
107
|
+
If you're using Rails, most authentication systems will have this method set and you should be good to go.
|
108
|
+
|
109
|
+
The count of unique affected users will appear on the error group in the Raygun dashboard. If your user has an `email` method, and that email has a Gravatars associated, you will also see your user's avatar.
|
110
|
+
|
111
|
+
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:
|
112
|
+
|
113
|
+
```ruby
|
114
|
+
class ApplicationController < ActionController::Base
|
115
|
+
|
116
|
+
def raygun_user
|
117
|
+
cookies.permanent[:raygun_user_identifier] ||= SecureRandom.uuid
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
```
|
122
|
+
|
123
|
+
(Remember to set `affected_user_method` to `:raygun_user` in your config block...)
|
124
|
+
|
78
125
|
###Resque Error Tracking
|
79
126
|
|
80
127
|
Raygun4Ruby also includes a Resque failure backend. You should include it inside your Resque initializer (usually something like `config/initializers/load_resque.rb`)
|
data/lib/raygun/client.rb
CHANGED
@@ -58,6 +58,14 @@ module Raygun
|
|
58
58
|
Raygun.configuration.version
|
59
59
|
end
|
60
60
|
|
61
|
+
def user_information(env)
|
62
|
+
env["raygun.affected_user"]
|
63
|
+
end
|
64
|
+
|
65
|
+
def affected_user_present?(env)
|
66
|
+
!!env["raygun.affected_user"]
|
67
|
+
end
|
68
|
+
|
61
69
|
def request_information(env)
|
62
70
|
return {} if env.nil? || env.empty?
|
63
71
|
|
@@ -65,7 +73,7 @@ module Raygun
|
|
65
73
|
hostName: env["SERVER_NAME"],
|
66
74
|
url: env["PATH_INFO"],
|
67
75
|
httpMethod: env["REQUEST_METHOD"],
|
68
|
-
|
76
|
+
iPAddress: env["REMOTE_ADDR"],
|
69
77
|
queryString: Rack::Utils.parse_nested_query(env["QUERY_STRING"]),
|
70
78
|
form: form_data(env),
|
71
79
|
headers: headers(env),
|
@@ -74,11 +82,19 @@ module Raygun
|
|
74
82
|
end
|
75
83
|
|
76
84
|
def headers(rack_env)
|
77
|
-
rack_env.select do |k, v|
|
78
|
-
k
|
85
|
+
rack_env.select { |k, v| k.to_s.start_with?("HTTP_") }.inject({}) do |hsh, (k, v)|
|
86
|
+
hsh[normalize_raygun_header_key(k)] = v
|
87
|
+
hsh
|
79
88
|
end
|
80
89
|
end
|
81
90
|
|
91
|
+
def normalize_raygun_header_key(key)
|
92
|
+
key.sub(/^HTTP_/, '')
|
93
|
+
.sub(/_/, ' ')
|
94
|
+
.split.map(&:capitalize).join(' ')
|
95
|
+
.sub(/ /, '-')
|
96
|
+
end
|
97
|
+
|
82
98
|
def form_data(rack_env)
|
83
99
|
request = Rack::Request.new(rack_env)
|
84
100
|
|
@@ -91,16 +107,20 @@ module Raygun
|
|
91
107
|
def build_payload_hash(exception_instance, env = {})
|
92
108
|
custom_data = env.delete(:custom_data) || {}
|
93
109
|
|
94
|
-
{
|
95
|
-
occurredOn: Time.now.utc.iso8601,
|
96
|
-
details: {
|
110
|
+
error_details = {
|
97
111
|
machineName: hostname,
|
98
112
|
version: version,
|
99
113
|
client: client_details,
|
100
114
|
error: error_details(exception_instance),
|
101
115
|
userCustomData: Raygun.configuration.custom_data.merge(custom_data),
|
102
116
|
request: request_information(env)
|
103
|
-
|
117
|
+
}
|
118
|
+
|
119
|
+
error_details.merge!(user: user_information(env)) if affected_user_present?(env)
|
120
|
+
|
121
|
+
{
|
122
|
+
occurredOn: Time.now.utc.iso8601,
|
123
|
+
details: error_details
|
104
124
|
}
|
105
125
|
end
|
106
126
|
|
data/lib/raygun/configuration.rb
CHANGED
@@ -22,6 +22,12 @@ module Raygun
|
|
22
22
|
# Failsafe logger (for exceptions that happen when we're attempting to report exceptions)
|
23
23
|
attr_accessor :failsafe_logger
|
24
24
|
|
25
|
+
# Which controller method should we call to find out the affected user?
|
26
|
+
attr_accessor :affected_user_method
|
27
|
+
|
28
|
+
# Which methods should we try on the affected user object in order to get an identifier
|
29
|
+
attr_accessor :affected_user_identifier_methods
|
30
|
+
|
25
31
|
# Exception classes to ignore by default
|
26
32
|
IGNORE_DEFAULT = ['ActiveRecord::RecordNotFound',
|
27
33
|
'ActionController::RoutingError',
|
@@ -33,9 +39,11 @@ module Raygun
|
|
33
39
|
|
34
40
|
def initialize
|
35
41
|
# set default attribute values
|
36
|
-
@ignore
|
37
|
-
@custom_data
|
38
|
-
@silence_reporting
|
42
|
+
@ignore = IGNORE_DEFAULT
|
43
|
+
@custom_data = {}
|
44
|
+
@silence_reporting = nil
|
45
|
+
@affected_user_method = :current_user
|
46
|
+
@affected_user_identifier_methods = [ :email, :username, :id ]
|
39
47
|
end
|
40
48
|
|
41
49
|
def [](key)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Raygun
|
2
|
+
module Middleware
|
3
|
+
class RackExceptionInterceptor
|
4
|
+
|
5
|
+
def initialize(app)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
response = @app.call(env)
|
11
|
+
rescue Exception => exception
|
12
|
+
Raygun.track_exception(exception, env)
|
13
|
+
raise exception
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Raygun
|
2
|
+
module Middleware
|
3
|
+
# Adapted from the Rollbar approach https://github.com/rollbar/rollbar-gem/blob/master/lib/rollbar/middleware/rails/rollbar_request_store.rb
|
4
|
+
class RailsInsertAffectedUser
|
5
|
+
|
6
|
+
def initialize(app)
|
7
|
+
@app = app
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
response = @app.call(env)
|
12
|
+
rescue Exception => exception
|
13
|
+
if (controller = env["action_controller.instance"]) && controller.respond_to?(Raygun.configuration.affected_user_method)
|
14
|
+
user = controller.send(Raygun.configuration.affected_user_method)
|
15
|
+
|
16
|
+
if user
|
17
|
+
identifier = if (m = Raygun.configuration.affected_user_identifier_methods.detect { |m| user.respond_to?(m) })
|
18
|
+
user.send(m)
|
19
|
+
else
|
20
|
+
user
|
21
|
+
end
|
22
|
+
|
23
|
+
env["raygun.affected_user"] = { :identifier => identifier }
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
raise exception
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/raygun/railtie.rb
CHANGED
@@ -11,12 +11,16 @@ class Raygun::Railtie < Rails::Railtie
|
|
11
11
|
"ActionDispatch::ShowExceptions"
|
12
12
|
end
|
13
13
|
|
14
|
-
app.config.middleware.insert_after middleware, "Raygun::RackExceptionInterceptor"
|
14
|
+
app.config.middleware.insert_after middleware, "Raygun::Middleware::RackExceptionInterceptor"
|
15
|
+
|
16
|
+
# Affected User tracking
|
17
|
+
require "raygun/middleware/rails_insert_affected_user"
|
18
|
+
app.config.middleware.insert_after Raygun::Middleware::RackExceptionInterceptor, "Raygun::Middleware::RailsInsertAffectedUser"
|
15
19
|
end
|
16
20
|
|
17
21
|
config.to_prepare do
|
18
|
-
Raygun.configuration.logger
|
19
|
-
Raygun.configuration.silence_reporting
|
22
|
+
Raygun.configuration.logger ||= Rails.logger
|
23
|
+
Raygun.configuration.silence_reporting = !Rails.env.production? if Raygun.configuration.silence_reporting.nil?
|
20
24
|
end
|
21
25
|
|
22
26
|
rake_tasks do
|
data/lib/raygun/version.rb
CHANGED
data/lib/raygun.rb
CHANGED
@@ -10,7 +10,7 @@ require "rack"
|
|
10
10
|
require "raygun/version"
|
11
11
|
require "raygun/configuration"
|
12
12
|
require "raygun/client"
|
13
|
-
require "raygun/rack_exception_interceptor"
|
13
|
+
require "raygun/middleware/rack_exception_interceptor"
|
14
14
|
require "raygun/testable"
|
15
15
|
require "raygun/railtie" if defined?(Rails)
|
16
16
|
|
@@ -69,7 +69,7 @@ module Raygun
|
|
69
69
|
|
70
70
|
def should_report?(exception)
|
71
71
|
return false if configuration.silence_reporting
|
72
|
-
return false if configuration.ignore.include?(exception.class.to_s)
|
72
|
+
return false if configuration.ignore.flatten.include?(exception.class.to_s)
|
73
73
|
true
|
74
74
|
end
|
75
75
|
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: raygun4ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.9
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Mindscape
|
@@ -10,12 +9,11 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2014-01-21 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: httparty
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
18
|
- - ~>
|
21
19
|
- !ruby/object:Gem::Version
|
@@ -23,7 +21,6 @@ dependencies:
|
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
25
|
- - ~>
|
29
26
|
- !ruby/object:Gem::Version
|
@@ -31,71 +28,62 @@ dependencies:
|
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: json
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
|
-
- -
|
32
|
+
- - '>='
|
37
33
|
- !ruby/object:Gem::Version
|
38
34
|
version: '0'
|
39
35
|
type: :runtime
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
|
-
- -
|
39
|
+
- - '>='
|
45
40
|
- !ruby/object:Gem::Version
|
46
41
|
version: '0'
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
43
|
name: rack
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
45
|
requirements:
|
52
|
-
- -
|
46
|
+
- - '>='
|
53
47
|
- !ruby/object:Gem::Version
|
54
48
|
version: '0'
|
55
49
|
type: :runtime
|
56
50
|
prerelease: false
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
|
-
- -
|
53
|
+
- - '>='
|
61
54
|
- !ruby/object:Gem::Version
|
62
55
|
version: '0'
|
63
56
|
- !ruby/object:Gem::Dependency
|
64
57
|
name: bundler
|
65
58
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
59
|
requirements:
|
68
|
-
- -
|
60
|
+
- - '>='
|
69
61
|
- !ruby/object:Gem::Version
|
70
62
|
version: '1.1'
|
71
63
|
type: :development
|
72
64
|
prerelease: false
|
73
65
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
66
|
requirements:
|
76
|
-
- -
|
67
|
+
- - '>='
|
77
68
|
- !ruby/object:Gem::Version
|
78
69
|
version: '1.1'
|
79
70
|
- !ruby/object:Gem::Dependency
|
80
71
|
name: rake
|
81
72
|
requirement: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
73
|
requirements:
|
84
|
-
- -
|
74
|
+
- - '>='
|
85
75
|
- !ruby/object:Gem::Version
|
86
76
|
version: '0'
|
87
77
|
type: :development
|
88
78
|
prerelease: false
|
89
79
|
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
80
|
requirements:
|
92
|
-
- -
|
81
|
+
- - '>='
|
93
82
|
- !ruby/object:Gem::Version
|
94
83
|
version: '0'
|
95
84
|
- !ruby/object:Gem::Dependency
|
96
85
|
name: fakeweb
|
97
86
|
requirement: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
87
|
requirements:
|
100
88
|
- - ~>
|
101
89
|
- !ruby/object:Gem::Version
|
@@ -103,7 +91,6 @@ dependencies:
|
|
103
91
|
type: :development
|
104
92
|
prerelease: false
|
105
93
|
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
94
|
requirements:
|
108
95
|
- - ~>
|
109
96
|
- !ruby/object:Gem::Version
|
@@ -111,23 +98,20 @@ dependencies:
|
|
111
98
|
- !ruby/object:Gem::Dependency
|
112
99
|
name: timecop
|
113
100
|
requirement: !ruby/object:Gem::Requirement
|
114
|
-
none: false
|
115
101
|
requirements:
|
116
|
-
- -
|
102
|
+
- - '>='
|
117
103
|
- !ruby/object:Gem::Version
|
118
104
|
version: '0'
|
119
105
|
type: :development
|
120
106
|
prerelease: false
|
121
107
|
version_requirements: !ruby/object:Gem::Requirement
|
122
|
-
none: false
|
123
108
|
requirements:
|
124
|
-
- -
|
109
|
+
- - '>='
|
125
110
|
- !ruby/object:Gem::Version
|
126
111
|
version: '0'
|
127
112
|
- !ruby/object:Gem::Dependency
|
128
113
|
name: minitest
|
129
114
|
requirement: !ruby/object:Gem::Requirement
|
130
|
-
none: false
|
131
115
|
requirements:
|
132
116
|
- - ~>
|
133
117
|
- !ruby/object:Gem::Version
|
@@ -135,7 +119,6 @@ dependencies:
|
|
135
119
|
type: :development
|
136
120
|
prerelease: false
|
137
121
|
version_requirements: !ruby/object:Gem::Requirement
|
138
|
-
none: false
|
139
122
|
requirements:
|
140
123
|
- - ~>
|
141
124
|
- !ruby/object:Gem::Version
|
@@ -143,17 +126,15 @@ dependencies:
|
|
143
126
|
- !ruby/object:Gem::Dependency
|
144
127
|
name: resque
|
145
128
|
requirement: !ruby/object:Gem::Requirement
|
146
|
-
none: false
|
147
129
|
requirements:
|
148
|
-
- -
|
130
|
+
- - '>='
|
149
131
|
- !ruby/object:Gem::Version
|
150
132
|
version: '0'
|
151
133
|
type: :development
|
152
134
|
prerelease: false
|
153
135
|
version_requirements: !ruby/object:Gem::Requirement
|
154
|
-
none: false
|
155
136
|
requirements:
|
156
|
-
- -
|
137
|
+
- - '>='
|
157
138
|
- !ruby/object:Gem::Version
|
158
139
|
version: '0'
|
159
140
|
description: Ruby Adapter for Raygun.io
|
@@ -166,7 +147,8 @@ files:
|
|
166
147
|
- lib/raygun.rb
|
167
148
|
- lib/raygun/client.rb
|
168
149
|
- lib/raygun/configuration.rb
|
169
|
-
- lib/raygun/rack_exception_interceptor.rb
|
150
|
+
- lib/raygun/middleware/rack_exception_interceptor.rb
|
151
|
+
- lib/raygun/middleware/rails_insert_affected_user.rb
|
170
152
|
- lib/raygun/railtie.rb
|
171
153
|
- lib/raygun/version.rb
|
172
154
|
- lib/raygun4ruby.rb
|
@@ -178,27 +160,26 @@ files:
|
|
178
160
|
homepage: http://raygun.io
|
179
161
|
licenses:
|
180
162
|
- MIT
|
163
|
+
metadata: {}
|
181
164
|
post_install_message:
|
182
165
|
rdoc_options: []
|
183
166
|
require_paths:
|
184
167
|
- lib
|
185
168
|
required_ruby_version: !ruby/object:Gem::Requirement
|
186
|
-
none: false
|
187
169
|
requirements:
|
188
|
-
- -
|
170
|
+
- - '>='
|
189
171
|
- !ruby/object:Gem::Version
|
190
172
|
version: '0'
|
191
173
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
192
|
-
none: false
|
193
174
|
requirements:
|
194
|
-
- -
|
175
|
+
- - '>='
|
195
176
|
- !ruby/object:Gem::Version
|
196
177
|
version: '0'
|
197
178
|
requirements: []
|
198
179
|
rubyforge_project:
|
199
|
-
rubygems_version:
|
180
|
+
rubygems_version: 2.0.3
|
200
181
|
signing_key:
|
201
|
-
specification_version:
|
182
|
+
specification_version: 4
|
202
183
|
summary: This gem provides support for Ruby and Ruby on Rails for the Raygun.io error
|
203
184
|
reporter
|
204
185
|
test_files: []
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Raygun
|
2
|
-
class RackExceptionInterceptor
|
3
|
-
|
4
|
-
def initialize(app)
|
5
|
-
@app = app
|
6
|
-
end
|
7
|
-
|
8
|
-
def call(env)
|
9
|
-
response = @app.call(env)
|
10
|
-
rescue Exception => exception
|
11
|
-
Raygun.track_exception(exception, env)
|
12
|
-
raise exception
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
16
|
-
end
|