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 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
- ipAddress: env["REMOTE_ADDR"],
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.to_s.start_with?("HTTP_")
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
 
@@ -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 = IGNORE_DEFAULT
37
- @custom_data = {}
38
- @silence_reporting = false
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
@@ -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 ||= Rails.logger
19
- Raygun.configuration.silence_reporting ||= !Rails.env.production?
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
@@ -1,3 +1,3 @@
1
1
  module Raygun
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.9"
3
3
  end
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.6
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: 2013-09-03 00:00:00.000000000 Z
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: 1.8.24
180
+ rubygems_version: 2.0.3
200
181
  signing_key:
201
- specification_version: 3
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