bugsnag 6.10.0 → 6.11.0
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 +4 -4
- data/.rubocop_todo.yml +4 -0
- data/CHANGELOG.md +20 -0
- data/Gemfile +1 -0
- data/README.md +1 -0
- data/VERSION +1 -1
- data/features/fixtures/docker-compose.yml +13 -0
- data/features/fixtures/rails3/app/app/controllers/breadcrumbs_controller.rb +19 -0
- data/features/fixtures/rails3/app/app/controllers/session_tracking_controller.rb +10 -6
- data/features/fixtures/rails3/app/config/initializers/bugsnag.rb +8 -2
- data/features/fixtures/rails3/app/config/routes.rb +1 -0
- data/features/fixtures/rails4/app/Gemfile +5 -1
- data/features/fixtures/rails4/app/app/controllers/breadcrumbs_controller.rb +26 -0
- data/features/fixtures/rails4/app/app/controllers/mongo_controller.rb +23 -0
- data/features/fixtures/rails4/app/app/controllers/session_tracking_controller.rb +9 -5
- data/features/fixtures/rails4/app/app/jobs/application_job.rb +2 -0
- data/features/fixtures/rails4/app/app/jobs/notify_job.rb +5 -0
- data/features/fixtures/rails4/app/app/models/mongo_model.rb +6 -0
- data/features/fixtures/rails4/app/config/initializers/bugsnag.rb +7 -1
- data/features/fixtures/rails4/app/config/mongoid.yml +22 -0
- data/features/fixtures/rails4/app/config/routes.rb +2 -0
- data/features/fixtures/rails5/app/Gemfile +4 -0
- data/features/fixtures/rails5/app/app/controllers/breadcrumbs_controller.rb +24 -0
- data/features/fixtures/rails5/app/app/controllers/mongo_controller.rb +22 -0
- data/features/fixtures/rails5/app/app/controllers/session_tracking_controller.rb +9 -5
- data/features/fixtures/rails5/app/app/jobs/notify_job.rb +5 -0
- data/features/fixtures/rails5/app/app/models/mongo_model.rb +6 -0
- data/features/fixtures/rails5/app/config/initializers/bugsnag.rb +7 -1
- data/features/fixtures/rails5/app/config/mongoid.yml +23 -0
- data/features/fixtures/rails5/app/config/routes.rb +11 -1
- data/features/rails_features/auto_capture_sessions.feature +55 -5
- data/features/rails_features/breadcrumbs.feature +135 -0
- data/features/rails_features/mongo_breadcrumbs.feature +100 -0
- data/features/steps/ruby_notifier_steps.rb +6 -0
- data/lib/bugsnag.rb +59 -3
- data/lib/bugsnag/breadcrumbs/breadcrumb.rb +76 -0
- data/lib/bugsnag/breadcrumbs/breadcrumbs.rb +14 -0
- data/lib/bugsnag/breadcrumbs/validator.rb +59 -0
- data/lib/bugsnag/configuration.rb +103 -6
- data/lib/bugsnag/integrations/mongo.rb +132 -0
- data/lib/bugsnag/integrations/rails/rails_breadcrumbs.rb +118 -0
- data/lib/bugsnag/integrations/railtie.rb +28 -1
- data/lib/bugsnag/middleware/breadcrumbs.rb +21 -0
- data/lib/bugsnag/report.rb +30 -1
- data/lib/bugsnag/session_tracker.rb +1 -0
- data/lib/bugsnag/utility/circular_buffer.rb +62 -0
- data/spec/breadcrumbs/breadcrumb_spec.rb +93 -0
- data/spec/breadcrumbs/validator_spec.rb +200 -0
- data/spec/bugsnag_spec.rb +230 -0
- data/spec/configuration_spec.rb +176 -2
- data/spec/integrations/mongo_spec.rb +262 -0
- data/spec/report_spec.rb +149 -0
- data/spec/session_tracker_spec.rb +24 -2
- data/spec/utility/circular_buffer_spec.rb +98 -0
- metadata +27 -2
@@ -7,8 +7,14 @@ Bugsnag.configure do |config|
|
|
7
7
|
config.auto_notify = ENV["BUGSNAG_AUTO_NOTIFY"] != "false"
|
8
8
|
config.project_root = ENV["BUGSNAG_PROJECT_ROOT"] if ENV.include? "BUGSNAG_PROJECT_ROOT"
|
9
9
|
config.ignore_classes << lambda { |ex| ex.class.to_s == ENV["BUGSNAG_IGNORE_CLASS"] } if ENV.include? "BUGSNAG_IGNORE_CLASS"
|
10
|
-
config.auto_capture_sessions = ENV["BUGSNAG_AUTO_CAPTURE_SESSIONS"] == "true"
|
10
|
+
config.auto_capture_sessions = ENV["BUGSNAG_AUTO_CAPTURE_SESSIONS"] == "true" unless ENV["USE_DEFAULT_AUTO_CAPTURE_SESSIONS"]
|
11
11
|
config.release_stage = ENV["BUGSNAG_RELEASE_STAGE"] if ENV.include? "BUGSNAG_RELEASE_STAGE"
|
12
12
|
config.send_code = ENV["BUGSNAG_SEND_CODE"] != "false"
|
13
13
|
config.send_environment = ENV["BUGSNAG_SEND_ENVIRONMENT"] == "true"
|
14
|
+
|
15
|
+
if ENV["SQL_ONLY_BREADCRUMBS"] == "true"
|
16
|
+
config.before_breadcrumb_callbacks << Proc.new do |breadcrumb|
|
17
|
+
breadcrumb.ignore! unless breadcrumb.meta_data[:event_name] == "sql.active_record" && breadcrumb.meta_data[:name] == "User Load"
|
18
|
+
end
|
19
|
+
end
|
14
20
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
development:
|
2
|
+
# Configure available database clients. (required)
|
3
|
+
clients:
|
4
|
+
# Defines the default client. (required)
|
5
|
+
default:
|
6
|
+
# Defines the name of the default database that Mongoid can connect to.
|
7
|
+
# (required).
|
8
|
+
database: rails5_development
|
9
|
+
# Provides the hosts the default client can connect to. Must be an array
|
10
|
+
# of host:port pairs. (required)
|
11
|
+
hosts:
|
12
|
+
- mongo:27017
|
13
|
+
|
14
|
+
test:
|
15
|
+
clients:
|
16
|
+
default:
|
17
|
+
database: rails5_test
|
18
|
+
hosts:
|
19
|
+
- mongo:27017
|
20
|
+
options:
|
21
|
+
read:
|
22
|
+
mode: :primary
|
23
|
+
max_pool_size: 1
|
@@ -36,7 +36,8 @@ Rails.application.routes.draw do
|
|
36
36
|
get 'metadata_filters/filter', to: 'metadata_filters#filter'
|
37
37
|
|
38
38
|
get 'session_tracking/initializer', to: 'session_tracking#initializer'
|
39
|
-
get 'session_tracking/
|
39
|
+
get 'session_tracking/manual', to: 'session_tracking#manual'
|
40
|
+
get 'session_tracking/multi_sessions', to: 'session_tracking#multi_sessions'
|
40
41
|
|
41
42
|
get 'release_stage/default', to: 'release_stage#default'
|
42
43
|
get 'release_stage/after', to: 'release_stage#after'
|
@@ -49,4 +50,13 @@ Rails.application.routes.draw do
|
|
49
50
|
get 'clearance/create', to: 'clearance#create'
|
50
51
|
get 'clearance/unhandled', to: 'clearance#unhandled'
|
51
52
|
get 'clearance/handled', to: 'clearance#handled'
|
53
|
+
|
54
|
+
get 'breadcrumbs/handled', to: 'breadcrumbs#handled'
|
55
|
+
get 'breadcrumbs/sql_breadcrumb', to: 'breadcrumbs#sql_breadcrumb'
|
56
|
+
get 'breadcrumbs/active_job', to: 'breadcrumbs#active_job'
|
57
|
+
get 'breadcrumbs/cache_read', to: 'breadcrumbs#cache_read'
|
58
|
+
|
59
|
+
get 'mongo/success_crash', to: 'mongo#success_crash'
|
60
|
+
get 'mongo/get_crash', to: 'mongo#get_crash'
|
61
|
+
get 'mongo/failure_crash', to: 'mongo#failure_crash'
|
52
62
|
end
|
@@ -5,9 +5,9 @@ Background:
|
|
5
5
|
And I set environment variable "APP_PATH" to "/usr/src"
|
6
6
|
And I configure the bugsnag endpoint
|
7
7
|
|
8
|
-
Scenario Outline: Auto_capture_sessions
|
8
|
+
Scenario Outline: Auto_capture_sessions defaults to true
|
9
9
|
Given I set environment variable "RUBY_VERSION" to "<ruby_version>"
|
10
|
-
And I set environment variable "
|
10
|
+
And I set environment variable "USE_DEFAULT_AUTO_CAPTURE_SESSIONS" to "true"
|
11
11
|
And I start the service "rails<rails_version>"
|
12
12
|
And I wait for the app to respond on port "6128<rails_version>"
|
13
13
|
When I navigate to the route "/session_tracking/initializer" on port "6128<rails_version>"
|
@@ -32,18 +32,68 @@ Scenario Outline: Auto_capture_sessions can be set to true in the initializer
|
|
32
32
|
| 2.5 | 3 |
|
33
33
|
| 2.5 | 5 |
|
34
34
|
|
35
|
-
Scenario Outline: Auto_capture_sessions can be set to
|
35
|
+
Scenario Outline: Auto_capture_sessions can be set to false in the initializer
|
36
36
|
Given I set environment variable "RUBY_VERSION" to "<ruby_version>"
|
37
|
+
And I set environment variable "BUGSNAG_AUTO_CAPTURE_SESSIONS" to "false"
|
37
38
|
And I start the service "rails<rails_version>"
|
38
39
|
And I wait for the app to respond on port "6128<rails_version>"
|
39
|
-
When I navigate to the route "/session_tracking/after" on port "6128<rails_version>"
|
40
|
-
Then I should receive 0 requests
|
41
40
|
When I navigate to the route "/session_tracking/initializer" on port "6128<rails_version>"
|
41
|
+
Then I should receive 0 requests
|
42
|
+
|
43
|
+
Examples:
|
44
|
+
| ruby_version | rails_version |
|
45
|
+
| 2.0 | 3 |
|
46
|
+
| 2.1 | 3 |
|
47
|
+
| 2.2 | 3 |
|
48
|
+
| 2.2 | 4 |
|
49
|
+
| 2.2 | 5 |
|
50
|
+
| 2.3 | 3 |
|
51
|
+
| 2.3 | 4 |
|
52
|
+
| 2.3 | 5 |
|
53
|
+
| 2.4 | 3 |
|
54
|
+
| 2.4 | 5 |
|
55
|
+
| 2.5 | 3 |
|
56
|
+
| 2.5 | 5 |
|
57
|
+
|
58
|
+
Scenario Outline: Manual sessions are still sent if Auto_capture_sessions is false
|
59
|
+
Given I set environment variable "RUBY_VERSION" to "<ruby_version>"
|
60
|
+
And I set environment variable "BUGSNAG_AUTO_CAPTURE_SESSIONS" to "false"
|
61
|
+
And I start the service "rails<rails_version>"
|
62
|
+
And I wait for the app to respond on port "6128<rails_version>"
|
63
|
+
When I navigate to the route "/session_tracking/manual" on port "6128<rails_version>"
|
64
|
+
Then I should receive a request
|
65
|
+
And the request is a valid for the session tracking API
|
66
|
+
And the request used the "Ruby Bugsnag Notifier" notifier
|
67
|
+
And the "Bugsnag-API-Key" header equals "a35a2a72bd230ac0aa0f52715bbdc6aa"
|
68
|
+
And the sessionCount "startedAt" is a timestamp
|
69
|
+
|
70
|
+
Examples:
|
71
|
+
| ruby_version | rails_version |
|
72
|
+
| 2.0 | 3 |
|
73
|
+
| 2.1 | 3 |
|
74
|
+
| 2.2 | 3 |
|
75
|
+
| 2.2 | 4 |
|
76
|
+
| 2.2 | 5 |
|
77
|
+
| 2.3 | 3 |
|
78
|
+
| 2.3 | 4 |
|
79
|
+
| 2.3 | 5 |
|
80
|
+
| 2.4 | 3 |
|
81
|
+
| 2.4 | 5 |
|
82
|
+
| 2.5 | 3 |
|
83
|
+
| 2.5 | 5 |
|
84
|
+
|
85
|
+
Scenario Outline: 100 session calls results in 100 sessions
|
86
|
+
Given I set environment variable "RUBY_VERSION" to "<ruby_version>"
|
87
|
+
And I set environment variable "BUGSNAG_AUTO_CAPTURE_SESSIONS" to "false"
|
88
|
+
And I start the service "rails<rails_version>"
|
89
|
+
And I wait for the app to respond on port "6128<rails_version>"
|
90
|
+
When I navigate to the route "/session_tracking/multi_sessions" on port "6128<rails_version>"
|
42
91
|
Then I should receive a request
|
43
92
|
And the request is a valid for the session tracking API
|
44
93
|
And the request used the "Ruby Bugsnag Notifier" notifier
|
45
94
|
And the "Bugsnag-API-Key" header equals "a35a2a72bd230ac0aa0f52715bbdc6aa"
|
46
95
|
And the sessionCount "startedAt" is a timestamp
|
96
|
+
And the total sessionStarted count equals 100
|
47
97
|
|
48
98
|
Examples:
|
49
99
|
| ruby_version | rails_version |
|
@@ -0,0 +1,135 @@
|
|
1
|
+
Feature: Rails automatic breadcrumbs
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I set environment variable "BUGSNAG_API_KEY" to "a35a2a72bd230ac0aa0f52715bbdc6aa"
|
5
|
+
And I set environment variable "APP_PATH" to "/usr/src"
|
6
|
+
And I configure the bugsnag endpoint
|
7
|
+
|
8
|
+
Scenario Outline: Request breadcrumb
|
9
|
+
Given I set environment variable "RUBY_VERSION" to "<ruby_version>"
|
10
|
+
And I start the service "rails<rails_version>"
|
11
|
+
And I wait for the app to respond on port "6128<rails_version>"
|
12
|
+
When I navigate to the route "/breadcrumbs/handled" on port "6128<rails_version>"
|
13
|
+
Then I should receive a request
|
14
|
+
And the request is a valid for the error reporting API
|
15
|
+
And the request used the "Ruby Bugsnag Notifier" notifier
|
16
|
+
And the request contained the api key "a35a2a72bd230ac0aa0f52715bbdc6aa"
|
17
|
+
And the event has a "request" breadcrumb named "Controller started processing"
|
18
|
+
And the event "breadcrumbs.0.timestamp" is a timestamp
|
19
|
+
And the event "breadcrumbs.0.metaData.controller" equals "BreadcrumbsController"
|
20
|
+
And the event "breadcrumbs.0.metaData.action" equals "handled"
|
21
|
+
And the event "breadcrumbs.0.metaData.method" equals "GET"
|
22
|
+
And the event "breadcrumbs.0.metaData.path" equals "/breadcrumbs/handled"
|
23
|
+
And the event "breadcrumbs.0.metaData.event_name" equals "start_processing.action_controller"
|
24
|
+
And the event "breadcrumbs.0.metaData.event_id" is not null
|
25
|
+
|
26
|
+
Examples:
|
27
|
+
| ruby_version | rails_version |
|
28
|
+
| 2.0 | 3 |
|
29
|
+
| 2.1 | 3 |
|
30
|
+
| 2.2 | 3 |
|
31
|
+
| 2.2 | 4 |
|
32
|
+
| 2.2 | 5 |
|
33
|
+
| 2.3 | 3 |
|
34
|
+
| 2.3 | 4 |
|
35
|
+
| 2.3 | 5 |
|
36
|
+
| 2.4 | 3 |
|
37
|
+
| 2.4 | 5 |
|
38
|
+
| 2.5 | 3 |
|
39
|
+
| 2.5 | 5 |
|
40
|
+
|
41
|
+
Scenario Outline: SQL Breadcrumb without bindings
|
42
|
+
Given I set environment variable "RUBY_VERSION" to "<ruby_version>"
|
43
|
+
And I set environment variable "SQL_ONLY_BREADCRUMBS" to "true"
|
44
|
+
And I start the service "rails<rails_version>"
|
45
|
+
And I wait for the app to respond on port "6128<rails_version>"
|
46
|
+
When I navigate to the route "/breadcrumbs/sql_breadcrumb" on port "6128<rails_version>"
|
47
|
+
Then I should receive a request
|
48
|
+
And the request is a valid for the error reporting API
|
49
|
+
And the request used the "Ruby Bugsnag Notifier" notifier
|
50
|
+
And the request contained the api key "a35a2a72bd230ac0aa0f52715bbdc6aa"
|
51
|
+
And the event has a "process" breadcrumb named "ActiveRecord SQL query"
|
52
|
+
And the event "breadcrumbs.0.timestamp" is a timestamp
|
53
|
+
And the event "breadcrumbs.0.metaData.name" equals "User Load"
|
54
|
+
And the event "breadcrumbs.0.metaData.connection_id" is not null
|
55
|
+
And the event "breadcrumbs.0.metaData.event_name" equals "sql.active_record"
|
56
|
+
And the event "breadcrumbs.0.metaData.event_id" is not null
|
57
|
+
|
58
|
+
Examples:
|
59
|
+
| ruby_version | rails_version |
|
60
|
+
| 2.0 | 3 |
|
61
|
+
| 2.1 | 3 |
|
62
|
+
| 2.2 | 3 |
|
63
|
+
| 2.2 | 4 |
|
64
|
+
| 2.3 | 3 |
|
65
|
+
| 2.3 | 4 |
|
66
|
+
| 2.4 | 3 |
|
67
|
+
| 2.5 | 3 |
|
68
|
+
|
69
|
+
Scenario Outline: SQL Breadcrumb with bindings
|
70
|
+
Given I set environment variable "RUBY_VERSION" to "<ruby_version>"
|
71
|
+
And I set environment variable "SQL_ONLY_BREADCRUMBS" to "true"
|
72
|
+
And I start the service "rails<rails_version>"
|
73
|
+
And I wait for the app to respond on port "6128<rails_version>"
|
74
|
+
When I navigate to the route "/breadcrumbs/sql_breadcrumb" on port "6128<rails_version>"
|
75
|
+
Then I should receive a request
|
76
|
+
And the request is a valid for the error reporting API
|
77
|
+
And the request used the "Ruby Bugsnag Notifier" notifier
|
78
|
+
And the request contained the api key "a35a2a72bd230ac0aa0f52715bbdc6aa"
|
79
|
+
And the event has a "process" breadcrumb named "ActiveRecord SQL query"
|
80
|
+
And the event "breadcrumbs.0.timestamp" is a timestamp
|
81
|
+
And the event "breadcrumbs.0.metaData.name" equals "User Load"
|
82
|
+
And the event "breadcrumbs.0.metaData.connection_id" is not null
|
83
|
+
And the event "breadcrumbs.0.metaData.event_name" equals "sql.active_record"
|
84
|
+
And the event "breadcrumbs.0.metaData.event_id" is not null
|
85
|
+
And the event "breadcrumbs.0.metaData.binds" equals "{"email":"?","LIMIT":"?"}"
|
86
|
+
|
87
|
+
Examples:
|
88
|
+
| ruby_version | rails_version |
|
89
|
+
| 2.2 | 5 |
|
90
|
+
| 2.3 | 5 |
|
91
|
+
| 2.4 | 5 |
|
92
|
+
| 2.5 | 5 |
|
93
|
+
|
94
|
+
Scenario Outline: Active job breadcrumb
|
95
|
+
Given I set environment variable "RUBY_VERSION" to "<ruby_version>"
|
96
|
+
And I start the service "rails<rails_version>"
|
97
|
+
And I wait for the app to respond on port "6128<rails_version>"
|
98
|
+
When I navigate to the route "/breadcrumbs/active_job" on port "6128<rails_version>"
|
99
|
+
Then I should receive a request
|
100
|
+
And the request is a valid for the error reporting API
|
101
|
+
And the request used the "Ruby Bugsnag Notifier" notifier
|
102
|
+
And the request contained the api key "a35a2a72bd230ac0aa0f52715bbdc6aa"
|
103
|
+
And the event has a "process" breadcrumb named "Start perform ActiveJob"
|
104
|
+
And the event "breadcrumbs.0.timestamp" is a timestamp
|
105
|
+
And the event "breadcrumbs.0.metaData.event_name" equals "perform_start.active_job"
|
106
|
+
And the event "breadcrumbs.0.metaData.event_id" is not null
|
107
|
+
|
108
|
+
Examples:
|
109
|
+
| ruby_version | rails_version |
|
110
|
+
| 2.2 | 4 |
|
111
|
+
| 2.2 | 5 |
|
112
|
+
| 2.3 | 4 |
|
113
|
+
| 2.3 | 5 |
|
114
|
+
| 2.4 | 5 |
|
115
|
+
| 2.5 | 5 |
|
116
|
+
|
117
|
+
Scenario Outline: Cache read
|
118
|
+
Given I set environment variable "RUBY_VERSION" to "<ruby_version>"
|
119
|
+
And I start the service "rails<rails_version>"
|
120
|
+
And I wait for the app to respond on port "6128<rails_version>"
|
121
|
+
When I navigate to the route "/breadcrumbs/cache_read" on port "6128<rails_version>"
|
122
|
+
Then I should receive a request
|
123
|
+
And the request is a valid for the error reporting API
|
124
|
+
And the request used the "Ruby Bugsnag Notifier" notifier
|
125
|
+
And the request contained the api key "a35a2a72bd230ac0aa0f52715bbdc6aa"
|
126
|
+
And the event has a "process" breadcrumb named "Read cache"
|
127
|
+
|
128
|
+
Examples:
|
129
|
+
| ruby_version | rails_version |
|
130
|
+
| 2.2 | 4 |
|
131
|
+
| 2.2 | 5 |
|
132
|
+
| 2.3 | 4 |
|
133
|
+
| 2.3 | 5 |
|
134
|
+
| 2.4 | 5 |
|
135
|
+
| 2.5 | 5 |
|
@@ -0,0 +1,100 @@
|
|
1
|
+
Feature: Mongo automatic breadcrumbs
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I set environment variable "BUGSNAG_API_KEY" to "a35a2a72bd230ac0aa0f52715bbdc6aa"
|
5
|
+
And I set environment variable "APP_PATH" to "/usr/src"
|
6
|
+
And I configure the bugsnag endpoint
|
7
|
+
|
8
|
+
Scenario Outline: Successful breadcrumbs
|
9
|
+
Given I set environment variable "RUBY_VERSION" to "<ruby_version>"
|
10
|
+
And I start the service "rails<rails_version>"
|
11
|
+
And I wait for the app to respond on port "6128<rails_version>"
|
12
|
+
When I navigate to the route "/mongo/success_crash" on port "6128<rails_version>"
|
13
|
+
Then I should receive a request
|
14
|
+
And the request is a valid for the error reporting API
|
15
|
+
And the request used the "Ruby Bugsnag Notifier" notifier
|
16
|
+
And the request contained the api key "a35a2a72bd230ac0aa0f52715bbdc6aa"
|
17
|
+
And the event has a "process" breadcrumb named "Mongo query succeeded"
|
18
|
+
And the event "breadcrumbs.1.timestamp" is a timestamp
|
19
|
+
And the event "breadcrumbs.1.metaData.event_name" equals "mongo.succeeded"
|
20
|
+
And the event "breadcrumbs.1.metaData.command_name" equals "insert"
|
21
|
+
And the event "breadcrumbs.1.metaData.database_name" equals "rails<rails_version>_development"
|
22
|
+
And the event "breadcrumbs.1.metaData.operation_id" is not null
|
23
|
+
And the event "breadcrumbs.1.metaData.request_id" is not null
|
24
|
+
And the event "breadcrumbs.1.metaData.duration" is not null
|
25
|
+
And the event "breadcrumbs.1.metaData.collection" equals "mongo_models"
|
26
|
+
|
27
|
+
Examples:
|
28
|
+
| ruby_version | rails_version |
|
29
|
+
| 2.2 | 4 |
|
30
|
+
| 2.2 | 5 |
|
31
|
+
| 2.3 | 4 |
|
32
|
+
| 2.3 | 5 |
|
33
|
+
| 2.4 | 5 |
|
34
|
+
| 2.5 | 5 |
|
35
|
+
|
36
|
+
Scenario Outline: Breadcrumb with filter parameters
|
37
|
+
Given I set environment variable "RUBY_VERSION" to "<ruby_version>"
|
38
|
+
And I start the service "rails<rails_version>"
|
39
|
+
And I wait for the app to respond on port "6128<rails_version>"
|
40
|
+
When I navigate to the route "/mongo/get_crash" on port "6128<rails_version>"
|
41
|
+
Then I should receive a request
|
42
|
+
And the request is a valid for the error reporting API
|
43
|
+
And the request used the "Ruby Bugsnag Notifier" notifier
|
44
|
+
And the request contained the api key "a35a2a72bd230ac0aa0f52715bbdc6aa"
|
45
|
+
And the event has a "process" breadcrumb named "Mongo query succeeded"
|
46
|
+
And the event "breadcrumbs.1.timestamp" is a timestamp
|
47
|
+
And the event "breadcrumbs.1.metaData.event_name" equals "mongo.succeeded"
|
48
|
+
And the event "breadcrumbs.1.metaData.command_name" equals "find"
|
49
|
+
And the event "breadcrumbs.1.metaData.database_name" equals "rails<rails_version>_development"
|
50
|
+
And the event "breadcrumbs.1.metaData.operation_id" is not null
|
51
|
+
And the event "breadcrumbs.1.metaData.request_id" is not null
|
52
|
+
And the event "breadcrumbs.1.metaData.duration" is not null
|
53
|
+
And the event "breadcrumbs.1.metaData.collection" equals "mongo_models"
|
54
|
+
And the event "breadcrumbs.1.metaData.filter" equals "{"string_field":"?"}"
|
55
|
+
And the event "breadcrumbs.2.timestamp" is a timestamp
|
56
|
+
And the event "breadcrumbs.2.metaData.event_name" equals "mongo.succeeded"
|
57
|
+
And the event "breadcrumbs.2.metaData.command_name" equals "find"
|
58
|
+
And the event "breadcrumbs.2.metaData.database_name" equals "rails<rails_version>_development"
|
59
|
+
And the event "breadcrumbs.2.metaData.operation_id" is not null
|
60
|
+
And the event "breadcrumbs.2.metaData.request_id" is not null
|
61
|
+
And the event "breadcrumbs.2.metaData.duration" is not null
|
62
|
+
And the event "breadcrumbs.2.metaData.collection" equals "mongo_models"
|
63
|
+
And the event "breadcrumbs.2.metaData.filter" equals "{"$or":[{"string_field":"?"},{"numeric_field":"?"}]}"
|
64
|
+
|
65
|
+
Examples:
|
66
|
+
| ruby_version | rails_version |
|
67
|
+
| 2.2 | 4 |
|
68
|
+
| 2.2 | 5 |
|
69
|
+
| 2.3 | 4 |
|
70
|
+
| 2.3 | 5 |
|
71
|
+
| 2.4 | 5 |
|
72
|
+
| 2.5 | 5 |
|
73
|
+
|
74
|
+
Scenario Outline: Failure breadcrumbs
|
75
|
+
Given I set environment variable "RUBY_VERSION" to "<ruby_version>"
|
76
|
+
And I start the service "rails<rails_version>"
|
77
|
+
And I wait for the app to respond on port "6128<rails_version>"
|
78
|
+
When I navigate to the route "/mongo/failure_crash" on port "6128<rails_version>"
|
79
|
+
Then I should receive a request
|
80
|
+
And the request is a valid for the error reporting API
|
81
|
+
And the request used the "Ruby Bugsnag Notifier" notifier
|
82
|
+
And the request contained the api key "a35a2a72bd230ac0aa0f52715bbdc6aa"
|
83
|
+
And the event has a "process" breadcrumb named "Mongo query failed"
|
84
|
+
And the event "breadcrumbs.1.timestamp" is a timestamp
|
85
|
+
And the event "breadcrumbs.1.metaData.event_name" equals "mongo.failed"
|
86
|
+
And the event "breadcrumbs.1.metaData.command_name" equals "bogus"
|
87
|
+
And the event "breadcrumbs.1.metaData.database_name" equals "rails<rails_version>_development"
|
88
|
+
And the event "breadcrumbs.1.metaData.operation_id" is not null
|
89
|
+
And the event "breadcrumbs.1.metaData.request_id" is not null
|
90
|
+
And the event "breadcrumbs.1.metaData.duration" is not null
|
91
|
+
And the event "breadcrumbs.1.metaData.collection" equals 1
|
92
|
+
|
93
|
+
Examples:
|
94
|
+
| ruby_version | rails_version |
|
95
|
+
| 2.2 | 4 |
|
96
|
+
| 2.2 | 5 |
|
97
|
+
| 2.3 | 4 |
|
98
|
+
| 2.3 | 5 |
|
99
|
+
| 2.4 | 5 |
|
100
|
+
| 2.5 | 5 |
|
@@ -22,4 +22,10 @@ Then(/^the "(.+)" of the top non-bugsnag stackframe equals (\d+|".+")(?: for req
|
|
22
22
|
steps %Q{
|
23
23
|
the "#{element}" of stack frame #{frame_index} equals #{value}
|
24
24
|
}
|
25
|
+
end
|
26
|
+
|
27
|
+
Then(/^the total sessionStarted count equals (\d+)(?: for request (\d+))?$/) do |value, request_index|
|
28
|
+
session_counts = read_key_path(find_request(request_index)[:body], "sessionCounts")
|
29
|
+
total_count = session_counts.inject(0) { |count, session| count += session["sessionsStarted"] }
|
30
|
+
assert_equal(value, total_count)
|
25
31
|
end
|
data/lib/bugsnag.rb
CHANGED
@@ -29,9 +29,13 @@ require "bugsnag/middleware/callbacks"
|
|
29
29
|
require "bugsnag/middleware/classify_error"
|
30
30
|
require "bugsnag/middleware/delayed_job"
|
31
31
|
|
32
|
+
require "bugsnag/breadcrumbs/validator"
|
33
|
+
require "bugsnag/breadcrumbs/breadcrumb"
|
34
|
+
require "bugsnag/breadcrumbs/breadcrumbs"
|
35
|
+
|
32
36
|
module Bugsnag
|
33
37
|
LOCK = Mutex.new
|
34
|
-
INTEGRATIONS = [:resque, :sidekiq, :mailman, :delayed_job, :shoryuken, :que]
|
38
|
+
INTEGRATIONS = [:resque, :sidekiq, :mailman, :delayed_job, :shoryuken, :que, :mongo]
|
35
39
|
|
36
40
|
NIL_EXCEPTION_DESCRIPTION = "'nil' was notified as an exception"
|
37
41
|
|
@@ -44,6 +48,7 @@ module Bugsnag
|
|
44
48
|
yield(configuration) if block_given?
|
45
49
|
|
46
50
|
check_key_valid if validate_api_key
|
51
|
+
check_endpoint_setup
|
47
52
|
|
48
53
|
register_at_exit
|
49
54
|
end
|
@@ -107,10 +112,12 @@ module Bugsnag
|
|
107
112
|
end
|
108
113
|
|
109
114
|
# Deliver
|
110
|
-
configuration.info("Notifying #{configuration.
|
115
|
+
configuration.info("Notifying #{configuration.notify_endpoint} of #{report.exceptions.last[:errorClass]}")
|
111
116
|
options = {:headers => report.headers}
|
112
117
|
payload = ::JSON.dump(Bugsnag::Helpers.trim_if_needed(report.as_json))
|
113
|
-
Bugsnag::Delivery[configuration.delivery_method].deliver(configuration.
|
118
|
+
Bugsnag::Delivery[configuration.delivery_method].deliver(configuration.notify_endpoint, payload, configuration, options)
|
119
|
+
report_summary = report.summary
|
120
|
+
leave_breadcrumb(report_summary[:error_class], report_summary, Bugsnag::Breadcrumbs::ERROR_BREADCRUMB_TYPE, :auto)
|
114
121
|
end
|
115
122
|
end
|
116
123
|
|
@@ -189,6 +196,39 @@ module Bugsnag
|
|
189
196
|
end
|
190
197
|
end
|
191
198
|
|
199
|
+
##
|
200
|
+
# Leave a breadcrumb to be attached to subsequent reports
|
201
|
+
#
|
202
|
+
# @param name [String] the main breadcrumb name/message
|
203
|
+
# @param meta_data [Hash] String, Numeric, or Boolean meta data to attach
|
204
|
+
# @param type [String] the breadcrumb type, from Bugsnag::Breadcrumbs::VALID_BREADCRUMB_TYPES
|
205
|
+
# @param auto [Symbol] set to :auto if the breadcrumb is automatically created
|
206
|
+
def leave_breadcrumb(name, meta_data={}, type=Bugsnag::Breadcrumbs::MANUAL_BREADCRUMB_TYPE, auto=:manual)
|
207
|
+
breadcrumb = Bugsnag::Breadcrumbs::Breadcrumb.new(name, type, meta_data, auto)
|
208
|
+
validator = Bugsnag::Breadcrumbs::Validator.new(configuration)
|
209
|
+
|
210
|
+
# Initial validation
|
211
|
+
validator.validate(breadcrumb)
|
212
|
+
|
213
|
+
# Skip if it's already invalid
|
214
|
+
unless breadcrumb.ignore?
|
215
|
+
# Run callbacks
|
216
|
+
configuration.before_breadcrumb_callbacks.each do |c|
|
217
|
+
c.arity > 0 ? c.call(breadcrumb) : c.call
|
218
|
+
break if breadcrumb.ignore?
|
219
|
+
end
|
220
|
+
|
221
|
+
# Return early if ignored
|
222
|
+
return if breadcrumb.ignore?
|
223
|
+
|
224
|
+
# Validate again in case of callback alteration
|
225
|
+
validator.validate(breadcrumb)
|
226
|
+
|
227
|
+
# Add to breadcrumbs buffer if still valid
|
228
|
+
configuration.breadcrumbs << breadcrumb unless breadcrumb.ignore?
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
192
232
|
private
|
193
233
|
|
194
234
|
def deliver_notification?(exception, auto_notify)
|
@@ -217,6 +257,22 @@ module Bugsnag
|
|
217
257
|
@key_warning = true
|
218
258
|
end
|
219
259
|
end
|
260
|
+
|
261
|
+
##
|
262
|
+
# Verifies the current endpoint setup
|
263
|
+
#
|
264
|
+
# If only a notify_endpoint has been set, session tracking will be disabled
|
265
|
+
# If only a session_endpoint has been set, and ArgumentError will be raised
|
266
|
+
def check_endpoint_setup
|
267
|
+
notify_set = configuration.notify_endpoint && configuration.notify_endpoint != Bugsnag::Configuration::DEFAULT_NOTIFY_ENDPOINT
|
268
|
+
session_set = configuration.session_endpoint && configuration.session_endpoint != Bugsnag::Configuration::DEFAULT_SESSION_ENDPOINT
|
269
|
+
if notify_set && !session_set
|
270
|
+
configuration.warn("The session endpoint has not been set, all further session capturing will be disabled")
|
271
|
+
configuration.disable_sessions
|
272
|
+
elsif !notify_set && session_set
|
273
|
+
raise ArgumentError, "The session endpoint cannot be modified without the notify endpoint"
|
274
|
+
end
|
275
|
+
end
|
220
276
|
end
|
221
277
|
end
|
222
278
|
|