crashlog 1.0.0.rc1 → 1.0.0.rc2
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.
- 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
|