raygun4ruby 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +43 -0
- data/Rakefile +1 -1
- data/lib/raygun.rb +26 -0
- data/lib/raygun/breadcrumbs.rb +34 -0
- data/lib/raygun/breadcrumbs/breadcrumb.rb +30 -0
- data/lib/raygun/breadcrumbs/store.rb +68 -0
- data/lib/raygun/client.rb +2 -0
- data/lib/raygun/configuration.rb +26 -13
- data/lib/raygun/middleware/breadcrumbs_store_initializer.rb +19 -0
- data/lib/raygun/railtie.rb +21 -19
- data/lib/raygun/version.rb +1 -1
- data/specs/raygun/breadcrumbs/breadcrumb_spec.rb +134 -0
- data/specs/raygun/breadcrumbs/store_spec.rb +148 -0
- data/specs/services/apply_whitelist_filter_to_payload_spec.rb +1 -3
- data/specs/spec_helper.rb +9 -0
- data/test/test_helper.rb +26 -0
- data/test/unit/client_test.rb +11 -0
- data/test/unit/configuration_test.rb +26 -0
- data/test/unit/raygun_test.rb +0 -27
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4273509fb2b19bd65ee19cb8589607b51938cde
|
4
|
+
data.tar.gz: 592cbaa95d8afc226508600af62f53c8086201f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e1fca4593ff9aa4d19de3b174750ec2142f8cfc599b2cc5358b9dcb8e3eb73930e905eb71dd27d546c984d6525b243f249a2b8f4c1d3b5bdedea387555d3adf
|
7
|
+
data.tar.gz: 4a7249e4ed86910f9d66a43fbb7937bed5e3b649af2a880c49c7a9663b2ddef63ddcf8c9416b712930e2cac7b4257b28b2dc92e36258f94718b307c6c3915e7b
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,15 @@
|
|
1
|
+
## 2.1.0
|
2
|
+
|
3
|
+
Features
|
4
|
+
- Ability to record breadcrumbs in your code that will be sent to Raygun along with a raised exception ([#113](https://github.com/MindscapeHQ/raygun4ruby/pull/113))
|
5
|
+
|
1
6
|
## 2.0.0 (20/04/2017)
|
2
7
|
|
3
8
|
Bugfixes:
|
4
9
|
- Fix broken handling of raw request body reading in Rack applications ([#116](https://github.com/MindscapeHQ/raygun4ruby/pull/116))
|
5
10
|
- This is a breaking change to how raw data was being read before so it requires a major version bump
|
6
11
|
- Raw request data reading is now disabled by default and can be enabled via the `record_raw_data` configuration option
|
12
|
+
|
7
13
|
## 1.5.0 (16/03/2017)
|
8
14
|
|
9
15
|
Features
|
data/README.md
CHANGED
@@ -98,6 +98,49 @@ Raygun.setup do |config|
|
|
98
98
|
end
|
99
99
|
```
|
100
100
|
|
101
|
+
### Recording Breadcrumbs
|
102
|
+
|
103
|
+
Breadcrumbs let you provide logging points in your code that will be collected and sent along with any exception sent to Raygun. This lets you have a better understanding of the events that happened in the system that lead up to the exception.
|
104
|
+
|
105
|
+
1. Include it as a module in your class
|
106
|
+
```ruby
|
107
|
+
class SomeClass
|
108
|
+
include Raygun::Breadcrumbs
|
109
|
+
|
110
|
+
def some_method
|
111
|
+
record_breadcrumb(
|
112
|
+
message: "<log message goes here>",
|
113
|
+
category: "some category to group them by, maybe authentication or external-apis for example",
|
114
|
+
level: :info, # or debug or warning etc, you can configure what level will get sent
|
115
|
+
metadata: {custom_data: 'can go here'},
|
116
|
+
)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
```
|
120
|
+
This has the added benefit of recording the class the breadcrumb was recorded from automatically
|
121
|
+
|
122
|
+
2. Call the `record_breadcrumb` method manually
|
123
|
+
```ruby
|
124
|
+
def some_method
|
125
|
+
Raygun.record_breadcrumb(
|
126
|
+
message: "<log message goes here>",
|
127
|
+
category: "some category to group them by, maybe authentication or external-apis for example",
|
128
|
+
level: :info, # or debug or warning etc, you can configure what level will get sent
|
129
|
+
metadata: {custom_data: 'can go here'},
|
130
|
+
|
131
|
+
# You can also set the class the breadcrumb was logged from
|
132
|
+
# It will only be set automatically using the included module approach
|
133
|
+
# Method and line number will get added automatically
|
134
|
+
class_name: self.class.name
|
135
|
+
)
|
136
|
+
end
|
137
|
+
```
|
138
|
+
|
139
|
+
If you are using Sinatra or another rack framework you will need to include the Breadcrumbs middleware, this is used for storing the breadcrumbs during a request
|
140
|
+
`use Raygun::Middleware::BreadcrumbsStoreInitializer`
|
141
|
+
|
142
|
+
If you are using a non web based Ruby application you will have to call `Raygun::Breadcrumbs::Store.initialize` during your applications boot process. The store is per thread, but I have not tested it in a multi threaded application.
|
143
|
+
|
101
144
|
### Filtering the payload by whitelist
|
102
145
|
|
103
146
|
As an alternative to the above, you can also opt-in to the keys/values to be sent to Raygun by providing a specific whitelist of the keys you want to transmit.
|
data/Rakefile
CHANGED
data/lib/raygun.rb
CHANGED
@@ -14,10 +14,14 @@ require "raygun/version"
|
|
14
14
|
require "raygun/configuration"
|
15
15
|
require "raygun/client"
|
16
16
|
require "raygun/middleware/rack_exception_interceptor"
|
17
|
+
require "raygun/middleware/breadcrumbs_store_initializer"
|
17
18
|
require "raygun/testable"
|
18
19
|
require "raygun/error"
|
19
20
|
require "raygun/affected_user"
|
20
21
|
require "raygun/services/apply_whitelist_filter_to_payload"
|
22
|
+
require "raygun/breadcrumbs/breadcrumb"
|
23
|
+
require "raygun/breadcrumbs/store"
|
24
|
+
require "raygun/breadcrumbs"
|
21
25
|
require "raygun/railtie" if defined?(Rails)
|
22
26
|
|
23
27
|
module Raygun
|
@@ -78,6 +82,28 @@ module Raygun
|
|
78
82
|
track_exception(e)
|
79
83
|
end
|
80
84
|
|
85
|
+
def record_breadcrumb(
|
86
|
+
message: nil,
|
87
|
+
category: '',
|
88
|
+
level: :info,
|
89
|
+
timestamp: Time.now.utc,
|
90
|
+
metadata: {},
|
91
|
+
class_name: nil,
|
92
|
+
method_name: nil,
|
93
|
+
line_number: nil
|
94
|
+
)
|
95
|
+
Raygun::Breadcrumbs::Store.record(
|
96
|
+
message: message,
|
97
|
+
category: category,
|
98
|
+
level: level,
|
99
|
+
timestamp: timestamp,
|
100
|
+
metadata: metadata,
|
101
|
+
class_name: class_name,
|
102
|
+
method_name: method_name,
|
103
|
+
line_number: line_number,
|
104
|
+
)
|
105
|
+
end
|
106
|
+
|
81
107
|
def log(message)
|
82
108
|
configuration.logger.info(message) if configuration.logger
|
83
109
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Raygun
|
2
|
+
module Breadcrumbs
|
3
|
+
BREADCRUMB_LEVELS = [
|
4
|
+
:debug,
|
5
|
+
:info,
|
6
|
+
:warning,
|
7
|
+
:error,
|
8
|
+
:fatal
|
9
|
+
]
|
10
|
+
|
11
|
+
def record_breadcrumb(
|
12
|
+
message: nil,
|
13
|
+
category: '',
|
14
|
+
level: :info,
|
15
|
+
timestamp: Time.now.utc.to_i,
|
16
|
+
metadata: {},
|
17
|
+
class_name: nil,
|
18
|
+
method_name: nil,
|
19
|
+
line_number: nil
|
20
|
+
)
|
21
|
+
class_name = class_name || self.class.name
|
22
|
+
Raygun::Breadcrumbs::Store.record(
|
23
|
+
message: message,
|
24
|
+
category: category,
|
25
|
+
level: level,
|
26
|
+
timestamp: timestamp,
|
27
|
+
metadata: metadata,
|
28
|
+
class_name: class_name,
|
29
|
+
method_name: method_name,
|
30
|
+
line_number: line_number,
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Raygun
|
2
|
+
module Breadcrumbs
|
3
|
+
class Breadcrumb
|
4
|
+
ATTRIBUTES = [
|
5
|
+
:message, :category, :metadata, :class_name,
|
6
|
+
:method_name, :line_number, :timestamp, :level,
|
7
|
+
:type
|
8
|
+
]
|
9
|
+
attr_accessor(*ATTRIBUTES)
|
10
|
+
|
11
|
+
def build_payload
|
12
|
+
payload = {
|
13
|
+
message: message,
|
14
|
+
category: category,
|
15
|
+
level: Breadcrumbs::BREADCRUMB_LEVELS.index(level),
|
16
|
+
CustomData: metadata,
|
17
|
+
timestamp: timestamp,
|
18
|
+
type: type
|
19
|
+
}
|
20
|
+
|
21
|
+
payload[:location] = "#{class_name}:#{method_name}" unless class_name == nil
|
22
|
+
payload[:location] += ":#{line_number}" if payload.has_key?(:location) && line_number != nil
|
23
|
+
|
24
|
+
Hash[payload.select do |k, v|
|
25
|
+
v != nil
|
26
|
+
end]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require_relative 'breadcrumb'
|
2
|
+
|
3
|
+
module Raygun
|
4
|
+
module Breadcrumbs
|
5
|
+
class Store
|
6
|
+
def self.initialize
|
7
|
+
Thread.current[:breadcrumbs] ||= []
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.clear
|
11
|
+
Thread.current[:breadcrumbs] = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.stored
|
15
|
+
Thread.current[:breadcrumbs]
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.record(
|
19
|
+
message: nil,
|
20
|
+
category: '',
|
21
|
+
level: :info,
|
22
|
+
timestamp: Time.now.utc.to_i,
|
23
|
+
metadata: {},
|
24
|
+
class_name: nil,
|
25
|
+
method_name: nil,
|
26
|
+
line_number: nil
|
27
|
+
)
|
28
|
+
raise ArgumentError.new('missing keyword: message') if message == nil
|
29
|
+
crumb = Breadcrumb.new
|
30
|
+
|
31
|
+
crumb.message = message
|
32
|
+
crumb.category = category
|
33
|
+
crumb.level = level
|
34
|
+
crumb.metadata = metadata
|
35
|
+
crumb.timestamp = timestamp
|
36
|
+
crumb.type = 'manual'
|
37
|
+
|
38
|
+
caller = caller_locations[1]
|
39
|
+
crumb.class_name = class_name
|
40
|
+
crumb.method_name = method_name || caller.label
|
41
|
+
crumb.line_number = line_number || caller.lineno
|
42
|
+
|
43
|
+
Thread.current[:breadcrumbs] << crumb if should_record?(crumb)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.any?
|
47
|
+
stored != nil && stored.length > 0
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def self.should_record?(crumb)
|
53
|
+
levels = Raygun::Breadcrumbs::BREADCRUMB_LEVELS
|
54
|
+
|
55
|
+
active_level = levels.index(Raygun.configuration.breadcrumb_level)
|
56
|
+
crumb_level = levels.index(crumb.level) || -1
|
57
|
+
|
58
|
+
discard = crumb_level < active_level
|
59
|
+
|
60
|
+
if discard && Raygun.configuration.debug
|
61
|
+
Raygun.log("[Raygun.breadcrumbs] discarding breadcrumb because #{crumb.level} is below active breadcrumb level (#{Raygun.configuration.breadcrumb_level})")
|
62
|
+
end
|
63
|
+
|
64
|
+
!discard
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/raygun/client.rb
CHANGED
@@ -193,6 +193,8 @@ module Raygun
|
|
193
193
|
utcOffset: Time.now.utc_offset / 3600
|
194
194
|
}
|
195
195
|
}
|
196
|
+
store = ::Raygun::Breadcrumbs::Store
|
197
|
+
error_details[:breadcrumbs] = store.stored.map(&:build_payload) if store.any?
|
196
198
|
|
197
199
|
error_details.merge!(groupingKey: grouping_key) if grouping_key
|
198
200
|
|
data/lib/raygun/configuration.rb
CHANGED
@@ -112,19 +112,20 @@ module Raygun
|
|
112
112
|
|
113
113
|
# set default attribute values
|
114
114
|
@defaults = OpenStruct.new({
|
115
|
-
ignore:
|
116
|
-
custom_data:
|
117
|
-
tags:
|
118
|
-
enable_reporting:
|
119
|
-
affected_user_method:
|
120
|
-
affected_user_mapping:
|
121
|
-
filter_parameters:
|
122
|
-
filter_payload_with_whitelist:
|
123
|
-
whitelist_payload_shape:
|
124
|
-
proxy_settings:
|
125
|
-
debug:
|
126
|
-
api_url:
|
127
|
-
|
115
|
+
ignore: IGNORE_DEFAULT,
|
116
|
+
custom_data: {},
|
117
|
+
tags: [],
|
118
|
+
enable_reporting: true,
|
119
|
+
affected_user_method: :current_user,
|
120
|
+
affected_user_mapping: AffectedUser::DEFAULT_MAPPING,
|
121
|
+
filter_parameters: DEFAULT_FILTER_PARAMETERS,
|
122
|
+
filter_payload_with_whitelist: false,
|
123
|
+
whitelist_payload_shape: DEFAULT_WHITELIST_PAYLOAD_SHAPE,
|
124
|
+
proxy_settings: {},
|
125
|
+
debug: false,
|
126
|
+
api_url: 'https://api.raygun.io/',
|
127
|
+
breadcrumb_level: :info,
|
128
|
+
record_raw_data: false
|
128
129
|
})
|
129
130
|
end
|
130
131
|
|
@@ -144,6 +145,18 @@ module Raygun
|
|
144
145
|
self.enable_reporting = !value
|
145
146
|
end
|
146
147
|
|
148
|
+
def breadcrumb_level
|
149
|
+
read_value(:breadcrumb_level)
|
150
|
+
end
|
151
|
+
|
152
|
+
def breadcrumb_level=(value)
|
153
|
+
if Raygun::Breadcrumbs::BREADCRUMB_LEVELS.include?(value)
|
154
|
+
set_value(:breadcrumb_level, value)
|
155
|
+
elsif read_value(:debug)
|
156
|
+
Raygun.log("[Raygun.configuration] unknown breadcrumb level: #{value} not setting")
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
147
160
|
def affected_user_identifier_methods
|
148
161
|
Raygun.deprecation_warning("Please note: You should now user config.affected_user_method_mapping.Identifier instead of config.affected_user_identifier_methods")
|
149
162
|
read_value(:affected_user_method_mapping).Identifier
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Raygun
|
2
|
+
module Middleware
|
3
|
+
class BreadcrumbsStoreInitializer
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
Breadcrumbs::Store.initialize
|
10
|
+
|
11
|
+
begin
|
12
|
+
@app.call(env)
|
13
|
+
ensure
|
14
|
+
Breadcrumbs::Store.clear
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/raygun/railtie.rb
CHANGED
@@ -1,28 +1,30 @@
|
|
1
|
+
require "raygun/middleware/rails_insert_affected_user"
|
2
|
+
|
1
3
|
class Raygun::Railtie < Rails::Railtie
|
2
4
|
initializer "raygun.configure_rails_initialization" do |app|
|
3
5
|
|
4
6
|
# Thanks Airbrake: See https://github.com/rails/rails/pull/8624
|
5
7
|
middleware = if defined?(ActionDispatch::DebugExceptions)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
8
|
+
if Rails::VERSION::STRING >= "5"
|
9
|
+
ActionDispatch::DebugExceptions
|
10
|
+
else
|
11
|
+
# Rails >= 3.2.0
|
12
|
+
"ActionDispatch::DebugExceptions"
|
13
|
+
end
|
14
|
+
else
|
15
|
+
# Rails < 3.2.0
|
16
|
+
"ActionDispatch::ShowExceptions"
|
17
|
+
end
|
16
18
|
|
17
|
-
raygun_middleware =
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
raygun_middleware = [
|
20
|
+
Raygun::Middleware::RailsInsertAffectedUser,
|
21
|
+
Raygun::Middleware::RackExceptionInterceptor,
|
22
|
+
Raygun::Middleware::BreadcrumbsStoreInitializer
|
23
|
+
]
|
24
|
+
raygun_middleware = raygun_middleware.map(&:to_s) unless Rails::VERSION::STRING >= "5"
|
25
|
+
raygun_middleware.each do |m|
|
26
|
+
app.config.middleware.insert_after(middleware, m)
|
27
|
+
end
|
26
28
|
end
|
27
29
|
|
28
30
|
config.to_prepare do
|
data/lib/raygun/version.rb
CHANGED
@@ -0,0 +1,134 @@
|
|
1
|
+
require_relative "../../spec_helper"
|
2
|
+
|
3
|
+
module Raygun
|
4
|
+
module Breadcrumbs
|
5
|
+
describe Breadcrumb do
|
6
|
+
let(:subject) { Breadcrumb.new }
|
7
|
+
context 'fields' do
|
8
|
+
it 'has a message' do
|
9
|
+
message = 'foo'
|
10
|
+
|
11
|
+
subject.message = message
|
12
|
+
|
13
|
+
subject.message.must_equal(message)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'has a category' do
|
17
|
+
category = 'foo'
|
18
|
+
|
19
|
+
subject.category = category
|
20
|
+
|
21
|
+
subject.category.must_equal(category)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'has a level' do
|
25
|
+
level = 'foo'
|
26
|
+
|
27
|
+
subject.level = level
|
28
|
+
|
29
|
+
subject.level.must_equal(level)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'has a timestamp' do
|
33
|
+
timestamp = Time.now
|
34
|
+
|
35
|
+
subject.timestamp = timestamp
|
36
|
+
|
37
|
+
subject.timestamp.must_equal(timestamp)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'has metadata' do
|
41
|
+
metadata = {foo: '1'}
|
42
|
+
|
43
|
+
subject.metadata = metadata
|
44
|
+
|
45
|
+
subject.metadata.must_equal(metadata)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'has a class_name' do
|
49
|
+
class_name = 'foo'
|
50
|
+
|
51
|
+
subject.class_name = class_name
|
52
|
+
|
53
|
+
subject.class_name.must_equal(class_name)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'has a method_name' do
|
57
|
+
method_name = 'foo'
|
58
|
+
|
59
|
+
subject.method_name = method_name
|
60
|
+
|
61
|
+
subject.method_name.must_equal(method_name)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'has a line_number' do
|
65
|
+
line_number = 17
|
66
|
+
|
67
|
+
subject.line_number = line_number
|
68
|
+
|
69
|
+
subject.line_number.must_equal(line_number)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "#build_payload" do
|
74
|
+
before do
|
75
|
+
Timecop.freeze
|
76
|
+
Store.initialize
|
77
|
+
end
|
78
|
+
after do
|
79
|
+
Timecop.return
|
80
|
+
Store.clear
|
81
|
+
end
|
82
|
+
|
83
|
+
let(:breadcrumb) do
|
84
|
+
Store.record(
|
85
|
+
message: "test",
|
86
|
+
category: "test",
|
87
|
+
level: :info,
|
88
|
+
class_name: "HomeController",
|
89
|
+
method_name: "index",
|
90
|
+
line_number: 17,
|
91
|
+
metadata: {
|
92
|
+
foo: 'bar'
|
93
|
+
}
|
94
|
+
)
|
95
|
+
|
96
|
+
Store.stored[0]
|
97
|
+
end
|
98
|
+
let(:payload) { breadcrumb.build_payload }
|
99
|
+
|
100
|
+
it "joins the class name, method name and line number together" do
|
101
|
+
payload[:location].must_equal("HomeController:index:17")
|
102
|
+
end
|
103
|
+
|
104
|
+
it "does not include the method name and line number if the class name is missing" do
|
105
|
+
breadcrumb.class_name = nil
|
106
|
+
|
107
|
+
payload.has_key?(:location).must_equal(false)
|
108
|
+
end
|
109
|
+
|
110
|
+
it "does not inlcude the line number if is it missing" do
|
111
|
+
breadcrumb.line_number = nil
|
112
|
+
|
113
|
+
payload[:location].must_equal("HomeController:index")
|
114
|
+
end
|
115
|
+
|
116
|
+
it "does not include keys in payload with nil values" do
|
117
|
+
breadcrumb.metadata = nil
|
118
|
+
breadcrumb.category = nil
|
119
|
+
|
120
|
+
payload.key?(:CustomData).must_equal(false)
|
121
|
+
payload.key?(:category).must_equal(false)
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'includes the rest of the fields' do
|
125
|
+
payload[:message].must_equal('test')
|
126
|
+
payload[:category].must_equal('test')
|
127
|
+
payload[:level].must_equal(1)
|
128
|
+
payload[:timestamp].wont_be_nil
|
129
|
+
payload[:CustomData].must_equal(foo: 'bar')
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "minitest/pride"
|
3
|
+
require_relative "../../spec_helper"
|
4
|
+
|
5
|
+
module Raygun
|
6
|
+
module Breadcrumbs
|
7
|
+
describe Store do
|
8
|
+
let(:subject) { Store }
|
9
|
+
after { subject.clear }
|
10
|
+
|
11
|
+
describe "#initialize" do
|
12
|
+
before do
|
13
|
+
subject.stored.must_equal(nil)
|
14
|
+
|
15
|
+
subject.initialize
|
16
|
+
end
|
17
|
+
|
18
|
+
it "creates the store on the current Thread" do
|
19
|
+
subject.stored.must_equal([])
|
20
|
+
end
|
21
|
+
|
22
|
+
it "does not effect other threads" do
|
23
|
+
Thread.new do
|
24
|
+
subject.stored.must_equal(nil)
|
25
|
+
end.join
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "any?" do
|
30
|
+
it "returns true if any breadcrumbs have been logged" do
|
31
|
+
subject.initialize
|
32
|
+
|
33
|
+
subject.record(message: "test")
|
34
|
+
|
35
|
+
subject.any?.must_equal(true)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns false if none have been logged" do
|
39
|
+
subject.initialize
|
40
|
+
|
41
|
+
subject.any?.must_equal(false)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "returns false if the store is uninitialized" do
|
45
|
+
subject.any?.must_equal(false)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#clear" do
|
50
|
+
before do
|
51
|
+
subject.initialize
|
52
|
+
end
|
53
|
+
|
54
|
+
it "resets the store back to nil" do
|
55
|
+
subject.clear
|
56
|
+
|
57
|
+
subject.stored.must_equal(nil)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#should_record?" do
|
62
|
+
it "returns false when the log level is above the breadcrumbs level" do
|
63
|
+
Raygun.configuration.stubs(:breadcrumb_level).returns(:error)
|
64
|
+
|
65
|
+
crumb = Breadcrumb.new
|
66
|
+
crumb.level = :warning
|
67
|
+
|
68
|
+
assert_equal false, subject.send(:should_record?, crumb)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "adding a breadcrumb" do
|
73
|
+
class Foo
|
74
|
+
include ::Raygun::Breadcrumbs
|
75
|
+
|
76
|
+
def bar
|
77
|
+
record_breadcrumb(message: "test")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
before do
|
82
|
+
subject.clear
|
83
|
+
subject.initialize
|
84
|
+
end
|
85
|
+
|
86
|
+
it "gets stored" do
|
87
|
+
subject.record(message: "test")
|
88
|
+
|
89
|
+
subject.stored.length.must_equal(1)
|
90
|
+
subject.stored[0].message.must_equal("test")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "automatically sets the class name" do
|
94
|
+
Foo.new.bar
|
95
|
+
|
96
|
+
bc = subject.stored[0]
|
97
|
+
bc.class_name.must_equal("Raygun::Breadcrumbs::Foo")
|
98
|
+
end
|
99
|
+
|
100
|
+
it "automatically sets the method name" do
|
101
|
+
Foo.new.bar
|
102
|
+
|
103
|
+
bc = subject.stored[0]
|
104
|
+
bc.method_name.must_equal("bar")
|
105
|
+
end
|
106
|
+
|
107
|
+
it "does not set the method name if it is already set" do
|
108
|
+
subject.record(message: 'test', method_name: "foo")
|
109
|
+
|
110
|
+
subject.stored[0].method_name.must_equal("foo")
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
it "automatically sets the timestamp" do
|
115
|
+
Timecop.freeze do
|
116
|
+
Foo.new.bar
|
117
|
+
|
118
|
+
bc = subject.stored[0]
|
119
|
+
bc.timestamp.must_equal(Time.now.utc.to_i)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
it "does not set the timestamp if it is already set" do
|
124
|
+
time = Time.now.utc
|
125
|
+
|
126
|
+
Timecop.freeze do
|
127
|
+
subject.record(message: 'test', timestamp: time)
|
128
|
+
|
129
|
+
subject.stored[0].timestamp.wont_equal(Time.now.utc)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
it "sets the log level to :info if one is not supplied" do
|
134
|
+
Foo.new.bar
|
135
|
+
|
136
|
+
subject.stored[0].level.must_equal(:info)
|
137
|
+
end
|
138
|
+
|
139
|
+
it "does not record the breadcrumb if should_record? is false" do
|
140
|
+
subject.stubs(:should_record?).returns(false)
|
141
|
+
Foo.new.bar
|
142
|
+
|
143
|
+
subject.stored.length.must_equal(0)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -5,6 +5,25 @@ require "minitest/pride"
|
|
5
5
|
require "fakeweb"
|
6
6
|
require "timecop"
|
7
7
|
require "mocha/mini_test"
|
8
|
+
require 'stringio'
|
9
|
+
|
10
|
+
class FakeLogger
|
11
|
+
def initialize
|
12
|
+
@logger = StringIO.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def info(message)
|
16
|
+
@logger.write(message)
|
17
|
+
end
|
18
|
+
|
19
|
+
def reset
|
20
|
+
@logger.string = ""
|
21
|
+
end
|
22
|
+
|
23
|
+
def get
|
24
|
+
@logger.string
|
25
|
+
end
|
26
|
+
end
|
8
27
|
|
9
28
|
class NoApiKey < StandardError; end
|
10
29
|
|
@@ -46,4 +65,11 @@ class Raygun::UnitTest < MiniTest::Unit::TestCase
|
|
46
65
|
Raygun.configuration = Raygun::Configuration.new
|
47
66
|
end
|
48
67
|
|
68
|
+
def setup_logging
|
69
|
+
logger = FakeLogger.new
|
70
|
+
Raygun.configuration.debug = true
|
71
|
+
Raygun.configuration.logger = logger
|
72
|
+
|
73
|
+
logger
|
74
|
+
end
|
49
75
|
end
|
data/test/unit/client_test.rb
CHANGED
@@ -645,6 +645,17 @@ class ClientTest < Raygun::UnitTest
|
|
645
645
|
assert_equal expected_details, user_details
|
646
646
|
end
|
647
647
|
|
648
|
+
def test_build_payload_includes_breadcrumbs
|
649
|
+
::Raygun::Breadcrumbs::Store.initialize
|
650
|
+
::Raygun::Breadcrumbs::Store.record(message: "foo")
|
651
|
+
|
652
|
+
breadcrumbs = @client.send(:build_payload_hash, test_exception, sample_env_hash)[:details][:breadcrumbs]
|
653
|
+
::Raygun::Breadcrumbs::Store.clear
|
654
|
+
|
655
|
+
assert_equal breadcrumbs.length, 1
|
656
|
+
assert breadcrumbs[0].is_a? Hash
|
657
|
+
end
|
658
|
+
|
648
659
|
private
|
649
660
|
|
650
661
|
def test_exception
|
@@ -130,6 +130,32 @@ class ConfigurationTest < Raygun::UnitTest
|
|
130
130
|
assert_equal "https://api.raygun.io/", Raygun.configuration.api_url
|
131
131
|
end
|
132
132
|
|
133
|
+
def test_setting_breadcrumb_level
|
134
|
+
Raygun.setup do |config|
|
135
|
+
config.breadcrumb_level = :info
|
136
|
+
end
|
137
|
+
|
138
|
+
assert_equal :info, Raygun.configuration.breadcrumb_level
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_setting_breadcrumb_level_to_bad_value
|
142
|
+
logger = setup_logging
|
143
|
+
|
144
|
+
Raygun.setup do |config|
|
145
|
+
config.breadcrumb_level = :invalid
|
146
|
+
end
|
147
|
+
|
148
|
+
assert_equal :info, Raygun.configuration.breadcrumb_level
|
149
|
+
assert(
|
150
|
+
logger.get.include?("unknown breadcrumb level"),
|
151
|
+
"unknown breadcrumb level message was not logged"
|
152
|
+
)
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_breadcrumb_level_default
|
156
|
+
assert_equal :info, Raygun.configuration.breadcrumb_level
|
157
|
+
end
|
158
|
+
|
133
159
|
def test_record_raw_data_default
|
134
160
|
assert_equal false, Raygun.configuration.record_raw_data
|
135
161
|
end
|
data/test/unit/raygun_test.rb
CHANGED
@@ -1,24 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require_relative "../test_helper.rb"
|
3
|
-
require 'stringio'
|
4
|
-
|
5
|
-
class FakeLogger
|
6
|
-
def initialize
|
7
|
-
@logger = StringIO.new
|
8
|
-
end
|
9
|
-
|
10
|
-
def info(message)
|
11
|
-
@logger.write(message)
|
12
|
-
end
|
13
|
-
|
14
|
-
def reset
|
15
|
-
@logger.string = ""
|
16
|
-
end
|
17
|
-
|
18
|
-
def get
|
19
|
-
@logger.string
|
20
|
-
end
|
21
|
-
end
|
22
3
|
|
23
4
|
class RaygunTest < Raygun::UnitTest
|
24
5
|
def test_raygun_is_not_configured_with_no_api_key
|
@@ -41,12 +22,4 @@ class RaygunTest < Raygun::UnitTest
|
|
41
22
|
|
42
23
|
assert logger.get =~ /skipping reporting of.*Exception.*/, "ignored exception was not logged"
|
43
24
|
end
|
44
|
-
|
45
|
-
def setup_logging
|
46
|
-
logger = FakeLogger.new
|
47
|
-
Raygun.configuration.debug = true
|
48
|
-
Raygun.configuration.logger = logger
|
49
|
-
|
50
|
-
logger
|
51
|
-
end
|
52
25
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: raygun4ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mindscape
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-04-
|
12
|
+
date: 2017-04-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
@@ -217,9 +217,13 @@ files:
|
|
217
217
|
- lib/generators/raygun/install_generator.rb
|
218
218
|
- lib/raygun.rb
|
219
219
|
- lib/raygun/affected_user.rb
|
220
|
+
- lib/raygun/breadcrumbs.rb
|
221
|
+
- lib/raygun/breadcrumbs/breadcrumb.rb
|
222
|
+
- lib/raygun/breadcrumbs/store.rb
|
220
223
|
- lib/raygun/client.rb
|
221
224
|
- lib/raygun/configuration.rb
|
222
225
|
- lib/raygun/error.rb
|
226
|
+
- lib/raygun/middleware/breadcrumbs_store_initializer.rb
|
223
227
|
- lib/raygun/middleware/rack_exception_interceptor.rb
|
224
228
|
- lib/raygun/middleware/rails_insert_affected_user.rb
|
225
229
|
- lib/raygun/railtie.rb
|
@@ -231,7 +235,10 @@ files:
|
|
231
235
|
- lib/resque/failure/raygun.rb
|
232
236
|
- lib/tasks/raygun.tasks
|
233
237
|
- raygun4ruby.gemspec
|
238
|
+
- specs/raygun/breadcrumbs/breadcrumb_spec.rb
|
239
|
+
- specs/raygun/breadcrumbs/store_spec.rb
|
234
240
|
- specs/services/apply_whitelist_filter_to_payload_spec.rb
|
241
|
+
- specs/spec_helper.rb
|
235
242
|
- test/integration/client_test.rb
|
236
243
|
- test/test_helper.rb
|
237
244
|
- test/unit/affected_user_test.rb
|