airbrake 4.1.0 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +72 -0
- data/LICENSE +10 -10
- data/README.md +1 -1
- data/Rakefile +2 -7
- data/airbrake.gemspec +7 -10
- data/features/rails.feature +42 -23
- data/features/rake.feature +4 -4
- data/features/step_definitions/rails_application_steps.rb +2 -2
- data/features/support/rails.rb +6 -6
- data/lib/airbrake/capistrano.rb +4 -4
- data/lib/airbrake/configuration.rb +3 -6
- data/lib/airbrake/notice.rb +1 -1
- data/lib/airbrake/rails/controller_methods.rb +40 -15
- data/lib/airbrake/rails3_tasks.rb +1 -0
- data/lib/airbrake/sidekiq.rb +5 -6
- data/lib/airbrake/tasks/airbrake.cap +1 -1
- data/lib/airbrake/utils/params_cleaner.rb +43 -31
- data/lib/airbrake/version.rb +1 -1
- data/lib/rails/generators/airbrake/airbrake_generator.rb +32 -8
- data/resources/notice.xml +1 -1
- data/test/backtrace_test.rb +34 -0
- data/test/capistrano_test.rb +1 -1
- data/test/controller_methods_test.rb +114 -20
- data/test/notice_test.rb +14 -1
- data/test/params_cleaner_test.rb +9 -0
- metadata +58 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ded8541777d75a9ba2c09642bdd86597ea50a27b
|
4
|
+
data.tar.gz: 906c8494c89ba2eea2e11ccac54aeba0b8c2a8c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec4e5304b839b160469c95ee8fd7865854710d68bc98aca71cf7d31ddf5b998c30da88b37413ad85aeafc29a3785a13e087b7e1c0cf54bd32c09bf3034e31a7a
|
7
|
+
data.tar.gz: 3a111f2210212d4cf7df1f66030949ef623cc7a56242b636f12637330a2a81261013e9af286e5fb59a52ff172ccd04ff2055764f7c3724f1c686f60f9b4c46b3
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,74 @@
|
|
1
|
+
Version 4.2.0 - 2015-05-27 19:05:32 -0500
|
2
|
+
===============================================================================
|
3
|
+
|
4
|
+
Abdelkader Boudih (1):
|
5
|
+
Update sidekiq.rb
|
6
|
+
|
7
|
+
Adam King (1):
|
8
|
+
Fix DEFAULT_BACKTRACE_FILTERS bug that caused backtrace to not show up in certain contexts. See https://github.com/airbrake/airbrake/issues/343.
|
9
|
+
|
10
|
+
David (8):
|
11
|
+
Merge pull request #329 from grosser/grosser/gemspec
|
12
|
+
Merge pull request #335 from airbrake/fix/cucumber-suite
|
13
|
+
Merge pull request #327 from airbrake/feature/faster-params-cleaning
|
14
|
+
Merge pull request #337 from airbrake/fix/rails4-is-here
|
15
|
+
Merge pull request #326 from airbrake/fix/cast-ENV-to-Hash
|
16
|
+
Merge pull request #328 from grosser/grosser/dup
|
17
|
+
Merge pull request #334 from airbrake/fix/user-info-consumes-db-connections
|
18
|
+
Merge pull request #340 from grosser/grosser/dup
|
19
|
+
|
20
|
+
David Palm (9):
|
21
|
+
Cast CGI data to hash, as that's what the code really expects
|
22
|
+
Speed up notice generation by avoiding copying data and putting most common cases on top
|
23
|
+
Refactor #airbrake_current_user
|
24
|
+
Typo
|
25
|
+
Add comment explaining why we release connections
|
26
|
+
Comment out @wip scenarios to facilitate running parts of the suite
|
27
|
+
Add 4 to version sniffing code
|
28
|
+
PR feedback
|
29
|
+
Clone to ensure we do not mess with the provided data
|
30
|
+
|
31
|
+
Eero Raun (1):
|
32
|
+
Ignore RACK_ENV if it is empty (capistrano deploy), fixes #341.
|
33
|
+
|
34
|
+
Jonathan Worek (1):
|
35
|
+
Assumption of existence of :app role may not be valid
|
36
|
+
|
37
|
+
Marko Šiftar (3):
|
38
|
+
Merge pull request #354 from wojobucco/patch-1
|
39
|
+
Merge pull request #342 from oree/341
|
40
|
+
Merge pull request #382 from airbrake/fix/use-proper-capistrano-hook
|
41
|
+
|
42
|
+
Martin Tepper (1):
|
43
|
+
This should fix #369
|
44
|
+
|
45
|
+
grosser (3):
|
46
|
+
cleanup gemspec
|
47
|
+
fix having symbols in the environment blows up filter_parameters with blocks
|
48
|
+
If we cannot stringify then at least rescue the dup exceptions ...
|
49
|
+
|
50
|
+
halida (1):
|
51
|
+
fix rails request.fullpath behavior change in 4.1.6 -- no longer has leading /
|
52
|
+
|
53
|
+
shifi (17):
|
54
|
+
add test for filtering frozen objects
|
55
|
+
Merge branch 'Promptus-issue_369_frozen_array_issue'
|
56
|
+
update Appraisals file
|
57
|
+
Merge branch 'master' of https://github.com/halida/airbrake into halida-master
|
58
|
+
remove whitespaces
|
59
|
+
add test for airbrake_request_url
|
60
|
+
Merge branch 'halida-master'
|
61
|
+
update year in license and readme
|
62
|
+
use proper capistrano hook depending on capistrano version
|
63
|
+
set localhost IP to satisfy web console when testing in development
|
64
|
+
Merge branch 'patch-1' of https://github.com/seuros/airbrake into seuros-patch-1
|
65
|
+
fix syntax error in Sidekiq configuration
|
66
|
+
Merge branch 'seuros-patch-1'
|
67
|
+
Merge branch 'master' of https://github.com/developwithvelocity/airbrake into developwithvelocity-master
|
68
|
+
tests for backtrace default filters - gem paths
|
69
|
+
Merge branch 'developwithvelocity-master'
|
70
|
+
|
71
|
+
|
1
72
|
Version 4.1.0 - 2014-09-04 23:16:08 +0200
|
2
73
|
===============================================================================
|
3
74
|
|
@@ -1443,5 +1514,6 @@ Nick Quaranto (3):
|
|
1443
1514
|
|
1444
1515
|
|
1445
1516
|
|
1517
|
+
|
1446
1518
|
|
1447
1519
|
|
data/LICENSE
CHANGED
@@ -25,7 +25,7 @@ See https://github.com/jquery/jquery/blob/master/MIT-LICENSE.txt
|
|
25
25
|
|
26
26
|
|
27
27
|
All other components of this product are
|
28
|
-
Copyright (c) 2007-
|
28
|
+
Copyright (c) 2007-2015 Rackspace, Inc.
|
29
29
|
|
30
30
|
Subject to the terms of this notice, Rackspace, Inc. grants you a
|
31
31
|
nonexclusive, nontransferable license, without the right to
|
@@ -36,25 +36,25 @@ foregoing grant, you must provide this notice along with each copy you
|
|
36
36
|
distribute and you must not remove, alter, or obscure this notice. All
|
37
37
|
other use, reproduction, modification, distribution, or other
|
38
38
|
exploitation of these files is strictly prohibited, except as may be set
|
39
|
-
forth in a separate written license agreement between you and ERackspace,
|
39
|
+
forth in a separate written license agreement between you and ERackspace,
|
40
40
|
Inc. The terms of any such license agreement will control over this
|
41
41
|
notice. The license stated above will be automatically terminated and
|
42
42
|
revoked if you exceed its scope or violate any of the terms of this
|
43
43
|
notice.
|
44
44
|
|
45
45
|
This License does not grant permission to use the trade names,
|
46
|
-
trademarks, service marks, or product names of Rackspace, Inc.,
|
47
|
-
Airbrake, Exceptional, Airbrake.io, Exceptional.io except as
|
48
|
-
required for reasonable and customary use in describing the origin
|
49
|
-
of this file and reproducing the content of this notice. You may
|
50
|
-
not mark or brand this file with any trade name, trademarks,
|
51
|
-
servicemarks, or product names other than the original brand
|
46
|
+
trademarks, service marks, or product names of Rackspace, Inc.,
|
47
|
+
Airbrake, Exceptional, Airbrake.io, Exceptional.io except as
|
48
|
+
required for reasonable and customary use in describing the origin
|
49
|
+
of this file and reproducing the content of this notice. You may
|
50
|
+
not mark or brand this file with any trade name, trademarks,
|
51
|
+
servicemarks, or product names other than the original brand
|
52
52
|
(if any)provided by Rackspace, Inc.
|
53
53
|
|
54
|
-
Unless otherwise expressly agreed by Rackspace, Inc., in a
|
54
|
+
Unless otherwise expressly agreed by Rackspace, Inc., in a
|
55
55
|
separate written license agreement, these files are provided AS IS,
|
56
56
|
WITHOUT WARRANTY OF ANY KIND, including without any implied warranties
|
57
|
-
of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, or NON-INFRINGEMENT.
|
57
|
+
of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, or NON-INFRINGEMENT.
|
58
58
|
As a condition to your use of these files, you are solely responsible for
|
59
59
|
such use. Rackspace, Inc. will have no liability to you for direct,
|
60
60
|
indirect, consequential, incidental, special, or punitive damages or
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -1,16 +1,11 @@
|
|
1
|
-
require 'rubygems'
|
1
|
+
require 'rubygems' unless RUBY_VERSION > "1.8"
|
2
2
|
require 'bundler/setup'
|
3
3
|
require 'appraisal'
|
4
4
|
require 'rake'
|
5
5
|
require 'rake/testtask'
|
6
6
|
require 'coveralls/rake/task'
|
7
7
|
require 'rubygems/package_task'
|
8
|
-
|
9
|
-
require 'cucumber/rake/task'
|
10
|
-
rescue LoadError
|
11
|
-
$stderr.puts "Please install cucumber: `gem install cucumber`"
|
12
|
-
exit 1
|
13
|
-
end
|
8
|
+
require 'cucumber/rake/task'
|
14
9
|
require './lib/airbrake/version'
|
15
10
|
|
16
11
|
Coveralls::RakeTask.new
|
data/airbrake.gemspec
CHANGED
@@ -1,14 +1,11 @@
|
|
1
|
-
|
2
|
-
$:.push File.expand_path("../lib", __FILE__)
|
3
|
-
require "airbrake/version"
|
1
|
+
require "./lib/airbrake/version"
|
4
2
|
|
5
3
|
Gem::Specification.new do |s|
|
6
|
-
s.name =
|
4
|
+
s.name = "airbrake"
|
7
5
|
s.version = Airbrake::VERSION.dup
|
8
|
-
s.summary =
|
9
|
-
s.license =
|
6
|
+
s.summary = "Send your application errors to our hosted service and reclaim your inbox."
|
7
|
+
s.license = "MIT"
|
10
8
|
|
11
|
-
s.require_paths = ["lib"]
|
12
9
|
s.executables << "airbrake"
|
13
10
|
s.files = Dir["{generators/**/*,lib/**/*,rails/**/*,resources/*,script/*}"] +
|
14
11
|
%w(airbrake.gemspec CHANGELOG Gemfile Guardfile INSTALL LICENSE Rakefile README_FOR_HEROKU_ADDON.md README.md TESTED_AGAINST install.rb)
|
@@ -35,10 +32,10 @@ Gem::Specification.new do |s|
|
|
35
32
|
s.add_development_dependency("pry")
|
36
33
|
s.add_development_dependency("coveralls")
|
37
34
|
s.add_development_dependency("minitest", ["~> 4.0"])
|
35
|
+
s.add_development_dependency("test-unit")
|
36
|
+
|
38
37
|
|
39
38
|
s.authors = ["Airbrake"]
|
40
|
-
s.email =
|
39
|
+
s.email = "support@airbrake.io"
|
41
40
|
s.homepage = "http://www.airbrake.io"
|
42
|
-
|
43
|
-
s.platform = Gem::Platform::RUBY
|
44
41
|
end
|
data/features/rails.feature
CHANGED
@@ -81,30 +81,30 @@ Feature: Install the Gem in a Rails application
|
|
81
81
|
And I run `rails generate airbrake -k myapikey`
|
82
82
|
Then "config/deploy.rb" should not contain "capistrano"
|
83
83
|
|
84
|
-
@wip
|
85
|
-
Scenario: Support the Heroku addon in the generator
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
84
|
+
# @wip
|
85
|
+
# Scenario: Support the Heroku addon in the generator
|
86
|
+
# When I configure the Airbrake shim
|
87
|
+
# And I run `rails generate airbrake -k myapikey -t`
|
88
|
+
# And I configure the Heroku shim with "myapikey"
|
89
|
+
# And I run `rails generate airbrake --heroku`
|
90
|
+
# Then I should receive a Airbrake notification
|
91
|
+
# And I should see the Rails version
|
92
|
+
# And my Airbrake configuration should contain the following line:
|
93
|
+
# """
|
94
|
+
# config.api_key = 'myapikey'
|
95
|
+
# """
|
96
96
|
|
97
|
-
@wip
|
98
|
-
Scenario: Support the --app option for the Heroku addon in the generator
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
97
|
+
# @wip
|
98
|
+
# Scenario: Support the --app option for the Heroku addon in the generator
|
99
|
+
# When I configure the Airbrake shim
|
100
|
+
# And I configure the Heroku shim with "myapikey" and multiple app support
|
101
|
+
# And I run `rails generate airbrake --heroku -a myapp -t`
|
102
|
+
# Then I should receive a Airbrake notification
|
103
|
+
# And I should see the Rails version
|
104
|
+
# And my Airbrake configuration should contain the following line:
|
105
|
+
# """
|
106
|
+
# config.api_key = 'myapikey'
|
107
|
+
# """
|
108
108
|
|
109
109
|
Scenario: Filtering parameters in a controller
|
110
110
|
When I configure the Airbrake shim
|
@@ -165,6 +165,25 @@ Feature: Install the Gem in a Rails application
|
|
165
165
|
Then I should receive a Airbrake notification
|
166
166
|
And the Airbrake notification should not contain any of the sensitive Rack variables
|
167
167
|
|
168
|
+
Scenario: Filtering vs symbols
|
169
|
+
When I configure the Airbrake shim
|
170
|
+
And I run `rails generate airbrake -k myapikey -t`
|
171
|
+
When I configure the notifier to use the following configuration lines:
|
172
|
+
"""
|
173
|
+
config.api_key = "myapikey"
|
174
|
+
config.logger = Logger.new STDOUT
|
175
|
+
"""
|
176
|
+
And I configure the application to filter parameter "block"
|
177
|
+
And I define a response for "TestController#index":
|
178
|
+
"""
|
179
|
+
request.env["foo"] = {:foo => "bar"}
|
180
|
+
raise RuntimeError, "some message"
|
181
|
+
"""
|
182
|
+
And I route "/test/index" to "test#index"
|
183
|
+
And I perform a request to "http://example.com:123/test/index" in the "production" environment
|
184
|
+
Then I should receive a Airbrake notification
|
185
|
+
And the Airbrake notification should contain "some message"
|
186
|
+
|
168
187
|
Scenario: Notify airbrake within the controller
|
169
188
|
When I configure the Airbrake shim
|
170
189
|
And I run `rails generate airbrake -k myapikey -t`
|
data/features/rake.feature
CHANGED
@@ -27,7 +27,7 @@ Feature: Use the Gem to catch errors in a Rake application
|
|
27
27
|
When I run rake with airbrake autodetect not from terminal
|
28
28
|
Then Airbrake should catch the exception
|
29
29
|
|
30
|
-
@wip
|
31
|
-
Scenario: Airbrake should also send the command name
|
32
|
-
|
33
|
-
|
30
|
+
# @wip
|
31
|
+
# Scenario: Airbrake should also send the command name
|
32
|
+
# When I run `rake airbrake_autodetect_not_from_terminal`
|
33
|
+
# Then command "airbrake_autodetect_not_from_terminal" should be reported
|
@@ -184,8 +184,8 @@ When /^I configure the application to filter parameter "([^\"]*)"$/ do |paramete
|
|
184
184
|
application_definition_line = application_lines.detect { |line| line =~ /Application/ }
|
185
185
|
application_definition_line_index = application_lines.index(application_definition_line)
|
186
186
|
|
187
|
-
|
188
|
-
|
187
|
+
parameter = (parameter == "block" ? "lambda { |x,y| x }" : parameter.inspect)
|
188
|
+
application_lines.insert(application_definition_line_index + 1, " config.filter_parameters += [#{parameter}]")
|
189
189
|
|
190
190
|
File.open(application_filename, "w") do |file|
|
191
191
|
file.puts application_lines.join("\n")
|
data/features/support/rails.rb
CHANGED
@@ -24,8 +24,8 @@ module RailsHelpers
|
|
24
24
|
controller_filename = File.join(rails_root, 'app', 'controllers', "application_controller.rb")
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
rails_version =~
|
27
|
+
def rails_3_or_4?
|
28
|
+
rails_version =~ /\A[34]/
|
29
29
|
end
|
30
30
|
|
31
31
|
def rails_root
|
@@ -33,7 +33,7 @@ module RailsHelpers
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def rails_uses_rack?
|
36
|
-
|
36
|
+
rails_3_or_4? || rails_version =~ /^2\.3/
|
37
37
|
end
|
38
38
|
|
39
39
|
def rails_version
|
@@ -58,15 +58,15 @@ module RailsHelpers
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def rails_manages_gems?
|
61
|
-
rails_version =~
|
61
|
+
rails_version =~ /\A2\.[123]/
|
62
62
|
end
|
63
63
|
|
64
64
|
def rails_supports_initializers?
|
65
|
-
|
65
|
+
rails_3_or_4? || rails_version =~ /\A2\./
|
66
66
|
end
|
67
67
|
|
68
68
|
def rails_finds_generators_in_gems?
|
69
|
-
|
69
|
+
rails_3_or_4? || rails_version =~ /\A2\./
|
70
70
|
end
|
71
71
|
|
72
72
|
def version_string
|
data/lib/airbrake/capistrano.rb
CHANGED
@@ -71,13 +71,13 @@ module Airbrake
|
|
71
71
|
- Run remotely so we use remote API keys, environment, etc.
|
72
72
|
DESC
|
73
73
|
task :deploy, :except => { :no_release => true } do
|
74
|
-
rack_env = fetch(:rack_env,
|
75
|
-
rails_env = fetch(:rails_env,
|
76
|
-
airbrake_env = fetch(:airbrake_env, rack_env || rails_env)
|
74
|
+
rack_env = fetch(:rack_env, nil)
|
75
|
+
rails_env = fetch(:rails_env, nil)
|
76
|
+
airbrake_env = fetch(:airbrake_env, rack_env || rails_env || "production")
|
77
77
|
local_user = ENV['USER'] || ENV['USERNAME']
|
78
78
|
executable = RUBY_PLATFORM.downcase.include?('mswin') ? fetch(:rake, 'rake.bat') : fetch(:rake, 'bundle exec rake ')
|
79
79
|
directory = configuration.release_path
|
80
|
-
notify_command = "cd #{directory}; #{executable} RACK_ENV
|
80
|
+
notify_command = "cd #{directory}; #{executable} #{'RACK_ENV='+rack_env if rack_env} #{'RAILS_ENV='+rails_env if rails_env} airbrake:deploy TO=#{airbrake_env} REVISION=#{current_revision} REPO=#{repository} USER=#{Airbrake::Capistrano::shellescape(local_user)}"
|
81
81
|
notify_command << " DRY_RUN=true" if dry_run
|
82
82
|
notify_command << " API_KEY=#{ENV['API_KEY']}" if ENV['API_KEY']
|
83
83
|
logger.info "Notifying Airbrake of Deploy (#{notify_command})"
|
@@ -130,11 +130,8 @@ module Airbrake
|
|
130
130
|
},
|
131
131
|
lambda { |line| line.gsub(/^\.\//, "") },
|
132
132
|
lambda { |line|
|
133
|
-
if defined?(Gem)
|
134
|
-
|
135
|
-
l.gsub(/#{path}/, "[GEM_ROOT]")
|
136
|
-
end
|
137
|
-
end
|
133
|
+
Gem.path.each{ |path| line.sub!(/#{path}/, "[GEM_ROOT]") unless path.to_s.strip.empty? } if defined?(Gem)
|
134
|
+
line
|
138
135
|
},
|
139
136
|
lambda { |line| line if line !~ %r{lib/airbrake} }
|
140
137
|
].freeze
|
@@ -259,7 +256,7 @@ module Airbrake
|
|
259
256
|
# Determines if the notifier will send notices.
|
260
257
|
# @return [Boolean] Returns +false+ if in a development environment, +true+ otherwise.
|
261
258
|
def public?
|
262
|
-
!development_environments.include?(environment_name)
|
259
|
+
@public ||= !development_environments.include?(environment_name)
|
263
260
|
end
|
264
261
|
|
265
262
|
def port
|
data/lib/airbrake/notice.rb
CHANGED
@@ -116,7 +116,7 @@ module Airbrake
|
|
116
116
|
@action = args[:action] || parameters['action']
|
117
117
|
|
118
118
|
@environment_name = args[:environment_name]
|
119
|
-
@cgi_data = (args[:cgi_data] && args[:cgi_data].dup) || args[:rack_env] || {}
|
119
|
+
@cgi_data = (args[:cgi_data].respond_to?(:to_hash) && args[:cgi_data].to_hash.dup) || args[:rack_env] || {}
|
120
120
|
@backtrace = Backtrace.parse(exception_attribute(:backtrace, caller), :filters => @backtrace_filters)
|
121
121
|
@error_class = exception_attribute(:error_class) {|exception| exception.class.name }
|
122
122
|
@error_message = exception_attribute(:error_message, 'Notification') do |exception|
|
@@ -10,7 +10,7 @@ module Airbrake
|
|
10
10
|
:action => params[:action],
|
11
11
|
:url => airbrake_request_url,
|
12
12
|
:cgi_data => airbrake_filter_if_filtering(request.env),
|
13
|
-
:user => airbrake_current_user
|
13
|
+
:user => airbrake_current_user || {}
|
14
14
|
}
|
15
15
|
end
|
16
16
|
|
@@ -44,20 +44,31 @@ module Airbrake
|
|
44
44
|
|
45
45
|
if respond_to?(:filter_parameters) # Rails 2
|
46
46
|
filter_parameters(hash)
|
47
|
-
elsif
|
47
|
+
elsif rails_3_or_4?
|
48
48
|
filter_rails3_parameters(hash)
|
49
49
|
else
|
50
50
|
hash
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
-
def
|
55
|
-
defined?(::Rails.version) && ::Rails.version =~ /\
|
54
|
+
def rails_3_or_4?
|
55
|
+
defined?(::Rails.version) && ::Rails.version =~ /\A[34]/
|
56
56
|
end
|
57
57
|
|
58
58
|
def filter_rails3_parameters(hash)
|
59
59
|
ActionDispatch::Http::ParameterFilter.new(
|
60
|
-
::Rails.application.config.filter_parameters
|
60
|
+
::Rails.application.config.filter_parameters
|
61
|
+
).filter(recursive_stringify_keys(hash))
|
62
|
+
end
|
63
|
+
|
64
|
+
def recursive_stringify_keys(hash)
|
65
|
+
hash = hash.stringify_keys
|
66
|
+
hash.each do |k, v|
|
67
|
+
if v.is_a?(Hash)
|
68
|
+
hash[k] = v.respond_to?(:stringify_keys) ? recursive_stringify_keys(v) : nil # Rack::Session::Abstract::SessionHash has a stringify_keys method we should not call
|
69
|
+
end
|
70
|
+
end
|
71
|
+
hash
|
61
72
|
end
|
62
73
|
|
63
74
|
def airbrake_session_data
|
@@ -79,20 +90,34 @@ module Airbrake
|
|
79
90
|
url << ":#{request.port}"
|
80
91
|
end
|
81
92
|
|
82
|
-
url
|
83
|
-
url
|
93
|
+
URI.join(url, request.fullpath).to_s
|
84
94
|
end
|
85
95
|
|
86
96
|
def airbrake_current_user
|
87
|
-
user =
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
97
|
+
user = fetch_user
|
98
|
+
|
99
|
+
if user
|
100
|
+
Airbrake.configuration.user_attributes.map(&:to_sym).inject({}) do |hsh, attr|
|
101
|
+
hsh[attr.to_sym] = user.send(attr) if user.respond_to? attr
|
102
|
+
hsh
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def fetch_user
|
108
|
+
if defined?(current_user)
|
109
|
+
current_user
|
110
|
+
elsif defined?(current_member)
|
111
|
+
current_member
|
112
|
+
else
|
113
|
+
nil
|
114
|
+
end
|
115
|
+
ensure
|
116
|
+
# The Airbrake middleware is first in the chain, before ActiveRecord::ConnectionAdapters::ConnectionManagement
|
117
|
+
# kicks in to do its thing. This can cause the connection pool to run out of connections.
|
118
|
+
if defined?(ActiveRecord) && ActiveRecord::Base.respond_to?(:connection_pool)
|
119
|
+
ActiveRecord::Base.connection_pool.release_connection
|
92
120
|
end
|
93
|
-
h
|
94
|
-
rescue NoMethodError, NameError
|
95
|
-
{}
|
96
121
|
end
|
97
122
|
end
|
98
123
|
end
|