bugsnag 1.0.0 → 1.0.1
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/VERSION +1 -1
- data/bugsnag.gemspec +81 -0
- data/lib/bugsnag.rb +16 -25
- data/lib/bugsnag/configuration.rb +1 -14
- data/lib/bugsnag/helpers.rb +26 -0
- data/lib/bugsnag/notification.rb +97 -0
- data/lib/bugsnag/rack.rb +32 -4
- data/lib/bugsnag/rails.rb +15 -2
- data/lib/bugsnag/rails/action_controller_rescue.rb +14 -2
- data/lib/bugsnag/rails/controller_methods.rb +72 -1
- data/lib/bugsnag/railtie.rb +5 -2
- data/rails/init.rb +2 -0
- data/test/test_bugsnag.rb +14 -21
- metadata +7 -6
- data/lib/bugsnag/event.rb +0 -71
- data/lib/bugsnag/notifier.rb +0 -55
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.1
|
data/bugsnag.gemspec
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "bugsnag"
|
8
|
+
s.version = "1.0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["James Smith"]
|
12
|
+
s.date = "2012-01-15"
|
13
|
+
s.description = "Ruby notifier for bugsnag.com"
|
14
|
+
s.email = "james@bugsnag.com"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
"Gemfile",
|
22
|
+
"Gemfile.lock",
|
23
|
+
"LICENSE.txt",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"bugsnag.gemspec",
|
28
|
+
"lib/bugsnag.rb",
|
29
|
+
"lib/bugsnag/configuration.rb",
|
30
|
+
"lib/bugsnag/helpers.rb",
|
31
|
+
"lib/bugsnag/notification.rb",
|
32
|
+
"lib/bugsnag/rack.rb",
|
33
|
+
"lib/bugsnag/rails.rb",
|
34
|
+
"lib/bugsnag/rails/action_controller_rescue.rb",
|
35
|
+
"lib/bugsnag/rails/controller_methods.rb",
|
36
|
+
"lib/bugsnag/railtie.rb",
|
37
|
+
"lib/bugsnag/version.rb",
|
38
|
+
"rails/init.rb",
|
39
|
+
"test/helper.rb",
|
40
|
+
"test/test_bugsnag.rb"
|
41
|
+
]
|
42
|
+
s.homepage = "http://github.com/bugsnag/bugsnag-ruby"
|
43
|
+
s.licenses = ["MIT"]
|
44
|
+
s.require_paths = ["lib"]
|
45
|
+
s.rubygems_version = "1.8.10"
|
46
|
+
s.summary = "Ruby notifier for bugsnag.com"
|
47
|
+
|
48
|
+
if s.respond_to? :specification_version then
|
49
|
+
s.specification_version = 3
|
50
|
+
|
51
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
52
|
+
s.add_runtime_dependency(%q<multi_json>, [">= 0"])
|
53
|
+
s.add_runtime_dependency(%q<httparty>, [">= 0"])
|
54
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
55
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
56
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
57
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
58
|
+
s.add_runtime_dependency(%q<multi_json>, [">= 0"])
|
59
|
+
s.add_runtime_dependency(%q<httparty>, [">= 0"])
|
60
|
+
else
|
61
|
+
s.add_dependency(%q<multi_json>, [">= 0"])
|
62
|
+
s.add_dependency(%q<httparty>, [">= 0"])
|
63
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
64
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
65
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
66
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
67
|
+
s.add_dependency(%q<multi_json>, [">= 0"])
|
68
|
+
s.add_dependency(%q<httparty>, [">= 0"])
|
69
|
+
end
|
70
|
+
else
|
71
|
+
s.add_dependency(%q<multi_json>, [">= 0"])
|
72
|
+
s.add_dependency(%q<httparty>, [">= 0"])
|
73
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
74
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
75
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
76
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
77
|
+
s.add_dependency(%q<multi_json>, [">= 0"])
|
78
|
+
s.add_dependency(%q<httparty>, [">= 0"])
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
data/lib/bugsnag.rb
CHANGED
@@ -1,17 +1,9 @@
|
|
1
1
|
require "rubygems"
|
2
2
|
|
3
|
-
# begin
|
4
|
-
# require "active_support"
|
5
|
-
# require "active_support/core_ext"
|
6
|
-
# rescue LoadError
|
7
|
-
# require "activesupport"
|
8
|
-
# require "activesupport/core_ext"
|
9
|
-
# end
|
10
|
-
|
11
|
-
require "bugsnag/configuration"
|
12
|
-
require "bugsnag/event"
|
13
|
-
require "bugsnag/notifier"
|
14
3
|
require "bugsnag/version"
|
4
|
+
require "bugsnag/configuration"
|
5
|
+
require "bugsnag/notification"
|
6
|
+
require "bugsnag/helpers"
|
15
7
|
|
16
8
|
require "bugsnag/rack"
|
17
9
|
require "bugsnag/railtie" if defined?(Rails::Railtie)
|
@@ -20,30 +12,29 @@ module Bugsnag
|
|
20
12
|
LOG_PREFIX = "** [Bugsnag] "
|
21
13
|
|
22
14
|
class << self
|
23
|
-
attr_accessor :notifier
|
24
|
-
|
25
15
|
def configure
|
26
|
-
yield(configuration)
|
27
|
-
|
28
|
-
|
29
|
-
log "Bugsnag exception handler #{VERSION} ready, #{configuration.to_hash.inspect}"
|
16
|
+
yield(configuration)
|
17
|
+
log "Bugsnag exception handler #{VERSION} ready, api_key=#{configuration.api_key}" if configuration.api_key
|
30
18
|
end
|
31
19
|
|
32
|
-
def notify(exception)
|
33
|
-
|
20
|
+
def notify(exception, session_data={})
|
21
|
+
opts = {
|
22
|
+
:releaseStage => configuration.release_stage,
|
23
|
+
:projectRoot => configuration.project_root.to_s,
|
24
|
+
:appVersion => configuration.app_version
|
25
|
+
}.merge(session_data)
|
26
|
+
|
27
|
+
# Send the notification
|
28
|
+
notification = Notification.new(configuration.api_key, exception, opts)
|
29
|
+
notification.deliver
|
34
30
|
end
|
35
31
|
|
36
32
|
def log(message)
|
37
|
-
logger.info(LOG_PREFIX + message) if logger
|
33
|
+
configuration.logger.info(LOG_PREFIX + message) if configuration.logger
|
38
34
|
end
|
39
35
|
|
40
|
-
private
|
41
36
|
def configuration
|
42
37
|
@configuration ||= Bugsnag::Configuration.new
|
43
38
|
end
|
44
|
-
|
45
|
-
def logger
|
46
|
-
configuration.logger
|
47
|
-
end
|
48
39
|
end
|
49
40
|
end
|
@@ -1,18 +1,5 @@
|
|
1
1
|
module Bugsnag
|
2
2
|
class Configuration
|
3
|
-
|
4
|
-
@@options.each do |attribute|
|
5
|
-
attr_accessor attribute
|
6
|
-
end
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
@endpoint = "http://api.bugsnag.com/notify"
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_hash
|
13
|
-
@@options.inject({}) do |hash, option|
|
14
|
-
hash.merge(option.to_sym => send(option))
|
15
|
-
end
|
16
|
-
end
|
3
|
+
attr_accessor :api_key, :release_stage, :project_root, :app_version, :framework, :endpoint, :logger, :disable_auto_notification
|
17
4
|
end
|
18
5
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Bugsnag
|
2
|
+
module Helpers
|
3
|
+
def self.cleanup_hash(hash)
|
4
|
+
hash.inject({}) do |h, (k, v)|
|
5
|
+
h[k.gsub(/\./, "-")] = v.to_s
|
6
|
+
h
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.apply_filters(hash, filters)
|
11
|
+
if filters
|
12
|
+
hash.each do |k, v|
|
13
|
+
if filters.any? {|f| k.to_s.include?(f.to_s) }
|
14
|
+
hash[k] = "[FILTERED]"
|
15
|
+
elsif v.respond_to?(:to_hash)
|
16
|
+
apply_filters(hash[k])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.param_context(params)
|
23
|
+
"#{params[:controller]}##{params[:action]}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require "httparty"
|
2
|
+
require "multi_json"
|
3
|
+
|
4
|
+
module Bugsnag
|
5
|
+
class Notification
|
6
|
+
DEFAULT_ENDPOINT = "http://api.bugsnag.com/notify"
|
7
|
+
|
8
|
+
NOTIFIER_NAME = "Ruby Bugsnag Notifier"
|
9
|
+
NOTIFIER_VERSION = Bugsnag::VERSION
|
10
|
+
NOTIFIER_URL = "http://www.bugsnag.com"
|
11
|
+
|
12
|
+
include HTTParty
|
13
|
+
headers "Content-Type" => "application/json"
|
14
|
+
|
15
|
+
attr_accessor :apiKey, :exception, :endpoint,
|
16
|
+
:appVersion, :releaseStage, :projectRoot,
|
17
|
+
:userId, :context, :metaData
|
18
|
+
|
19
|
+
def initialize(api_key, exception, opts={})
|
20
|
+
self.apiKey = api_key
|
21
|
+
self.exception = exception
|
22
|
+
self.endpoint = DEFAULT_ENDPOINT
|
23
|
+
|
24
|
+
opts.reject! {|k,v| v.nil?}.each {|k,v| self.send("#{k}=", v)}
|
25
|
+
end
|
26
|
+
|
27
|
+
def deliver
|
28
|
+
Bugsnag.log("Notifying #{self.endpoint} of exception")
|
29
|
+
|
30
|
+
payload = {
|
31
|
+
:apiKey => self.apiKey,
|
32
|
+
:notifier => notifier_identification,
|
33
|
+
:errors => [{
|
34
|
+
:userId => self.userId,
|
35
|
+
:appVersion => self.appVersion,
|
36
|
+
:releaseStage => self.releaseStage,
|
37
|
+
:context => self.context,
|
38
|
+
:exceptions => [exception_hash],
|
39
|
+
:metaData => self.metaData
|
40
|
+
}.reject {|k,v| v.nil? }]
|
41
|
+
}
|
42
|
+
|
43
|
+
begin
|
44
|
+
response = self.class.post(self.endpoint, {:body => MultiJson.encode(payload)})
|
45
|
+
rescue Exception => e
|
46
|
+
Bugsnag.log("Notification to #{self.endpoint} failed, #{e.inspect}")
|
47
|
+
end
|
48
|
+
|
49
|
+
return response
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
private
|
54
|
+
def notifier_identification
|
55
|
+
unless @notifier
|
56
|
+
@notifier = {
|
57
|
+
:name => NOTIFIER_NAME,
|
58
|
+
:version => NOTIFIER_VERSION,
|
59
|
+
:url => NOTIFIER_URL
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
@notifier
|
64
|
+
end
|
65
|
+
|
66
|
+
def stacktrace_hash
|
67
|
+
return [] unless self.exception.backtrace
|
68
|
+
self.exception.backtrace.map do |trace|
|
69
|
+
method = nil
|
70
|
+
file, line_str, method_str = trace.split(":")
|
71
|
+
|
72
|
+
trace_hash = {
|
73
|
+
:file => file,
|
74
|
+
:lineNumber => line_str.to_i
|
75
|
+
}
|
76
|
+
|
77
|
+
if method_str
|
78
|
+
method_match = /in `([^']+)'/.match(method_str)
|
79
|
+
method = method_match.captures.first if method_match
|
80
|
+
end
|
81
|
+
|
82
|
+
trace_hash[:method] = method if method
|
83
|
+
trace_hash[:inProject] = true if self.projectRoot && file.match(/^#{self.projectRoot}/)
|
84
|
+
|
85
|
+
trace_hash
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def exception_hash
|
90
|
+
{
|
91
|
+
:errorClass => self.exception.class.to_s,
|
92
|
+
:message => self.exception.message,
|
93
|
+
:stacktrace => stacktrace_hash
|
94
|
+
}
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/lib/bugsnag/rack.rb
CHANGED
@@ -8,15 +8,43 @@ module Bugsnag
|
|
8
8
|
begin
|
9
9
|
response = @app.call(env)
|
10
10
|
rescue Exception => raised
|
11
|
-
Bugsnag.notify(raised)
|
11
|
+
error_id = Bugsnag.notify(raised, bugsnag_request_data(env))
|
12
12
|
raise
|
13
13
|
end
|
14
14
|
|
15
|
-
if env[
|
16
|
-
Bugsnag.notify(env[
|
15
|
+
if env['rack.exception']
|
16
|
+
error_id = Bugsnag.notify(env['rack.exception'], bugsnag_request_data(env))
|
17
17
|
end
|
18
18
|
|
19
19
|
response
|
20
20
|
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def bugsnag_request_data(env)
|
24
|
+
request = ::Rack::Request.new(env)
|
25
|
+
|
26
|
+
session = env['rack.session'] || {}
|
27
|
+
params = env['action_dispatch.request.parameters'] || request.params || {}
|
28
|
+
|
29
|
+
{
|
30
|
+
:userId => session[:session_id] || session["session_id"],
|
31
|
+
:context => Bugsnag::Helpers.param_context(params),
|
32
|
+
:metaData => {
|
33
|
+
:request => {
|
34
|
+
:url => request.url,
|
35
|
+
:controller => params[:controller],
|
36
|
+
:action => params[:action],
|
37
|
+
:params => bugsnag_filter_if_filtering(env, Bugsnag::Helpers.cleanup_hash(params.to_hash)),
|
38
|
+
},
|
39
|
+
:session => bugsnag_filter_if_filtering(env, Bugsnag::Helpers.cleanup_hash(session)),
|
40
|
+
:environment => bugsnag_filter_if_filtering(env, Bugsnag::Helpers.cleanup_hash(env))
|
41
|
+
}
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def bugsnag_filter_if_filtering(env, hash)
|
46
|
+
@params_filters ||= env["action_dispatch.parameter_filter"]
|
47
|
+
Bugsnag::Helpers.apply_filters(hash, @params_filters)
|
48
|
+
end
|
21
49
|
end
|
22
|
-
end
|
50
|
+
end
|
data/lib/bugsnag/rails.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
# Rails 2.x support
|
2
|
+
|
1
3
|
require "bugsnag"
|
4
|
+
require "bugsnag/rails/controller_methods"
|
2
5
|
require "bugsnag/rails/action_controller_rescue"
|
3
6
|
|
4
7
|
module Bugsnag
|
@@ -6,12 +9,22 @@ module Bugsnag
|
|
6
9
|
def self.initialize
|
7
10
|
if defined?(ActionController::Base)
|
8
11
|
ActionController::Base.send(:include, Bugsnag::Rails::ActionControllerRescue)
|
12
|
+
ActionController::Base.send(:include, Bugsnag::Rails::ControllerMethods)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Try to find where to log to
|
16
|
+
rails_logger = nil
|
17
|
+
if defined?(::Rails.logger)
|
18
|
+
rails_logger = ::Rails.logger
|
19
|
+
elsif defined?(RAILS_DEFAULT_LOGGER)
|
20
|
+
rails_logger = RAILS_DEFAULT_LOGGER
|
9
21
|
end
|
10
22
|
|
11
|
-
Bugsnag.configure
|
23
|
+
Bugsnag.configure do |config|
|
12
24
|
config.logger = rails_logger
|
13
|
-
config.
|
25
|
+
config.release_stage = RAILS_ENV if defined?(RAILS_ENV)
|
14
26
|
config.project_root = RAILS_ROOT if defined?(RAILS_ROOT)
|
27
|
+
config.framework = "Rails: #{::Rails::VERSION::STRING}" if defined?(::Rails::VERSION)
|
15
28
|
end
|
16
29
|
end
|
17
30
|
end
|
@@ -4,12 +4,24 @@ module Bugsnag
|
|
4
4
|
def self.included(base)
|
5
5
|
base.send(:alias_method, :rescue_action_in_public_without_bugsnag, :rescue_action_in_public)
|
6
6
|
base.send(:alias_method, :rescue_action_in_public, :rescue_action_in_public_with_bugsnag)
|
7
|
+
|
8
|
+
base.send(:alias_method, :rescue_action_locally_without_bugsnag, :rescue_action_locally)
|
9
|
+
base.send(:alias_method, :rescue_action_locally, :rescue_action_locally_with_bugsnag)
|
7
10
|
end
|
8
11
|
|
9
12
|
private
|
10
13
|
def rescue_action_in_public_with_bugsnag(exception)
|
11
|
-
|
12
|
-
|
14
|
+
auto_notify(exception) unless Bugsnag.configuration.disable_auto_notification
|
15
|
+
rescue_action_in_public_without_bugsnag(exception)
|
16
|
+
end
|
17
|
+
|
18
|
+
def rescue_action_locally_with_bugsnag(exception)
|
19
|
+
auto_notify(exception) unless Bugsnag.configuration.disable_auto_notification
|
20
|
+
rescue_action_locally_without_bugsnag(exception)
|
21
|
+
end
|
22
|
+
|
23
|
+
def auto_notify(exception)
|
24
|
+
notify_bugsnag(exception)
|
13
25
|
end
|
14
26
|
end
|
15
27
|
end
|
@@ -1,7 +1,78 @@
|
|
1
1
|
module Bugsnag
|
2
2
|
module Rails
|
3
3
|
module ControllerMethods
|
4
|
-
|
4
|
+
private
|
5
|
+
def notify_bugsnag(exception, custom_data=nil)
|
6
|
+
unless bugsnag_local_request?
|
7
|
+
request_data = bugsnag_request_data
|
8
|
+
request_data[:metaData][:custom] = custom_data if custom_data
|
9
|
+
Bugsnag.notify(exception, request_data)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def bugsnag_request_data
|
14
|
+
{
|
15
|
+
:userId => bugsnag_session_id,
|
16
|
+
:context => Bugsnag::Helpers.param_context(params),
|
17
|
+
:metaData => {
|
18
|
+
:request => {
|
19
|
+
:url => bugsnag_request_url,
|
20
|
+
:controller => params[:controller],
|
21
|
+
:action => params[:action],
|
22
|
+
:params => bugsnag_filter_if_filtering(params.to_hash),
|
23
|
+
},
|
24
|
+
:session => bugsnag_filter_if_filtering(bugsnag_session_data),
|
25
|
+
:environment => bugsnag_filter_if_filtering(Bugsnag::Helpers.cleanup_hash(request.env))
|
26
|
+
}
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def bugsnag_local_request?
|
31
|
+
if defined?(::Rails.application.config)
|
32
|
+
::Rails.application.config.consider_all_requests_local || request.local?
|
33
|
+
else
|
34
|
+
consider_all_requests_local || local_request?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def bugsnag_session_id
|
39
|
+
session = bugsnag_session_data
|
40
|
+
session[:session_id] || session["session_id"]
|
41
|
+
end
|
42
|
+
|
43
|
+
def bugsnag_context
|
44
|
+
"#{params[:controller]}##{params[:action]}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def bugsnag_request_url
|
48
|
+
url = "#{request.protocol}#{request.host}"
|
49
|
+
|
50
|
+
unless [80, 443].include?(request.port)
|
51
|
+
url << ":#{request.port}"
|
52
|
+
end
|
53
|
+
|
54
|
+
url << request.fullpath
|
55
|
+
url
|
56
|
+
end
|
57
|
+
|
58
|
+
def bugsnag_session_data
|
59
|
+
if session.respond_to?(:to_hash)
|
60
|
+
session.to_hash
|
61
|
+
else
|
62
|
+
session.data
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def bugsnag_filter_if_filtering(hash)
|
67
|
+
return hash if ! hash.is_a?(Hash)
|
68
|
+
|
69
|
+
if respond_to?(:filter_parameters)
|
70
|
+
filter_parameters(hash) rescue hash
|
71
|
+
else
|
72
|
+
hash
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
5
76
|
end
|
6
77
|
end
|
7
78
|
end
|
data/lib/bugsnag/railtie.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# Rails 3.x support
|
2
|
+
|
1
3
|
require "bugsnag"
|
2
4
|
require "rails"
|
3
5
|
|
@@ -13,9 +15,10 @@ module Bugsnag
|
|
13
15
|
|
14
16
|
config.after_initialize do
|
15
17
|
Bugsnag.configure do |config|
|
16
|
-
config.logger
|
18
|
+
config.logger ||= Rails.logger
|
17
19
|
config.release_stage ||= Rails.env
|
18
|
-
config.project_root
|
20
|
+
config.project_root ||= Rails.root
|
21
|
+
config.framework = "Rails: #{::Rails::VERSION::STRING}"
|
19
22
|
end
|
20
23
|
|
21
24
|
if defined?(::ActionController::Base)
|
data/rails/init.rb
CHANGED
data/test/test_bugsnag.rb
CHANGED
@@ -1,29 +1,22 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
+
class BugsnagTestException < RuntimeError; end
|
4
|
+
|
3
5
|
class TestBugsnag < Test::Unit::TestCase
|
4
|
-
should "get a 200 response from bugsnag
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
should "get a 200 response from bugsnag for exceptions" do
|
7
|
+
Bugsnag.configure do |config|
|
8
|
+
config.api_key = "a799e9c27c3fb3017e4a556fd815317e"
|
9
|
+
config.endpoint = "http://localhost:8000/notify"
|
10
|
+
config.release_stage = "production"
|
11
|
+
config.project_root = File.dirname(__FILE__)
|
12
|
+
config.user_id = "static_user_id"
|
13
|
+
end
|
14
|
+
|
10
15
|
begin
|
11
|
-
|
16
|
+
raise BugsnagTestException.new("Exception test from bugsnag gem")
|
12
17
|
rescue Exception => e
|
13
|
-
|
14
|
-
|
15
|
-
# Bugsnag::Notifier.set_endpoint("http://localhost:8000")
|
16
|
-
# Bugsnag::Notifier.notify("145260904aa22d52bf2a82076d157c38", event)
|
17
|
-
|
18
|
-
return Bugsnag::Notifier.notify("d6db01214d22ac808ce6afdfa4c3f148", event)
|
18
|
+
response = Bugsnag.notify(e)
|
19
|
+
flunk "oh my" if response.code != 200
|
19
20
|
end
|
20
21
|
end
|
21
|
-
|
22
|
-
def go
|
23
|
-
deep
|
24
|
-
end
|
25
|
-
|
26
|
-
def deep
|
27
|
-
raise RuntimeError.new("Stuff happens")
|
28
|
-
end
|
29
22
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bugsnag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 1
|
10
|
+
version: 1.0.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- James Smith
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2012-01-15 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
prerelease: false
|
@@ -150,10 +150,11 @@ files:
|
|
150
150
|
- README.rdoc
|
151
151
|
- Rakefile
|
152
152
|
- VERSION
|
153
|
+
- bugsnag.gemspec
|
153
154
|
- lib/bugsnag.rb
|
154
155
|
- lib/bugsnag/configuration.rb
|
155
|
-
- lib/bugsnag/
|
156
|
-
- lib/bugsnag/
|
156
|
+
- lib/bugsnag/helpers.rb
|
157
|
+
- lib/bugsnag/notification.rb
|
157
158
|
- lib/bugsnag/rack.rb
|
158
159
|
- lib/bugsnag/rails.rb
|
159
160
|
- lib/bugsnag/rails/action_controller_rescue.rb
|
data/lib/bugsnag/event.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
require "multi_json"
|
2
|
-
|
3
|
-
module Bugsnag
|
4
|
-
class Event
|
5
|
-
attr_accessor :exception, :user_id, :app_environment, :web_environment, :meta_data
|
6
|
-
|
7
|
-
def initialize(exception, user_id, env={})
|
8
|
-
self.exception = exception
|
9
|
-
self.user_id = user_id
|
10
|
-
self.app_environment = env[:app_environment]
|
11
|
-
self.web_environment = env[:web_environment]
|
12
|
-
self.meta_data = env[:meta_data]
|
13
|
-
end
|
14
|
-
|
15
|
-
def error_class
|
16
|
-
exception.class.to_s
|
17
|
-
end
|
18
|
-
|
19
|
-
def message
|
20
|
-
exception.message
|
21
|
-
end
|
22
|
-
|
23
|
-
def stacktrace(project_path=nil)
|
24
|
-
return @stacktrace if @stacktrace
|
25
|
-
|
26
|
-
if exception.backtrace
|
27
|
-
@stacktrace = exception.backtrace.map do |trace|
|
28
|
-
method = nil
|
29
|
-
file, line, method_str = trace.split(":")
|
30
|
-
|
31
|
-
trace_hash = {
|
32
|
-
:file => file,
|
33
|
-
:lineNumber => line
|
34
|
-
}
|
35
|
-
|
36
|
-
if method_str
|
37
|
-
method_match = /in `([^']+)'/.match(method_str)
|
38
|
-
method = method_match.captures.first if method_match
|
39
|
-
end
|
40
|
-
|
41
|
-
trace_hash[:method] = method if method
|
42
|
-
trace_hash[:inProject] = true if project_path && file.match(/^#{project_path}/)
|
43
|
-
|
44
|
-
trace_hash
|
45
|
-
end
|
46
|
-
else
|
47
|
-
@stacktrace = []
|
48
|
-
end
|
49
|
-
|
50
|
-
@stacktrace
|
51
|
-
end
|
52
|
-
|
53
|
-
def as_hash
|
54
|
-
{
|
55
|
-
:userId => user_id,
|
56
|
-
:causes => [{
|
57
|
-
:errorClass => error_class,
|
58
|
-
:message => message,
|
59
|
-
:stacktrace => stacktrace
|
60
|
-
}],
|
61
|
-
:appEnvironment => app_environment,
|
62
|
-
:webEnvironment => web_environment,
|
63
|
-
:metaData => meta_data
|
64
|
-
}
|
65
|
-
end
|
66
|
-
|
67
|
-
def as_json
|
68
|
-
MultiJson.encode(as_hash)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
data/lib/bugsnag/notifier.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
require "httparty"
|
2
|
-
require "multi_json"
|
3
|
-
|
4
|
-
module Bugsnag
|
5
|
-
class Notifier
|
6
|
-
include HTTParty
|
7
|
-
|
8
|
-
headers "Content-Type" => "application/json"
|
9
|
-
|
10
|
-
NOTIFIER_NAME = "Ruby Bugsnag Notifier"
|
11
|
-
NOTIFIER_VERSION = "1.0.0"
|
12
|
-
NOTIFIER_URL = "http://www.bugsnag.com"
|
13
|
-
|
14
|
-
def initialize(configuration)
|
15
|
-
@configuration = configuration
|
16
|
-
end
|
17
|
-
|
18
|
-
def notify(exception, meta_data={})
|
19
|
-
event = Bugsnag::Event.new(exception, "TODO USER ID", {
|
20
|
-
:app_environment => build_app_environment,
|
21
|
-
:web_environment => build_web_environment,
|
22
|
-
:meta_data => meta_data
|
23
|
-
})
|
24
|
-
|
25
|
-
payload = {
|
26
|
-
:apiKey => @configuration.api_key,
|
27
|
-
:notifier => {
|
28
|
-
:name => NOTIFIER_NAME,
|
29
|
-
:version => NOTIFIER_VERSION,
|
30
|
-
:url => NOTIFIER_URL
|
31
|
-
},
|
32
|
-
:errors => [event.as_hash]
|
33
|
-
}
|
34
|
-
|
35
|
-
self.class.post(@configuration.endpoint, {:body => MultiJson.encode(payload)})
|
36
|
-
|
37
|
-
Bugsnag.log("Notified bugsnag.com of exception")
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
def build_app_environment
|
42
|
-
{
|
43
|
-
:releaseStage => @configuration.release_stage,
|
44
|
-
:projectRoot => @configuration.project_root.to_s
|
45
|
-
# TODO: Add in environmental variables
|
46
|
-
}
|
47
|
-
end
|
48
|
-
|
49
|
-
def build_web_environment
|
50
|
-
{
|
51
|
-
|
52
|
-
}
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|