crashlog 1.0.0.rc1 → 1.0.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +5 -0
- data/Gemfile.lock +3 -3
- data/crashlog.gemspec +1 -1
- data/generators/crashlog/templates/initializer.rb +2 -1
- data/lib/crash_log.rb +7 -3
- data/lib/crash_log/backtrace/line.rb +11 -8
- data/lib/crash_log/configuration.rb +4 -1
- data/lib/crash_log/rack.rb +2 -4
- data/lib/crash_log/rails.rb +1 -1
- data/lib/crash_log/rails/action_controller_rescue.rb +4 -2
- data/lib/crash_log/rails/controller_methods.rb +13 -1
- data/lib/crash_log/rails/middleware/debug_exception_catcher.rb +2 -2
- data/lib/crash_log/railtie.rb +1 -1
- data/lib/crash_log/reporter.rb +1 -1
- data/lib/crash_log/version.rb +1 -1
- data/lib/rails/generators/crashlog/crashlog_generator.rb +9 -2
- data/script/integration_test +19 -7
- data/spec/crash_log/backtrace_spec.rb +10 -0
- data/spec/crash_log_spec.rb +10 -0
- data/spec/requests/rails_controller_rescue_spec.rb +6 -5
- metadata +17 -17
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -10,7 +10,7 @@ PATH
|
|
10
10
|
specs:
|
11
11
|
crashlog (1.0.0.rc1)
|
12
12
|
activesupport
|
13
|
-
crashlog-auth-hmac (~> 1.1.
|
13
|
+
crashlog-auth-hmac (~> 1.1.6)
|
14
14
|
faraday
|
15
15
|
hashr
|
16
16
|
rabl (>= 0.6.14)
|
@@ -50,7 +50,7 @@ GEM
|
|
50
50
|
arel (3.0.2)
|
51
51
|
builder (3.0.0)
|
52
52
|
chronic (0.6.7)
|
53
|
-
crashlog-auth-hmac (1.1.
|
53
|
+
crashlog-auth-hmac (1.1.6)
|
54
54
|
delorean (2.0.0)
|
55
55
|
chronic
|
56
56
|
diff-lcs (1.1.3)
|
@@ -86,7 +86,7 @@ GEM
|
|
86
86
|
multipart-post (1.1.5)
|
87
87
|
pg (0.14.0)
|
88
88
|
polyglot (0.3.3)
|
89
|
-
rabl (0.7.
|
89
|
+
rabl (0.7.2)
|
90
90
|
activesupport (>= 2.3.14)
|
91
91
|
multi_json (~> 1.0)
|
92
92
|
rack (1.4.1)
|
data/crashlog.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |gem|
|
|
18
18
|
|
19
19
|
gem.add_dependency("activesupport")
|
20
20
|
gem.add_dependency("faraday")
|
21
|
-
gem.add_dependency("crashlog-auth-hmac", '~> 1.1.
|
21
|
+
gem.add_dependency("crashlog-auth-hmac", '~> 1.1.6')
|
22
22
|
gem.add_dependency("yajl-ruby")
|
23
23
|
gem.add_dependency("rabl", '>= 0.6.14')
|
24
24
|
gem.add_dependency("uuid")
|
data/lib/crash_log.rb
CHANGED
@@ -66,7 +66,7 @@ module CrashLog
|
|
66
66
|
|
67
67
|
# Sends the notice unless it is one of the default ignored exceptions.
|
68
68
|
def notify_or_ignore(exception, context = {})
|
69
|
-
|
69
|
+
notify(exception, context = {}) unless ignored?(exception)
|
70
70
|
end
|
71
71
|
|
72
72
|
# Print a message at the top of the applciation's logs to say we're ready.
|
@@ -82,12 +82,16 @@ module CrashLog
|
|
82
82
|
|
83
83
|
# Configure the gem to send notifications, at the very least an api_key is
|
84
84
|
# required.
|
85
|
-
def configure(&block)
|
85
|
+
def configure(announce = false, &block)
|
86
86
|
if block_given?
|
87
87
|
yield(configuration)
|
88
88
|
|
89
89
|
if configuration.valid?
|
90
|
-
|
90
|
+
if announce.eql?(true)
|
91
|
+
report_for_duty!
|
92
|
+
else
|
93
|
+
info("Configuration updated")
|
94
|
+
end
|
91
95
|
elsif !configuration.invalid_keys.include?(:api_key)
|
92
96
|
error("Not configured correctly. Missing the following keys: #{configuration.invalid_keys.join(', ')}")
|
93
97
|
end
|
@@ -7,7 +7,7 @@ module CrashLog
|
|
7
7
|
INPUT_FORMAT = %r{^((?:[a-zA-Z]:)?[^:]+):(\d+)(?::in `([^']+)')?$}
|
8
8
|
|
9
9
|
# The file portion of the line (such as app/models/user.rb)
|
10
|
-
attr_reader :file
|
10
|
+
attr_reader :file, :original_file
|
11
11
|
|
12
12
|
# The line number portion of the line
|
13
13
|
attr_reader :number
|
@@ -25,9 +25,10 @@ module CrashLog
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def initialize(file, number, method)
|
28
|
-
self.file
|
29
|
-
self.
|
30
|
-
self.
|
28
|
+
self.file = file
|
29
|
+
self.original_file = file
|
30
|
+
self.number = number.to_i
|
31
|
+
self.method = method
|
31
32
|
end
|
32
33
|
|
33
34
|
# Reconstructs the line in a readable fashion
|
@@ -51,18 +52,20 @@ module CrashLog
|
|
51
52
|
end
|
52
53
|
|
53
54
|
def context_line
|
54
|
-
Backtrace::LineCache::getline(
|
55
|
+
Backtrace::LineCache::getline(original_file, number)
|
55
56
|
end
|
56
57
|
|
58
|
+
alias :line_context :context_line
|
59
|
+
|
57
60
|
def pre_context
|
58
61
|
(number-context_lines..number-1).map {|i|
|
59
|
-
Backtrace::LineCache.getline(
|
62
|
+
Backtrace::LineCache.getline(original_file, i)
|
60
63
|
}.select { |line| line }
|
61
64
|
end
|
62
65
|
|
63
66
|
def post_context
|
64
67
|
(number+1..number+context_lines).map {|i|
|
65
|
-
Backtrace::LineCache.getline(
|
68
|
+
Backtrace::LineCache.getline(original_file, i)
|
66
69
|
}.select { |line| line }
|
67
70
|
end
|
68
71
|
|
@@ -98,7 +101,7 @@ module CrashLog
|
|
98
101
|
|
99
102
|
private
|
100
103
|
|
101
|
-
attr_writer :file, :number, :method
|
104
|
+
attr_writer :file, :number, :method, :original_file
|
102
105
|
|
103
106
|
end
|
104
107
|
end
|
@@ -2,6 +2,7 @@ require 'hashr'
|
|
2
2
|
module CrashLog
|
3
3
|
class Configuration < Hashr
|
4
4
|
DEFAULT_PARAMS_FILTERS = %w(password password_confirmation).freeze
|
5
|
+
DEFAULT_USER_ATTRIBUTES = %w(id name full_name username email created_at).freeze
|
5
6
|
|
6
7
|
DEFAULT_BACKTRACE_FILTERS = [
|
7
8
|
lambda { |line|
|
@@ -125,6 +126,8 @@ module CrashLog
|
|
125
126
|
|
126
127
|
:params_filters => DEFAULT_PARAMS_FILTERS.dup,
|
127
128
|
|
129
|
+
:user_attributes => DEFAULT_USER_ATTRIBUTES.dup,
|
130
|
+
|
128
131
|
# Internal
|
129
132
|
# Do not change unless you know what this does.
|
130
133
|
:service_name => 'CrashLog',
|
@@ -171,7 +174,7 @@ module CrashLog
|
|
171
174
|
end
|
172
175
|
|
173
176
|
def ignored?(exception)
|
174
|
-
ignore.include?(error_class(exception))
|
177
|
+
ignore.include?(error_class(exception).to_s)
|
175
178
|
end
|
176
179
|
|
177
180
|
def secure?
|
data/lib/crash_log/rack.rb
CHANGED
@@ -30,14 +30,12 @@ module CrashLog
|
|
30
30
|
begin
|
31
31
|
response = @app.call(env)
|
32
32
|
rescue Exception => exception
|
33
|
-
|
34
|
-
env['crash_log.error_id'] = error_id
|
33
|
+
CrashLog.notify(exception, :rack_env => env)
|
35
34
|
raise
|
36
35
|
end
|
37
36
|
|
38
37
|
if env['rack.exception']
|
39
|
-
|
40
|
-
env['crash_log.error_id'] = error_id
|
38
|
+
CrashLog.notify(env['rack.exception'], :rack_env => env)
|
41
39
|
end
|
42
40
|
|
43
41
|
response
|
data/lib/crash_log/rails.rb
CHANGED
@@ -19,7 +19,7 @@ module CrashLog
|
|
19
19
|
rails_logger = RAILS_DEFAULT_LOGGER
|
20
20
|
end
|
21
21
|
|
22
|
-
CrashLog.configure do |config|
|
22
|
+
CrashLog.configure(true) do |config|
|
23
23
|
config.logger = rails_logger
|
24
24
|
config.stage = RAILS_ENV if defined?(RAILS_ENV)
|
25
25
|
config.project_root = RAILS_ROOT if defined?(RAILS_ROOT)
|
@@ -16,13 +16,15 @@ module CrashLog
|
|
16
16
|
|
17
17
|
# crash_log_context is defined in controller_methods.rb
|
18
18
|
def rescue_action_in_public_with_crash_log(exception)
|
19
|
-
|
19
|
+
CrashLog.notify_or_ignore(exception, crash_log_context)
|
20
|
+
ensure
|
20
21
|
rescue_action_in_public_without_crash_log(exception)
|
21
22
|
end
|
22
23
|
|
23
24
|
# crash_log_context is defined in controller_methods.rb
|
24
25
|
def rescue_action_locally_with_crash_log(exception)
|
25
|
-
|
26
|
+
CrashLog.notify_or_ignore(exception, crash_log_context)
|
27
|
+
ensure
|
26
28
|
rescue_action_locally_without_crash_log(exception)
|
27
29
|
end
|
28
30
|
end
|
@@ -8,7 +8,8 @@ module CrashLog
|
|
8
8
|
:controller => params[:controller],
|
9
9
|
:action => params[:action],
|
10
10
|
:url => crash_log_request_url,
|
11
|
-
:cgi_data => crash_log_filter_if_filtering(request.env)
|
11
|
+
:cgi_data => crash_log_filter_if_filtering(request.env),
|
12
|
+
:current_user => crash_log_current_user
|
12
13
|
}
|
13
14
|
end
|
14
15
|
|
@@ -40,6 +41,17 @@ module CrashLog
|
|
40
41
|
url
|
41
42
|
end
|
42
43
|
|
44
|
+
def crash_log_current_user
|
45
|
+
user = begin current_user rescue current_member end
|
46
|
+
user.attributes.select do |k, v|
|
47
|
+
CrashLog.configuration.
|
48
|
+
user_attributes.map(&:to_sym).
|
49
|
+
include?(k.to_sym) unless v.blank?
|
50
|
+
end.symbolize_keys
|
51
|
+
rescue NoMethodError, NameError
|
52
|
+
{}
|
53
|
+
end
|
54
|
+
|
43
55
|
end
|
44
56
|
end
|
45
57
|
end
|
@@ -12,8 +12,8 @@ module CrashLog
|
|
12
12
|
def render_exception_with_crash_log(env, exception)
|
13
13
|
controller = env['action_controller.instance']
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
CrashLog.notify_or_ignore(exception) #,
|
16
|
+
# crash_log_context(controller, env))
|
17
17
|
|
18
18
|
if defined?(controller.rescue_action_in_public_without_crash_log)
|
19
19
|
controller.rescue_action_in_public_without_crash_log(exception)
|
data/lib/crash_log/railtie.rb
CHANGED
data/lib/crash_log/reporter.rb
CHANGED
data/lib/crash_log/version.rb
CHANGED
@@ -3,6 +3,7 @@ require 'rails/generators'
|
|
3
3
|
class CrashlogGenerator < Rails::Generators::Base
|
4
4
|
|
5
5
|
class_option :api_key, :aliases => "-k", :type => :string, :desc => "Your CrashLog API key"
|
6
|
+
class_option :secret, :aliases => "-s", :type => :string, :desc => "Your CrashLog API secret"
|
6
7
|
|
7
8
|
def self.source_root
|
8
9
|
@_crashlog_source_root ||= File.expand_path("../../../../../generators/crashlog/templates", __FILE__)
|
@@ -17,8 +18,10 @@ class CrashlogGenerator < Rails::Generators::Base
|
|
17
18
|
private
|
18
19
|
|
19
20
|
def ensure_api_key_was_configured
|
20
|
-
if !options[:api_key] &&
|
21
|
-
|
21
|
+
if !options[:api_key] &&
|
22
|
+
!options[:secret] &&
|
23
|
+
!api_key_configured?
|
24
|
+
puts "Must pass --api-key and --secret or create config/initializers/crashlog.rb"
|
22
25
|
exit
|
23
26
|
end
|
24
27
|
end
|
@@ -27,6 +30,10 @@ class CrashlogGenerator < Rails::Generators::Base
|
|
27
30
|
"'#{options[:api_key]}'"
|
28
31
|
end
|
29
32
|
|
33
|
+
def secret_expression
|
34
|
+
"'#{options[:secret]}'"
|
35
|
+
end
|
36
|
+
|
30
37
|
def generate_initializer
|
31
38
|
template 'initializer.rb', 'config/initializers/crashlog.rb'
|
32
39
|
end
|
data/script/integration_test
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'logger'
|
4
4
|
require 'fileutils'
|
5
|
+
require "uri"
|
5
6
|
|
6
7
|
RAILS_ENV = "production"
|
7
8
|
RAILS_ROOT = FileUtils.pwd
|
@@ -18,17 +19,27 @@ host ||= "stdin.crashlog.io"
|
|
18
19
|
|
19
20
|
secure = (ARGV[2] == "secure")
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
class SimulatedExceptionRaiser
|
23
|
+
attr_reader :secure
|
24
|
+
|
25
|
+
def initialize(secure)
|
26
|
+
@secure = secure
|
27
|
+
break_things
|
28
|
+
rescue => e
|
29
|
+
CrashLog.notify(e)
|
30
|
+
end
|
31
|
+
|
32
|
+
def break_things
|
33
|
+
raise "Testing crashlog notifier with secure = #{secure}. If you can see this, it works."
|
34
|
+
end
|
35
|
+
end
|
26
36
|
|
27
37
|
CrashLog.configure do |config|
|
28
38
|
config.api_key = ARGV[0]
|
29
39
|
config.secret = ARGV[1]
|
30
40
|
config.scheme = secure ? 'https' : 'http'
|
31
|
-
config.host = host
|
41
|
+
config.host = URI.parse(host).host
|
42
|
+
config.port = URI.parse(host).port
|
32
43
|
config.service_name = 'Staging'
|
33
44
|
end
|
34
45
|
|
@@ -37,4 +48,5 @@ CrashLog.configuration.each do |key, value|
|
|
37
48
|
puts sprintf("%25s: %s", key.to_s, value.inspect.slice(0, 55))
|
38
49
|
end
|
39
50
|
puts "Sending #{secure ? "" : "in"}secure notification to project with key #{ARGV.first}"
|
40
|
-
|
51
|
+
|
52
|
+
SimulatedExceptionRaiser.new(secure)
|
@@ -55,6 +55,16 @@ describe CrashLog::Backtrace do
|
|
55
55
|
""
|
56
56
|
]
|
57
57
|
end
|
58
|
+
|
59
|
+
it 'does not filter context file path' do
|
60
|
+
CrashLog.configuration.project_root = File.expand_path('../../', __FILE__)
|
61
|
+
filters = CrashLog.configuration.backtrace_filters
|
62
|
+
backtrace = CrashLog::Backtrace.parse(raised_error.backtrace, :filters => filters)
|
63
|
+
line = backtrace.lines.first
|
64
|
+
|
65
|
+
line.file.should match /\[PROJECT_ROOT\]/
|
66
|
+
line.context_line.should match /raise RuntimeError/
|
67
|
+
end
|
58
68
|
end
|
59
69
|
|
60
70
|
describe 'filters' do
|
data/spec/crash_log_spec.rb
CHANGED
@@ -149,5 +149,15 @@ describe CrashLog do
|
|
149
149
|
|
150
150
|
CrashLog.ignored?(ActiveRecord::RecordNotFound).should be_true
|
151
151
|
end
|
152
|
+
|
153
|
+
it 'ignores ActionController::RoutingError' do
|
154
|
+
unless defined?(ActionController)
|
155
|
+
module ActionController
|
156
|
+
class RoutingError < RuntimeError
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
CrashLog.ignored?(ActionController::RoutingError).should be_true
|
161
|
+
end
|
152
162
|
end
|
153
163
|
end
|
@@ -6,7 +6,7 @@ describe 'Rescue from within a Rails 3.x controller' do
|
|
6
6
|
include Rack::Test::Methods
|
7
7
|
|
8
8
|
it 'is testing tails 3.x' do
|
9
|
-
Rails.version.should =~ /^3\./
|
9
|
+
Rails.version.should =~ /^3\.2\./
|
10
10
|
end
|
11
11
|
|
12
12
|
describe 'dummy app' do
|
@@ -18,14 +18,15 @@ describe 'Rescue from within a Rails 3.x controller' do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'should intercept error and notify crashlog' do
|
21
|
-
CrashLog.should_receive(:
|
21
|
+
CrashLog.should_receive(:notify_or_ignore).with(kind_of(RuntimeError)).once
|
22
22
|
|
23
|
-
begin
|
23
|
+
# begin
|
24
24
|
get '/broken'
|
25
25
|
last_response.status.should == 500
|
26
26
|
last_response.body.should match /We're sorry, but something went wrong/
|
27
|
-
rescue
|
28
|
-
|
27
|
+
# rescue => e
|
28
|
+
# nil
|
29
|
+
# end
|
29
30
|
|
30
31
|
end
|
31
32
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crashlog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.rc2
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-10-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement: &
|
16
|
+
requirement: &70250400938220 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70250400938220
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: faraday
|
27
|
-
requirement: &
|
27
|
+
requirement: &70250400937800 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,21 +32,21 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70250400937800
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: crashlog-auth-hmac
|
38
|
-
requirement: &
|
38
|
+
requirement: &70250400937300 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
version: 1.1.
|
43
|
+
version: 1.1.6
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70250400937300
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: yajl-ruby
|
49
|
-
requirement: &
|
49
|
+
requirement: &70250400936880 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70250400936880
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rabl
|
60
|
-
requirement: &
|
60
|
+
requirement: &70250400936340 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 0.6.14
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70250400936340
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: uuid
|
71
|
-
requirement: &
|
71
|
+
requirement: &70250400935920 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70250400935920
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: hashr
|
82
|
-
requirement: &
|
82
|
+
requirement: &70250400935460 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :runtime
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70250400935460
|
91
91
|
description: CrashLog Exception reporter
|
92
92
|
email:
|
93
93
|
- support@crashlog.io
|