bugsnag 6.22.1 → 6.23.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/CHANGELOG.md +51 -0
- data/VERSION +1 -1
- data/lib/bugsnag/breadcrumb_type.rb +14 -0
- data/lib/bugsnag/breadcrumbs/breadcrumb.rb +34 -1
- data/lib/bugsnag/breadcrumbs/breadcrumbs.rb +1 -0
- data/lib/bugsnag/breadcrumbs/on_breadcrumb_callback_list.rb +50 -0
- data/lib/bugsnag/configuration.rb +115 -5
- data/lib/bugsnag/delivery/synchronous.rb +2 -2
- data/lib/bugsnag/delivery/thread_queue.rb +2 -2
- data/lib/bugsnag/error.rb +25 -0
- data/lib/bugsnag/event.rb +7 -0
- data/lib/bugsnag/integrations/resque.rb +1 -1
- data/lib/bugsnag/middleware/active_job.rb +1 -1
- data/lib/bugsnag/middleware/delayed_job.rb +1 -1
- data/lib/bugsnag/middleware/exception_meta_data.rb +2 -0
- data/lib/bugsnag/middleware/rack_request.rb +2 -2
- data/lib/bugsnag/middleware/rails3_request.rb +2 -2
- data/lib/bugsnag/middleware/rake.rb +1 -1
- data/lib/bugsnag/middleware/sidekiq.rb +1 -1
- data/lib/bugsnag/report.rb +129 -5
- data/lib/bugsnag/session_tracker.rb +3 -7
- data/lib/bugsnag/tasks/bugsnag.rake +1 -1
- data/lib/bugsnag/utility/metadata_delegate.rb +102 -0
- data/lib/bugsnag.rb +48 -2
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 763fc185ada81aaefdfb19edc7ca88788921c4577ec3e5a76addadcd8e13227c
|
4
|
+
data.tar.gz: 47661582b92e719b81f9023678dac8fcd558dd641ae124e0305b3f32157ccdd7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5de707cdf88e2c4d46cbfcd6fde2dad857c584c366788ea31dffa0b62c80d9a8dea9e8cf030306f70e793bff3999b92ae5c165309eb48d4fab2d77453160cd33
|
7
|
+
data.tar.gz: f23a0d06302491091fc15d209bd09e45f1a47017467f163e1ea36fd4702dbadf1c395e36fb71283261d78c505dc6f2459ad7a7da9052989f81200f6df3c0b7ba
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,57 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
## v6.23.0 (21 September 2021)
|
5
|
+
|
6
|
+
### Enhancements
|
7
|
+
|
8
|
+
* Sessions will now be delivered every 10 seconds, instead of every 30 seconds
|
9
|
+
| [#680](https://github.com/bugsnag/bugsnag-ruby/pull/680)
|
10
|
+
* Log errors that prevent delivery at `ERROR` level
|
11
|
+
| [#681](https://github.com/bugsnag/bugsnag-ruby/pull/681)
|
12
|
+
* Add `on_breadcrumb` callbacks to replace `before_breadcrumb_callbacks`
|
13
|
+
| [#686](https://github.com/bugsnag/bugsnag-ruby/pull/686)
|
14
|
+
* Add `context` attribute to configuration, which will be used as the default context for events. Using this option will disable automatic context setting
|
15
|
+
| [#687](https://github.com/bugsnag/bugsnag-ruby/pull/687)
|
16
|
+
| [#688](https://github.com/bugsnag/bugsnag-ruby/pull/688)
|
17
|
+
* Add `Bugsnag#breadcrumbs` getter to fetch the current list of breadcrumbs
|
18
|
+
| [#689](https://github.com/bugsnag/bugsnag-ruby/pull/689)
|
19
|
+
* Add `time` (an ISO8601 string in UTC) to `device` metadata
|
20
|
+
| [#690](https://github.com/bugsnag/bugsnag-ruby/pull/690)
|
21
|
+
* Add `errors` to `Report`/`Event` containing an array of `Error` objects. The `Error` object contains `error_class`, `error_message`, `stacktrace` and `type` (always "ruby")
|
22
|
+
| [#691](https://github.com/bugsnag/bugsnag-ruby/pull/691)
|
23
|
+
* Add `original_error` to `Report`/`Event` containing the original Exception instance
|
24
|
+
| [#692](https://github.com/bugsnag/bugsnag-ruby/pull/692)
|
25
|
+
* Add `request` to `Report`/`Event` containing HTTP request metadata
|
26
|
+
| [#693](https://github.com/bugsnag/bugsnag-ruby/pull/693)
|
27
|
+
* Add `add_metadata` and `clear_metadata` to `Report`/`Event`
|
28
|
+
| [#694](https://github.com/bugsnag/bugsnag-ruby/pull/694)
|
29
|
+
* Add `set_user` to `Report`/`Event`
|
30
|
+
| [#695](https://github.com/bugsnag/bugsnag-ruby/pull/695)
|
31
|
+
|
32
|
+
### Fixes
|
33
|
+
|
34
|
+
* Avoid starting session delivery thread when the current release stage is not enabled
|
35
|
+
| [#677](https://github.com/bugsnag/bugsnag-ruby/pull/677)
|
36
|
+
|
37
|
+
### Deprecated
|
38
|
+
|
39
|
+
* `before_breadcrumb_callbacks` have been deprecated in favour of `on_breadcrumb` callbacks and will be removed in the next major release
|
40
|
+
* For consistency with Bugsnag notifiers for other languages, a number of methods have been deprecated in this release. The old options will be removed in the next major version | [#676](https://github.com/bugsnag/bugsnag-ruby/pull/676)
|
41
|
+
* The `notify_release_stages` configuration option has been deprecated in favour of `enabled_release_stages`
|
42
|
+
* The `auto_capture_sessions` and `track_sessions` configuration options have been deprecated in favour of `auto_track_sessions`
|
43
|
+
* The `enabled_automatic_breadcrumb_types` configuration option has been deprecated in favour of `enabled_breadcrumb_types`
|
44
|
+
* The `Report` class has been deprecated in favour of the `Event` class
|
45
|
+
* The `Report#meta_data` attribute has been deprecated in favour of `Event#metadata`
|
46
|
+
* The `Breadcrumb#meta_data` attribute has been deprecated in favour of `Breadcrumb#metadata`
|
47
|
+
* The `Breadcrumb#name` attribute has been deprecated in favour of `Breadcrumb#message`
|
48
|
+
* The breadcrumb type constants in the `Bugsnag::Breadcrumbs` module has been deprecated in favour of the constants available in the `Bugsnag::BreadcrumbType` module
|
49
|
+
For example, `Bugsnag::Breadcrumbs::ERROR_BREADCRUMB_TYPE` is now available as `Bugsnag::BreadcrumbType::ERROR`
|
50
|
+
* `Report#exceptions` has been deprecated in favour of the new `errors` property
|
51
|
+
* `Report#raw_exceptions` has been deprecated in favour of the new `original_error` property
|
52
|
+
* Accessing request data via `Report#metadata` has been deprecated in favour of using the new `request` property. Request data will be moved out of metadata in the next major version
|
53
|
+
* The `Report#add_tab` and `Report#remove_tab` methods have been deprecated in favour of the new `add_metadata` and `clear_metadata` methods
|
54
|
+
|
4
55
|
## v6.22.1 (11 August 2021)
|
5
56
|
|
6
57
|
### Fixes
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
6.
|
1
|
+
6.23.0
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "bugsnag/breadcrumbs/breadcrumbs"
|
2
|
+
|
3
|
+
module Bugsnag
|
4
|
+
module BreadcrumbType
|
5
|
+
ERROR = Bugsnag::Breadcrumbs::ERROR_BREADCRUMB_TYPE
|
6
|
+
LOG = Bugsnag::Breadcrumbs::LOG_BREADCRUMB_TYPE
|
7
|
+
MANUAL = Bugsnag::Breadcrumbs::MANUAL_BREADCRUMB_TYPE
|
8
|
+
NAVIGATION = Bugsnag::Breadcrumbs::NAVIGATION_BREADCRUMB_TYPE
|
9
|
+
PROCESS = Bugsnag::Breadcrumbs::PROCESS_BREADCRUMB_TYPE
|
10
|
+
REQUEST = Bugsnag::Breadcrumbs::REQUEST_BREADCRUMB_TYPE
|
11
|
+
STATE = Bugsnag::Breadcrumbs::STATE_BREADCRUMB_TYPE
|
12
|
+
USER = Bugsnag::Breadcrumbs::USER_BREADCRUMB_TYPE
|
13
|
+
end
|
14
|
+
end
|
@@ -1,11 +1,13 @@
|
|
1
1
|
module Bugsnag::Breadcrumbs
|
2
2
|
class Breadcrumb
|
3
|
+
# @deprecated Use {#message} instead
|
3
4
|
# @return [String] the breadcrumb name
|
4
5
|
attr_accessor :name
|
5
6
|
|
6
7
|
# @return [String] the breadcrumb type
|
7
8
|
attr_accessor :type
|
8
9
|
|
10
|
+
# @deprecated Use {#metadata} instead
|
9
11
|
# @return [Hash, nil] metadata hash containing strings, numbers, or booleans, or nil
|
10
12
|
attr_accessor :meta_data
|
11
13
|
|
@@ -23,7 +25,7 @@ module Bugsnag::Breadcrumbs
|
|
23
25
|
# @api private
|
24
26
|
#
|
25
27
|
# @param name [String] the breadcrumb name
|
26
|
-
# @param type [String] the breadcrumb type from Bugsnag::
|
28
|
+
# @param type [String] the breadcrumb type from Bugsnag::BreadcrumbType
|
27
29
|
# @param meta_data [Hash, nil] a hash containing strings, numbers, or booleans, or nil
|
28
30
|
# @param auto [Symbol] set to `:auto` if the breadcrumb is automatically generated
|
29
31
|
def initialize(name, type, meta_data, auto)
|
@@ -72,5 +74,36 @@ module Bugsnag::Breadcrumbs
|
|
72
74
|
:timestamp => @timestamp.iso8601(3)
|
73
75
|
}
|
74
76
|
end
|
77
|
+
|
78
|
+
# TODO: "message" and "metadata" can be simple attr_accessors when they
|
79
|
+
# replace "name" and "meta_data"
|
80
|
+
# NOTE: these are not aliases as YARD doesn't allow documenting the non-alias
|
81
|
+
# as deprecated without also marking the alias as deprecated
|
82
|
+
|
83
|
+
# The breadcrumb message
|
84
|
+
# @!attribute message
|
85
|
+
# @return [String]
|
86
|
+
def message
|
87
|
+
@name
|
88
|
+
end
|
89
|
+
|
90
|
+
# @param message [String]
|
91
|
+
# @return [void]
|
92
|
+
def message=(message)
|
93
|
+
@name = message
|
94
|
+
end
|
95
|
+
|
96
|
+
# A Hash containing arbitrary metadata associated with this breadcrumb
|
97
|
+
# @!attribute metadata
|
98
|
+
# @return [Hash, nil]
|
99
|
+
def metadata
|
100
|
+
@meta_data
|
101
|
+
end
|
102
|
+
|
103
|
+
# @param metadata [Hash, nil]
|
104
|
+
# @return [void]
|
105
|
+
def metadata=(metadata)
|
106
|
+
@meta_data = metadata
|
107
|
+
end
|
75
108
|
end
|
76
109
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require "set"
|
2
|
+
|
3
|
+
module Bugsnag::Breadcrumbs
|
4
|
+
class OnBreadcrumbCallbackList
|
5
|
+
def initialize(configuration)
|
6
|
+
@callbacks = Set.new
|
7
|
+
@mutex = Mutex.new
|
8
|
+
@configuration = configuration
|
9
|
+
end
|
10
|
+
|
11
|
+
##
|
12
|
+
# @param callback [Proc, Method, #call]
|
13
|
+
# @return [void]
|
14
|
+
def add(callback)
|
15
|
+
@mutex.synchronize do
|
16
|
+
@callbacks.add(callback)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
##
|
21
|
+
# @param callback [Proc, Method, #call]
|
22
|
+
# @return [void]
|
23
|
+
def remove(callback)
|
24
|
+
@mutex.synchronize do
|
25
|
+
@callbacks.delete(callback)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# @param breadcrumb [Breadcrumb]
|
31
|
+
# @return [void]
|
32
|
+
def call(breadcrumb)
|
33
|
+
@callbacks.each do |callback|
|
34
|
+
begin
|
35
|
+
should_continue = callback.call(breadcrumb)
|
36
|
+
rescue StandardError => e
|
37
|
+
@configuration.warn("Error occurred in on_breadcrumb callback: '#{e}'")
|
38
|
+
@configuration.warn("on_breadcrumb callback stacktrace: #{e.backtrace.inspect}")
|
39
|
+
end
|
40
|
+
|
41
|
+
# only stop if should_continue is explicity 'false' to allow callbacks
|
42
|
+
# to return 'nil'
|
43
|
+
if should_continue == false
|
44
|
+
breadcrumb.ignore!
|
45
|
+
break
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -12,6 +12,7 @@ require "bugsnag/middleware/session_data"
|
|
12
12
|
require "bugsnag/middleware/breadcrumbs"
|
13
13
|
require "bugsnag/utility/circular_buffer"
|
14
14
|
require "bugsnag/breadcrumbs/breadcrumbs"
|
15
|
+
require "bugsnag/breadcrumbs/on_breadcrumb_callback_list"
|
15
16
|
|
16
17
|
module Bugsnag
|
17
18
|
class Configuration
|
@@ -24,6 +25,7 @@ module Bugsnag
|
|
24
25
|
attr_accessor :release_stage
|
25
26
|
|
26
27
|
# A list of which release stages should cause notifications to be sent
|
28
|
+
# @deprecated Use {#enabled_release_stages} instead
|
27
29
|
# @return [Array<String>, nil]
|
28
30
|
attr_accessor :notify_release_stages
|
29
31
|
|
@@ -104,6 +106,7 @@ module Bugsnag
|
|
104
106
|
attr_accessor :discard_classes
|
105
107
|
|
106
108
|
# Whether Bugsnag should automatically record sessions
|
109
|
+
# @deprecated Use {#auto_track_sessions} instead
|
107
110
|
# @return [Boolean]
|
108
111
|
attr_accessor :auto_capture_sessions
|
109
112
|
|
@@ -125,7 +128,8 @@ module Bugsnag
|
|
125
128
|
attr_reader :enable_sessions
|
126
129
|
|
127
130
|
# A list of strings indicating allowable automatic breadcrumb types
|
128
|
-
# @
|
131
|
+
# @deprecated Use {#enabled_breadcrumb_types} instead
|
132
|
+
# @see Bugsnag::BreadcrumbType
|
129
133
|
# @return [Array<String>]
|
130
134
|
attr_accessor :enabled_automatic_breadcrumb_types
|
131
135
|
|
@@ -141,10 +145,20 @@ module Bugsnag
|
|
141
145
|
# @return [Regexp]
|
142
146
|
attr_accessor :vendor_path
|
143
147
|
|
148
|
+
# The default context for all future events
|
149
|
+
# Setting this will disable automatic context setting
|
150
|
+
# @return [String, nil]
|
151
|
+
attr_accessor :context
|
152
|
+
|
144
153
|
# @api private
|
145
154
|
# @return [Array<String>]
|
146
155
|
attr_reader :scopes_to_filter
|
147
156
|
|
157
|
+
# Expose on_breadcrumb_callbacks internally for Bugsnag.leave_breadcrumb
|
158
|
+
# @api private
|
159
|
+
# @return [Breadcrumbs::OnBreadcrumbCallbackList]
|
160
|
+
attr_reader :on_breadcrumb_callbacks
|
161
|
+
|
148
162
|
API_KEY_REGEX = /[0-9a-f]{32}/i
|
149
163
|
THREAD_LOCAL_NAME = "bugsnag_req_data"
|
150
164
|
|
@@ -193,6 +207,7 @@ module Bugsnag
|
|
193
207
|
# All valid breadcrumb types should be allowable initially
|
194
208
|
self.enabled_automatic_breadcrumb_types = Bugsnag::Breadcrumbs::VALID_BREADCRUMB_TYPES.dup
|
195
209
|
self.before_breadcrumb_callbacks = []
|
210
|
+
@on_breadcrumb_callbacks = Breadcrumbs::OnBreadcrumbCallbackList.new(self)
|
196
211
|
|
197
212
|
# Store max_breadcrumbs here instead of outputting breadcrumbs.max_items
|
198
213
|
# to avoid infinite recursion when creating breadcrumb buffer
|
@@ -389,15 +404,23 @@ module Bugsnag
|
|
389
404
|
##
|
390
405
|
# Logs a warning level message
|
391
406
|
#
|
392
|
-
# @param
|
407
|
+
# @param message [String, #to_s] The message to log
|
393
408
|
def warn(message)
|
394
409
|
logger.warn(PROG_NAME) { message }
|
395
410
|
end
|
396
411
|
|
412
|
+
##
|
413
|
+
# Logs an error level message
|
414
|
+
#
|
415
|
+
# @param message [String, #to_s] The message to log
|
416
|
+
def error(message)
|
417
|
+
logger.error(PROG_NAME) { message }
|
418
|
+
end
|
419
|
+
|
397
420
|
##
|
398
421
|
# Logs a debug level message
|
399
422
|
#
|
400
|
-
# @param
|
423
|
+
# @param message [String, #to_s] The message to log
|
401
424
|
def debug(message)
|
402
425
|
logger.debug(PROG_NAME) { message }
|
403
426
|
end
|
@@ -426,9 +449,12 @@ module Bugsnag
|
|
426
449
|
end
|
427
450
|
|
428
451
|
##
|
429
|
-
# Returns the
|
452
|
+
# Returns the current list of breadcrumbs
|
430
453
|
#
|
431
|
-
#
|
454
|
+
# This is a per-thread circular buffer, containing at most 'max_breadcrumbs'
|
455
|
+
# breadcrumbs
|
456
|
+
#
|
457
|
+
# @return [Bugsnag::Utility::CircularBuffer]
|
432
458
|
def breadcrumbs
|
433
459
|
request_data[:breadcrumbs] ||= Bugsnag::Utility::CircularBuffer.new(@max_breadcrumbs)
|
434
460
|
end
|
@@ -503,6 +529,90 @@ module Bugsnag
|
|
503
529
|
middleware.remove(callback)
|
504
530
|
end
|
505
531
|
|
532
|
+
##
|
533
|
+
# Add the given callback to the list of on_breadcrumb callbacks
|
534
|
+
#
|
535
|
+
# The on_breadcrumb callbacks will be called when a breadcrumb is left and
|
536
|
+
# are passed the {Breadcrumbs::Breadcrumb Breadcrumb} object
|
537
|
+
#
|
538
|
+
# Returning false from an on_breadcrumb callback will cause the breadcrumb
|
539
|
+
# to be ignored and will prevent any remaining callbacks from being called
|
540
|
+
#
|
541
|
+
# @param callback [Proc, Method, #call]
|
542
|
+
# @return [void]
|
543
|
+
def add_on_breadcrumb(callback)
|
544
|
+
@on_breadcrumb_callbacks.add(callback)
|
545
|
+
end
|
546
|
+
|
547
|
+
##
|
548
|
+
# Remove the given callback from the list of on_breadcrumb callbacks
|
549
|
+
#
|
550
|
+
# Note that this must be the same instance that was passed to
|
551
|
+
# {add_on_breadcrumb}, otherwise it will not be removed
|
552
|
+
#
|
553
|
+
# @param callback [Proc, Method, #call]
|
554
|
+
# @return [void]
|
555
|
+
def remove_on_breadcrumb(callback)
|
556
|
+
@on_breadcrumb_callbacks.remove(callback)
|
557
|
+
end
|
558
|
+
|
559
|
+
##
|
560
|
+
# Has the context been explicitly set?
|
561
|
+
#
|
562
|
+
# This is necessary to differentiate between the context not being set and
|
563
|
+
# the context being set to 'nil' explicitly
|
564
|
+
#
|
565
|
+
# @api private
|
566
|
+
# @return [Boolean]
|
567
|
+
def context_set?
|
568
|
+
defined?(@context) != nil
|
569
|
+
end
|
570
|
+
|
571
|
+
# TODO: These methods can be a simple attr_accessor when they replace the
|
572
|
+
# methods they are aliasing
|
573
|
+
# NOTE: they are not aliases as YARD doesn't allow documenting the non-alias
|
574
|
+
# as deprecated without also marking the alias as deprecated
|
575
|
+
|
576
|
+
# A list of which release stages should cause notifications to be sent
|
577
|
+
# @!attribute enabled_release_stages
|
578
|
+
# @return [Array<String>, nil]
|
579
|
+
def enabled_release_stages
|
580
|
+
@notify_release_stages
|
581
|
+
end
|
582
|
+
|
583
|
+
# @param release_stages [Array<String>, nil]
|
584
|
+
# @return [void]
|
585
|
+
def enabled_release_stages=(release_stages)
|
586
|
+
@notify_release_stages = release_stages
|
587
|
+
end
|
588
|
+
|
589
|
+
# A list of breadcrumb types that Bugsnag will collect automatically
|
590
|
+
# @!attribute enabled_breadcrumb_types
|
591
|
+
# @see Bugsnag::BreadcrumbType
|
592
|
+
# @return [Array<String>]
|
593
|
+
def enabled_breadcrumb_types
|
594
|
+
@enabled_automatic_breadcrumb_types
|
595
|
+
end
|
596
|
+
|
597
|
+
# @param breadcrumb_types [Array<String>]
|
598
|
+
# @return [void]
|
599
|
+
def enabled_breadcrumb_types=(breadcrumb_types)
|
600
|
+
@enabled_automatic_breadcrumb_types = breadcrumb_types
|
601
|
+
end
|
602
|
+
|
603
|
+
# Whether sessions should be tracked automatically
|
604
|
+
# @!attribute auto_track_sessions
|
605
|
+
# @return [Boolean]
|
606
|
+
def auto_track_sessions
|
607
|
+
@auto_capture_sessions
|
608
|
+
end
|
609
|
+
|
610
|
+
# @param track_sessions [Boolean]
|
611
|
+
# @return [void]
|
612
|
+
def auto_track_sessions=(track_sessions)
|
613
|
+
@auto_capture_sessions = track_sessions
|
614
|
+
end
|
615
|
+
|
506
616
|
private
|
507
617
|
|
508
618
|
attr_writer :scopes_to_filter
|
@@ -18,8 +18,8 @@ module Bugsnag
|
|
18
18
|
# KLUDGE: Since we don't re-raise http exceptions, this breaks rspec
|
19
19
|
raise if e.class.to_s == "RSpec::Expectations::ExpectationNotMetError"
|
20
20
|
|
21
|
-
configuration.
|
22
|
-
configuration.
|
21
|
+
configuration.error("Unable to send information to Bugsnag (#{url}), #{e.inspect}")
|
22
|
+
configuration.error(e.backtrace)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -31,8 +31,8 @@ module Bugsnag
|
|
31
31
|
begin
|
32
32
|
payload = get_payload.call
|
33
33
|
rescue StandardError => e
|
34
|
-
configuration.
|
35
|
-
configuration.
|
34
|
+
configuration.error("Unable to send information to Bugsnag (#{url}), #{e.inspect}")
|
35
|
+
configuration.error(e.backtrace)
|
36
36
|
end
|
37
37
|
|
38
38
|
Synchronous.deliver(url, payload, configuration, options) unless payload.nil?
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Bugsnag
|
2
|
+
class Error
|
3
|
+
# @return [String] the error's class name
|
4
|
+
attr_accessor :error_class
|
5
|
+
|
6
|
+
# @return [String] the error's message
|
7
|
+
attr_accessor :error_message
|
8
|
+
|
9
|
+
# @return [Hash] the error's processed stacktrace
|
10
|
+
attr_reader :stacktrace
|
11
|
+
|
12
|
+
# @return [String] the type of error (always "ruby")
|
13
|
+
attr_accessor :type
|
14
|
+
|
15
|
+
# @api private
|
16
|
+
TYPE = "ruby".freeze
|
17
|
+
|
18
|
+
def initialize(error_class, error_message, stacktrace)
|
19
|
+
@error_class = error_class
|
20
|
+
@error_message = error_message
|
21
|
+
@stacktrace = stacktrace
|
22
|
+
@type = TYPE
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -30,7 +30,7 @@ module Bugsnag::Middleware
|
|
30
30
|
payload_data = construct_job_payload(job.payload_object)
|
31
31
|
|
32
32
|
context = get_context(payload_data, job_data[:active_job])
|
33
|
-
report.
|
33
|
+
report.automatic_context = context unless context.nil?
|
34
34
|
|
35
35
|
job_data[:payload] = payload_data
|
36
36
|
end
|
@@ -16,6 +16,8 @@ module Bugsnag::Middleware
|
|
16
16
|
|
17
17
|
if exception.respond_to?(:bugsnag_context)
|
18
18
|
context = exception.bugsnag_context
|
19
|
+
# note: this should set 'context' not 'automatic_context' as it's a
|
20
|
+
# user-supplied value
|
19
21
|
report.context = context if context.is_a?(String)
|
20
22
|
end
|
21
23
|
|
@@ -18,8 +18,8 @@ module Bugsnag::Middleware
|
|
18
18
|
client_ip = request.ip.to_s rescue SPOOF
|
19
19
|
session = env["rack.session"]
|
20
20
|
|
21
|
-
# Set the context
|
22
|
-
report.
|
21
|
+
# Set the automatic context
|
22
|
+
report.automatic_context = "#{request.request_method} #{request.path}"
|
23
23
|
|
24
24
|
# Set a sensible default for user_id
|
25
25
|
report.user["id"] = request.ip
|
@@ -15,8 +15,8 @@ module Bugsnag::Middleware
|
|
15
15
|
client_ip = env["action_dispatch.remote_ip"].to_s rescue SPOOF
|
16
16
|
|
17
17
|
if params
|
18
|
-
# Set the context
|
19
|
-
report.
|
18
|
+
# Set the automatic context
|
19
|
+
report.automatic_context = "#{params[:controller]}##{params[:action]}"
|
20
20
|
|
21
21
|
# Augment the request tab
|
22
22
|
report.add_tab(:request, {
|
@@ -10,7 +10,7 @@ module Bugsnag::Middleware
|
|
10
10
|
sidekiq = report.request_data[:sidekiq]
|
11
11
|
if sidekiq
|
12
12
|
report.add_tab(:sidekiq, sidekiq)
|
13
|
-
report.
|
13
|
+
report.automatic_context ||= "#{sidekiq[:msg]['wrapped'] || sidekiq[:msg]['class']}@#{sidekiq[:msg]['queue']}"
|
14
14
|
end
|
15
15
|
@bugsnag.call(report)
|
16
16
|
end
|
data/lib/bugsnag/report.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
require "json"
|
2
2
|
require "pathname"
|
3
|
+
require "bugsnag/error"
|
3
4
|
require "bugsnag/stacktrace"
|
4
5
|
|
5
6
|
module Bugsnag
|
7
|
+
# rubocop:todo Metrics/ClassLength
|
6
8
|
class Report
|
7
9
|
NOTIFIER_NAME = "Ruby Bugsnag Notifier"
|
8
10
|
NOTIFIER_VERSION = Bugsnag::VERSION
|
@@ -45,16 +47,13 @@ module Bugsnag
|
|
45
47
|
# @return [Configuration]
|
46
48
|
attr_accessor :configuration
|
47
49
|
|
48
|
-
# Additional context for this report
|
49
|
-
# @return [String, nil]
|
50
|
-
attr_accessor :context
|
51
|
-
|
52
50
|
# The delivery method that will be used for this report
|
53
51
|
# @see Configuration#delivery_method
|
54
52
|
# @return [Symbol]
|
55
53
|
attr_accessor :delivery_method
|
56
54
|
|
57
55
|
# The list of exceptions in this report
|
56
|
+
# @deprecated Use {#errors} instead
|
58
57
|
# @return [Array<Hash>]
|
59
58
|
attr_accessor :exceptions
|
60
59
|
|
@@ -72,10 +71,12 @@ module Bugsnag
|
|
72
71
|
attr_accessor :grouping_hash
|
73
72
|
|
74
73
|
# Arbitrary metadata attached to this report
|
74
|
+
# @deprecated Use {#metadata} instead
|
75
75
|
# @return [Hash]
|
76
76
|
attr_accessor :meta_data
|
77
77
|
|
78
78
|
# The raw Exception instances for this report
|
79
|
+
# @deprecated Use {#original_error} instead
|
79
80
|
# @see #exceptions
|
80
81
|
# @return [Array<Exception>]
|
81
82
|
attr_accessor :raw_exceptions
|
@@ -102,21 +103,35 @@ module Bugsnag
|
|
102
103
|
# @return [Hash]
|
103
104
|
attr_accessor :user
|
104
105
|
|
106
|
+
# A list of errors in this report
|
107
|
+
# @return [Array<Error>]
|
108
|
+
attr_reader :errors
|
109
|
+
|
110
|
+
# The Exception instance this report was created for
|
111
|
+
# @return [Exception]
|
112
|
+
attr_reader :original_error
|
113
|
+
|
105
114
|
##
|
106
115
|
# Initializes a new report from an exception.
|
107
116
|
def initialize(exception, passed_configuration, auto_notify=false)
|
117
|
+
# store the creation time for use as device.time
|
118
|
+
@created_at = Time.now.utc.iso8601(3)
|
119
|
+
|
108
120
|
@should_ignore = false
|
109
121
|
@unhandled = auto_notify
|
110
122
|
|
111
123
|
self.configuration = passed_configuration
|
112
124
|
|
125
|
+
@original_error = exception
|
113
126
|
self.raw_exceptions = generate_raw_exceptions(exception)
|
114
127
|
self.exceptions = generate_exception_list
|
128
|
+
@errors = generate_error_list
|
115
129
|
|
116
130
|
self.api_key = configuration.api_key
|
117
131
|
self.app_type = configuration.app_type
|
118
132
|
self.app_version = configuration.app_version
|
119
133
|
self.breadcrumbs = []
|
134
|
+
self.context = configuration.context if configuration.context_set?
|
120
135
|
self.delivery_method = configuration.delivery_method
|
121
136
|
self.hostname = configuration.hostname
|
122
137
|
self.runtime_versions = configuration.runtime_versions.dup
|
@@ -125,8 +140,29 @@ module Bugsnag
|
|
125
140
|
self.severity = auto_notify ? "error" : "warning"
|
126
141
|
self.severity_reason = auto_notify ? {:type => UNHANDLED_EXCEPTION} : {:type => HANDLED_EXCEPTION}
|
127
142
|
self.user = {}
|
143
|
+
|
144
|
+
@metadata_delegate = Utility::MetadataDelegate.new
|
128
145
|
end
|
129
146
|
|
147
|
+
##
|
148
|
+
# Additional context for this report
|
149
|
+
# @!attribute context
|
150
|
+
# @return [String, nil]
|
151
|
+
def context
|
152
|
+
return @context if defined?(@context)
|
153
|
+
|
154
|
+
@automatic_context
|
155
|
+
end
|
156
|
+
|
157
|
+
attr_writer :context
|
158
|
+
|
159
|
+
##
|
160
|
+
# Context set automatically by Bugsnag uses this attribute, which prevents
|
161
|
+
# it from overwriting the user-supplied context
|
162
|
+
# @api private
|
163
|
+
# @return [String, nil]
|
164
|
+
attr_accessor :automatic_context
|
165
|
+
|
130
166
|
##
|
131
167
|
# Add a new metadata tab to this notification.
|
132
168
|
#
|
@@ -135,6 +171,8 @@ module Bugsnag
|
|
135
171
|
# exists, this will be merged with the existing values. If a Hash is not
|
136
172
|
# given, the value will be placed into the 'custom' tab
|
137
173
|
# @return [void]
|
174
|
+
#
|
175
|
+
# @deprecated Use {#add_metadata} instead
|
138
176
|
def add_tab(name, value)
|
139
177
|
return if name.nil?
|
140
178
|
|
@@ -153,6 +191,8 @@ module Bugsnag
|
|
153
191
|
#
|
154
192
|
# @param name [String]
|
155
193
|
# @return [void]
|
194
|
+
#
|
195
|
+
# @deprecated Use {#clear_metadata} instead
|
156
196
|
def remove_tab(name)
|
157
197
|
return if name.nil?
|
158
198
|
|
@@ -175,7 +215,8 @@ module Bugsnag
|
|
175
215
|
context: context,
|
176
216
|
device: {
|
177
217
|
hostname: hostname,
|
178
|
-
runtimeVersions: runtime_versions
|
218
|
+
runtimeVersions: runtime_versions,
|
219
|
+
time: @created_at
|
179
220
|
},
|
180
221
|
exceptions: exceptions,
|
181
222
|
groupingHash: grouping_hash,
|
@@ -257,6 +298,82 @@ module Bugsnag
|
|
257
298
|
end
|
258
299
|
end
|
259
300
|
|
301
|
+
# A Hash containing arbitrary metadata
|
302
|
+
# @!attribute metadata
|
303
|
+
# @return [Hash]
|
304
|
+
def metadata
|
305
|
+
@meta_data
|
306
|
+
end
|
307
|
+
|
308
|
+
# @param metadata [Hash]
|
309
|
+
# @return [void]
|
310
|
+
def metadata=(metadata)
|
311
|
+
@meta_data = metadata
|
312
|
+
end
|
313
|
+
|
314
|
+
##
|
315
|
+
# Data from the current HTTP request. May be nil if no data has been recorded
|
316
|
+
#
|
317
|
+
# @return [Hash, nil]
|
318
|
+
def request
|
319
|
+
@meta_data[:request]
|
320
|
+
end
|
321
|
+
|
322
|
+
##
|
323
|
+
# Add values to metadata
|
324
|
+
#
|
325
|
+
# @overload add_metadata(section, data)
|
326
|
+
# Merges data into the given section of metadata
|
327
|
+
# @param section [String, Symbol]
|
328
|
+
# @param data [Hash]
|
329
|
+
#
|
330
|
+
# @overload add_metadata(section, key, value)
|
331
|
+
# Sets key to value in the given section of metadata. If the value is nil
|
332
|
+
# the key will be deleted
|
333
|
+
# @param section [String, Symbol]
|
334
|
+
# @param key [String, Symbol]
|
335
|
+
# @param value
|
336
|
+
#
|
337
|
+
# @return [void]
|
338
|
+
def add_metadata(section, key_or_data, *args)
|
339
|
+
@metadata_delegate.add_metadata(@meta_data, section, key_or_data, *args)
|
340
|
+
end
|
341
|
+
|
342
|
+
##
|
343
|
+
# Clear values from metadata
|
344
|
+
#
|
345
|
+
# @overload clear_metadata(section)
|
346
|
+
# Clears the given section of metadata
|
347
|
+
# @param section [String, Symbol]
|
348
|
+
#
|
349
|
+
# @overload clear_metadata(section, key)
|
350
|
+
# Clears the key in the given section of metadata
|
351
|
+
# @param section [String, Symbol]
|
352
|
+
# @param key [String, Symbol]
|
353
|
+
#
|
354
|
+
# @return [void]
|
355
|
+
def clear_metadata(section, *args)
|
356
|
+
@metadata_delegate.clear_metadata(@meta_data, section, *args)
|
357
|
+
end
|
358
|
+
|
359
|
+
##
|
360
|
+
# Set information about the current user
|
361
|
+
#
|
362
|
+
# Additional user fields can be added as metadata in a "user" section
|
363
|
+
#
|
364
|
+
# Setting a field to 'nil' will remove it from the user data
|
365
|
+
#
|
366
|
+
# @param id [String, nil]
|
367
|
+
# @param email [String, nil]
|
368
|
+
# @param name [String, nil]
|
369
|
+
# @return [void]
|
370
|
+
def set_user(id = nil, email = nil, name = nil)
|
371
|
+
new_user = { id: id, email: email, name: name }
|
372
|
+
new_user.reject! { |key, value| value.nil? }
|
373
|
+
|
374
|
+
@user = new_user
|
375
|
+
end
|
376
|
+
|
260
377
|
private
|
261
378
|
|
262
379
|
def generate_exception_list
|
@@ -269,6 +386,12 @@ module Bugsnag
|
|
269
386
|
end
|
270
387
|
end
|
271
388
|
|
389
|
+
def generate_error_list
|
390
|
+
exceptions.map do |exception|
|
391
|
+
Error.new(exception[:errorClass], exception[:message], exception[:stacktrace])
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
272
395
|
def error_class(exception)
|
273
396
|
# The "Class" check is for some strange exceptions like Timeout::Error
|
274
397
|
# which throw the error class instead of an instance
|
@@ -311,4 +434,5 @@ module Bugsnag
|
|
311
434
|
exceptions
|
312
435
|
end
|
313
436
|
end
|
437
|
+
# rubocop:enable Metrics/ClassLength
|
314
438
|
end
|
@@ -35,7 +35,8 @@ module Bugsnag
|
|
35
35
|
#
|
36
36
|
# This allows Bugsnag to track error rates for a release.
|
37
37
|
def start_session
|
38
|
-
return unless Bugsnag.configuration.enable_sessions
|
38
|
+
return unless Bugsnag.configuration.enable_sessions && Bugsnag.configuration.should_notify_release_stage?
|
39
|
+
|
39
40
|
start_delivery_thread
|
40
41
|
start_time = Time.now().utc().strftime('%Y-%m-%dT%H:%M:00')
|
41
42
|
new_session = {
|
@@ -83,7 +84,7 @@ module Bugsnag
|
|
83
84
|
end
|
84
85
|
end
|
85
86
|
end
|
86
|
-
@delivery_thread = Concurrent::TimerTask.execute(execution_interval:
|
87
|
+
@delivery_thread = Concurrent::TimerTask.execute(execution_interval: 10) do
|
87
88
|
if @session_counts.size > 0
|
88
89
|
send_sessions
|
89
90
|
end
|
@@ -106,11 +107,6 @@ module Bugsnag
|
|
106
107
|
return
|
107
108
|
end
|
108
109
|
|
109
|
-
if !Bugsnag.configuration.should_notify_release_stage?
|
110
|
-
Bugsnag.configuration.debug("Not delivering sessions due to notify_release_stages :#{Bugsnag.configuration.notify_release_stages.inspect}")
|
111
|
-
return
|
112
|
-
end
|
113
|
-
|
114
110
|
body = {
|
115
111
|
:notifier => {
|
116
112
|
:name => Bugsnag::Report::NOTIFIER_NAME,
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Bugsnag::Utility
|
2
|
+
# @api private
|
3
|
+
class MetadataDelegate
|
4
|
+
# nil is a valid metadata value, so we need a sentinel object so we can tell
|
5
|
+
# if the value parameter has been provided
|
6
|
+
NOT_PROVIDED = Object.new
|
7
|
+
|
8
|
+
##
|
9
|
+
# Add values to metadata
|
10
|
+
#
|
11
|
+
# @overload add_metadata(metadata, section, data)
|
12
|
+
# Merges data into the given section of metadata
|
13
|
+
# @param metadata [Hash] The metadata hash to operate on
|
14
|
+
# @param section [String, Symbol]
|
15
|
+
# @param data [Hash]
|
16
|
+
#
|
17
|
+
# @overload add_metadata(metadata, section, key, value)
|
18
|
+
# Sets key to value in the given section of metadata. If the value is nil
|
19
|
+
# the key will be deleted
|
20
|
+
# @param metadata [Hash] The metadata hash to operate on
|
21
|
+
# @param section [String, Symbol]
|
22
|
+
# @param key [String, Symbol]
|
23
|
+
# @param value
|
24
|
+
#
|
25
|
+
# @return [void]
|
26
|
+
def add_metadata(metadata, section, key_or_data, value = NOT_PROVIDED)
|
27
|
+
case value
|
28
|
+
when NOT_PROVIDED
|
29
|
+
merge_metadata(metadata, section, key_or_data)
|
30
|
+
when nil
|
31
|
+
clear_metadata(metadata, section, key_or_data)
|
32
|
+
else
|
33
|
+
overwrite_metadata(metadata, section, key_or_data, value)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Clear values from metadata
|
39
|
+
#
|
40
|
+
# @overload clear_metadata(metadata, section)
|
41
|
+
# Clears the given section of metadata
|
42
|
+
# @param metadata [Hash] The metadata hash to operate on
|
43
|
+
# @param section [String, Symbol]
|
44
|
+
#
|
45
|
+
# @overload clear_metadata(metadata, section, key)
|
46
|
+
# Clears the key in the given section of metadata
|
47
|
+
# @param metadata [Hash] The metadata hash to operate on
|
48
|
+
# @param section [String, Symbol]
|
49
|
+
# @param key [String, Symbol]
|
50
|
+
#
|
51
|
+
# @return [void]
|
52
|
+
def clear_metadata(metadata, section, key = nil)
|
53
|
+
if key.nil?
|
54
|
+
metadata.delete(section)
|
55
|
+
elsif metadata[section]
|
56
|
+
metadata[section].delete(key)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
##
|
63
|
+
# Merge new metadata into the existing metadata
|
64
|
+
#
|
65
|
+
# Any keys with a 'nil' value in the new metadata will be deleted from the
|
66
|
+
# existing metadata
|
67
|
+
#
|
68
|
+
# @param existing_metadata [Hash]
|
69
|
+
# @param section [String, Symbol]
|
70
|
+
# @param new_metadata [Hash]
|
71
|
+
# @return [void]
|
72
|
+
def merge_metadata(existing_metadata, section, new_metadata)
|
73
|
+
return unless new_metadata.is_a?(Hash)
|
74
|
+
|
75
|
+
existing_metadata[section] ||= {}
|
76
|
+
data = existing_metadata[section]
|
77
|
+
|
78
|
+
new_metadata.each do |key, value|
|
79
|
+
if value.nil?
|
80
|
+
data.delete(key)
|
81
|
+
else
|
82
|
+
data[key] = value
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
##
|
88
|
+
# Overwrite the value in metadata's section & key
|
89
|
+
#
|
90
|
+
# @param metadata [Hash]
|
91
|
+
# @param section [String, Symbol]
|
92
|
+
# @param key [String, Symbol]
|
93
|
+
# @param value
|
94
|
+
# @return [void]
|
95
|
+
def overwrite_metadata(metadata, section, key, value)
|
96
|
+
return unless key.is_a?(String) || key.is_a?(Symbol)
|
97
|
+
|
98
|
+
metadata[section] ||= {}
|
99
|
+
metadata[section][key] = value
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/lib/bugsnag.rb
CHANGED
@@ -5,6 +5,7 @@ require "bugsnag/version"
|
|
5
5
|
require "bugsnag/configuration"
|
6
6
|
require "bugsnag/meta_data"
|
7
7
|
require "bugsnag/report"
|
8
|
+
require "bugsnag/event"
|
8
9
|
require "bugsnag/cleaner"
|
9
10
|
require "bugsnag/helpers"
|
10
11
|
require "bugsnag/session_tracker"
|
@@ -28,10 +29,13 @@ require "bugsnag/middleware/rake"
|
|
28
29
|
require "bugsnag/middleware/classify_error"
|
29
30
|
require "bugsnag/middleware/delayed_job"
|
30
31
|
|
32
|
+
require "bugsnag/breadcrumb_type"
|
31
33
|
require "bugsnag/breadcrumbs/validator"
|
32
34
|
require "bugsnag/breadcrumbs/breadcrumb"
|
33
35
|
require "bugsnag/breadcrumbs/breadcrumbs"
|
34
36
|
|
37
|
+
require "bugsnag/utility/metadata_delegate"
|
38
|
+
|
35
39
|
# rubocop:todo Metrics/ModuleLength
|
36
40
|
module Bugsnag
|
37
41
|
LOCK = Mutex.new
|
@@ -237,7 +241,7 @@ module Bugsnag
|
|
237
241
|
#
|
238
242
|
# @param name [String] the main breadcrumb name/message
|
239
243
|
# @param meta_data [Hash] String, Numeric, or Boolean meta data to attach
|
240
|
-
# @param type [String] the breadcrumb type,
|
244
|
+
# @param type [String] the breadcrumb type, see {Bugsnag::BreadcrumbType}
|
241
245
|
# @param auto [Symbol] set to :auto if the breadcrumb is automatically created
|
242
246
|
# @return [void]
|
243
247
|
def leave_breadcrumb(name, meta_data={}, type=Bugsnag::Breadcrumbs::MANUAL_BREADCRUMB_TYPE, auto=:manual)
|
@@ -250,7 +254,7 @@ module Bugsnag
|
|
250
254
|
# Skip if it's already invalid
|
251
255
|
return if breadcrumb.ignore?
|
252
256
|
|
253
|
-
# Run
|
257
|
+
# Run before_breadcrumb_callbacks
|
254
258
|
configuration.before_breadcrumb_callbacks.each do |c|
|
255
259
|
c.arity > 0 ? c.call(breadcrumb) : c.call
|
256
260
|
break if breadcrumb.ignore?
|
@@ -259,6 +263,10 @@ module Bugsnag
|
|
259
263
|
# Return early if ignored
|
260
264
|
return if breadcrumb.ignore?
|
261
265
|
|
266
|
+
# Run on_breadcrumb callbacks
|
267
|
+
configuration.on_breadcrumb_callbacks.call(breadcrumb)
|
268
|
+
return if breadcrumb.ignore?
|
269
|
+
|
262
270
|
# Validate again in case of callback alteration
|
263
271
|
validator.validate(breadcrumb)
|
264
272
|
|
@@ -293,6 +301,44 @@ module Bugsnag
|
|
293
301
|
configuration.remove_on_error(callback)
|
294
302
|
end
|
295
303
|
|
304
|
+
##
|
305
|
+
# Add the given callback to the list of on_breadcrumb callbacks
|
306
|
+
#
|
307
|
+
# The on_breadcrumb callbacks will be called when a breadcrumb is left and
|
308
|
+
# are passed the {Breadcrumbs::Breadcrumb Breadcrumb} object
|
309
|
+
#
|
310
|
+
# Returning false from an on_breadcrumb callback will cause the breadcrumb
|
311
|
+
# to be ignored and will prevent any remaining callbacks from being called
|
312
|
+
#
|
313
|
+
# @param callback [Proc, Method, #call]
|
314
|
+
# @return [void]
|
315
|
+
def add_on_breadcrumb(callback)
|
316
|
+
configuration.add_on_breadcrumb(callback)
|
317
|
+
end
|
318
|
+
|
319
|
+
##
|
320
|
+
# Remove the given callback from the list of on_breadcrumb callbacks
|
321
|
+
#
|
322
|
+
# Note that this must be the same instance that was passed to
|
323
|
+
# {add_on_breadcrumb}, otherwise it will not be removed
|
324
|
+
#
|
325
|
+
# @param callback [Proc, Method, #call]
|
326
|
+
# @return [void]
|
327
|
+
def remove_on_breadcrumb(callback)
|
328
|
+
configuration.remove_on_breadcrumb(callback)
|
329
|
+
end
|
330
|
+
|
331
|
+
##
|
332
|
+
# Returns the current list of breadcrumbs
|
333
|
+
#
|
334
|
+
# This is a per-thread circular buffer, containing at most 'max_breadcrumbs'
|
335
|
+
# breadcrumbs
|
336
|
+
#
|
337
|
+
# @return [Bugsnag::Utility::CircularBuffer]
|
338
|
+
def breadcrumbs
|
339
|
+
configuration.breadcrumbs
|
340
|
+
end
|
341
|
+
|
296
342
|
##
|
297
343
|
# Returns the client's Cleaner object, or creates one if not yet created.
|
298
344
|
#
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bugsnag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.23.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Smith
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -40,8 +40,10 @@ files:
|
|
40
40
|
- VERSION
|
41
41
|
- bugsnag.gemspec
|
42
42
|
- lib/bugsnag.rb
|
43
|
+
- lib/bugsnag/breadcrumb_type.rb
|
43
44
|
- lib/bugsnag/breadcrumbs/breadcrumb.rb
|
44
45
|
- lib/bugsnag/breadcrumbs/breadcrumbs.rb
|
46
|
+
- lib/bugsnag/breadcrumbs/on_breadcrumb_callback_list.rb
|
45
47
|
- lib/bugsnag/breadcrumbs/validator.rb
|
46
48
|
- lib/bugsnag/cleaner.rb
|
47
49
|
- lib/bugsnag/code_extractor.rb
|
@@ -49,6 +51,8 @@ files:
|
|
49
51
|
- lib/bugsnag/delivery.rb
|
50
52
|
- lib/bugsnag/delivery/synchronous.rb
|
51
53
|
- lib/bugsnag/delivery/thread_queue.rb
|
54
|
+
- lib/bugsnag/error.rb
|
55
|
+
- lib/bugsnag/event.rb
|
52
56
|
- lib/bugsnag/helpers.rb
|
53
57
|
- lib/bugsnag/integrations/delayed_job.rb
|
54
58
|
- lib/bugsnag/integrations/mailman.rb
|
@@ -90,6 +94,7 @@ files:
|
|
90
94
|
- lib/bugsnag/tasks.rb
|
91
95
|
- lib/bugsnag/tasks/bugsnag.rake
|
92
96
|
- lib/bugsnag/utility/circular_buffer.rb
|
97
|
+
- lib/bugsnag/utility/metadata_delegate.rb
|
93
98
|
- lib/bugsnag/version.rb
|
94
99
|
- lib/generators/bugsnag/bugsnag_generator.rb
|
95
100
|
homepage: https://github.com/bugsnag/bugsnag-ruby
|