airbrake-ruby 4.15.0-java → 5.0.2-java
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/lib/airbrake-ruby.rb +22 -33
- data/lib/airbrake-ruby/async_sender.rb +1 -1
- data/lib/airbrake-ruby/backtrace.rb +6 -5
- data/lib/airbrake-ruby/config.rb +30 -30
- data/lib/airbrake-ruby/config/processor.rb +69 -0
- data/lib/airbrake-ruby/config/validator.rb +6 -0
- data/lib/airbrake-ruby/file_cache.rb +1 -1
- data/lib/airbrake-ruby/filter_chain.rb +1 -0
- data/lib/airbrake-ruby/filters/dependency_filter.rb +1 -0
- data/lib/airbrake-ruby/filters/gem_root_filter.rb +1 -0
- data/lib/airbrake-ruby/filters/git_last_checkout_filter.rb +1 -2
- data/lib/airbrake-ruby/filters/git_repository_filter.rb +3 -0
- data/lib/airbrake-ruby/filters/git_revision_filter.rb +2 -0
- data/lib/airbrake-ruby/filters/keys_filter.rb +21 -13
- data/lib/airbrake-ruby/filters/root_directory_filter.rb +1 -0
- data/lib/airbrake-ruby/filters/sql_filter.rb +4 -4
- data/lib/airbrake-ruby/filters/system_exit_filter.rb +1 -0
- data/lib/airbrake-ruby/filters/thread_filter.rb +2 -0
- data/lib/airbrake-ruby/ignorable.rb +1 -0
- data/lib/airbrake-ruby/notice.rb +1 -8
- data/lib/airbrake-ruby/notice_notifier.rb +1 -0
- data/lib/airbrake-ruby/performance_breakdown.rb +1 -6
- data/lib/airbrake-ruby/performance_notifier.rb +2 -15
- data/lib/airbrake-ruby/promise.rb +1 -0
- data/lib/airbrake-ruby/query.rb +1 -6
- data/lib/airbrake-ruby/queue.rb +1 -8
- data/lib/airbrake-ruby/remote_settings.rb +145 -0
- data/lib/airbrake-ruby/remote_settings/callback.rb +44 -0
- data/lib/airbrake-ruby/remote_settings/settings_data.rb +116 -0
- data/lib/airbrake-ruby/request.rb +1 -8
- data/lib/airbrake-ruby/stat.rb +1 -12
- data/lib/airbrake-ruby/sync_sender.rb +3 -2
- data/lib/airbrake-ruby/tdigest.rb +2 -0
- data/lib/airbrake-ruby/thread_pool.rb +1 -0
- data/lib/airbrake-ruby/truncator.rb +8 -2
- data/lib/airbrake-ruby/version.rb +11 -1
- data/spec/airbrake_spec.rb +45 -22
- data/spec/backtrace_spec.rb +26 -26
- data/spec/code_hunk_spec.rb +2 -2
- data/spec/config/processor_spec.rb +125 -0
- data/spec/config/validator_spec.rb +18 -1
- data/spec/config_spec.rb +11 -32
- data/spec/filters/gem_root_filter_spec.rb +4 -4
- data/spec/filters/keys_allowlist_spec.rb +1 -0
- data/spec/filters/keys_blocklist_spec.rb +10 -0
- data/spec/filters/root_directory_filter_spec.rb +4 -4
- data/spec/filters/sql_filter_spec.rb +2 -2
- data/spec/notice_notifier/options_spec.rb +2 -2
- data/spec/notice_notifier_spec.rb +2 -2
- data/spec/notice_spec.rb +1 -1
- data/spec/performance_breakdown_spec.rb +0 -12
- data/spec/performance_notifier_spec.rb +0 -25
- data/spec/query_spec.rb +1 -11
- data/spec/queue_spec.rb +1 -13
- data/spec/remote_settings/callback_spec.rb +141 -0
- data/spec/remote_settings/settings_data_spec.rb +348 -0
- data/spec/remote_settings_spec.rb +230 -0
- data/spec/request_spec.rb +1 -13
- data/spec/spec_helper.rb +4 -4
- data/spec/stat_spec.rb +0 -9
- data/spec/sync_sender_spec.rb +3 -1
- metadata +18 -6
@@ -0,0 +1,230 @@
|
|
1
|
+
RSpec.describe Airbrake::RemoteSettings do
|
2
|
+
let(:project_id) { 123 }
|
3
|
+
let(:host) { 'https://v1-production-notifier-configs.s3.amazonaws.com' }
|
4
|
+
|
5
|
+
let(:endpoint) do
|
6
|
+
"#{host}/2020-06-18/config/#{project_id}/config.json"
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:body) do
|
10
|
+
{
|
11
|
+
'poll_sec' => 1,
|
12
|
+
'settings' => [
|
13
|
+
{
|
14
|
+
'name' => 'apm',
|
15
|
+
'enabled' => false,
|
16
|
+
},
|
17
|
+
{
|
18
|
+
'name' => 'errors',
|
19
|
+
'enabled' => true,
|
20
|
+
},
|
21
|
+
],
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
let(:config_path) { described_class::CONFIG_DUMP_PATH }
|
26
|
+
let(:config_dir) { File.dirname(config_path) }
|
27
|
+
|
28
|
+
let!(:stub) do
|
29
|
+
stub_request(:get, Regexp.new(endpoint))
|
30
|
+
.to_return(status: 200, body: body.to_json)
|
31
|
+
end
|
32
|
+
|
33
|
+
before do
|
34
|
+
# Do not create config dumps on disk.
|
35
|
+
allow(Dir).to receive(:mkdir).with(config_dir)
|
36
|
+
allow(File).to receive(:write).with(config_path, anything)
|
37
|
+
end
|
38
|
+
|
39
|
+
describe ".poll" do
|
40
|
+
describe "config loading" do
|
41
|
+
let(:settings_data) { described_class::SettingsData.new(project_id, body) }
|
42
|
+
|
43
|
+
before do
|
44
|
+
allow(File).to receive(:exist?).with(config_path).and_return(true)
|
45
|
+
allow(File).to receive(:read).with(config_path).and_return(body.to_json)
|
46
|
+
|
47
|
+
allow(described_class::SettingsData).to receive(:new).and_return(settings_data)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "loads the config from disk" do
|
51
|
+
expect(File).to receive(:read).with(config_path)
|
52
|
+
expect(settings_data).to receive(:merge!).with(body).twice
|
53
|
+
|
54
|
+
remote_settings = described_class.poll(project_id, host) {}
|
55
|
+
sleep(0.2)
|
56
|
+
remote_settings.stop_polling
|
57
|
+
|
58
|
+
expect(stub).to have_been_requested.once
|
59
|
+
end
|
60
|
+
|
61
|
+
it "yields the config to the block twice" do
|
62
|
+
block = proc {}
|
63
|
+
expect(block).to receive(:call).twice
|
64
|
+
|
65
|
+
remote_settings = described_class.poll(project_id, host, &block)
|
66
|
+
sleep(0.2)
|
67
|
+
remote_settings.stop_polling
|
68
|
+
|
69
|
+
expect(stub).to have_been_requested.once
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when config loading fails" do
|
73
|
+
it "logs an error" do
|
74
|
+
expect(File).to receive(:read).and_raise(StandardError)
|
75
|
+
expect(Airbrake::Loggable.instance).to receive(:error).with(
|
76
|
+
'**Airbrake: config loading failed: StandardError',
|
77
|
+
)
|
78
|
+
|
79
|
+
remote_settings = described_class.poll(project_id, host) {}
|
80
|
+
sleep(0.2)
|
81
|
+
remote_settings.stop_polling
|
82
|
+
|
83
|
+
expect(stub).to have_been_requested.once
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context "when no errors are raised" do
|
89
|
+
it "makes a request to AWS S3" do
|
90
|
+
remote_settings = described_class.poll(project_id, host) {}
|
91
|
+
sleep(0.1)
|
92
|
+
remote_settings.stop_polling
|
93
|
+
|
94
|
+
expect(stub).to have_been_requested.at_least_once
|
95
|
+
end
|
96
|
+
|
97
|
+
it "sends params about the environment with the request" do
|
98
|
+
remote_settings = described_class.poll(project_id, host) {}
|
99
|
+
sleep(0.1)
|
100
|
+
remote_settings.stop_polling
|
101
|
+
|
102
|
+
stub_with_query_params = stub.with(
|
103
|
+
query: URI.decode_www_form(described_class::QUERY_PARAMS).to_h,
|
104
|
+
)
|
105
|
+
expect(stub_with_query_params).to have_been_requested.at_least_once
|
106
|
+
end
|
107
|
+
|
108
|
+
it "fetches remote settings" do
|
109
|
+
settings = nil
|
110
|
+
remote_settings = described_class.poll(project_id, host) do |data|
|
111
|
+
settings = data
|
112
|
+
end
|
113
|
+
sleep(0.1)
|
114
|
+
remote_settings.stop_polling
|
115
|
+
|
116
|
+
expect(settings.error_notifications?).to eq(true)
|
117
|
+
expect(settings.performance_stats?).to eq(false)
|
118
|
+
expect(settings.interval).to eq(1)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context "when an error is raised while making a HTTP request" do
|
123
|
+
before do
|
124
|
+
allow(Net::HTTP).to receive(:get).and_raise(StandardError)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "doesn't fetch remote settings" do
|
128
|
+
settings = nil
|
129
|
+
remote_settings = described_class.poll(project_id, host) do |data|
|
130
|
+
settings = data
|
131
|
+
end
|
132
|
+
sleep(0.1)
|
133
|
+
remote_settings.stop_polling
|
134
|
+
|
135
|
+
expect(stub).not_to have_been_requested
|
136
|
+
expect(settings.interval).to eq(600)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context "when an error is raised while parsing returned JSON" do
|
141
|
+
before do
|
142
|
+
allow(JSON).to receive(:parse).and_raise(JSON::ParserError)
|
143
|
+
end
|
144
|
+
|
145
|
+
it "doesn't update settings data" do
|
146
|
+
settings = nil
|
147
|
+
remote_settings = described_class.poll(project_id, host) do |data|
|
148
|
+
settings = data
|
149
|
+
end
|
150
|
+
sleep(0.1)
|
151
|
+
remote_settings.stop_polling
|
152
|
+
|
153
|
+
expect(stub).to have_been_requested.once
|
154
|
+
expect(settings.interval).to eq(600)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
context "when API returns an XML response" do
|
159
|
+
let!(:stub) do
|
160
|
+
stub_request(:get, Regexp.new(endpoint))
|
161
|
+
.to_return(status: 200, body: '<?xml ...')
|
162
|
+
end
|
163
|
+
|
164
|
+
it "doesn't update settings data" do
|
165
|
+
settings = nil
|
166
|
+
remote_settings = described_class.poll(project_id, host) do |data|
|
167
|
+
settings = data
|
168
|
+
end
|
169
|
+
sleep(0.1)
|
170
|
+
remote_settings.stop_polling
|
171
|
+
|
172
|
+
expect(stub).to have_been_requested.once
|
173
|
+
expect(settings.interval).to eq(600)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context "when a config route is specified in the returned data" do
|
178
|
+
let(:new_config_route) do
|
179
|
+
'213/config/111/config.json'
|
180
|
+
end
|
181
|
+
|
182
|
+
let(:body) do
|
183
|
+
{ 'config_route' => new_config_route, 'poll_sec' => 0.1 }
|
184
|
+
end
|
185
|
+
|
186
|
+
let!(:new_stub) do
|
187
|
+
stub_request(:get, Regexp.new(new_config_route))
|
188
|
+
.to_return(status: 200, body: body.to_json)
|
189
|
+
end
|
190
|
+
|
191
|
+
it "makes the next request to the specified config route" do
|
192
|
+
remote_settings = described_class.poll(project_id, host) {}
|
193
|
+
sleep(0.2)
|
194
|
+
|
195
|
+
remote_settings.stop_polling
|
196
|
+
|
197
|
+
expect(stub).to have_been_requested.once
|
198
|
+
expect(new_stub).to have_been_requested.once
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe "#stop_polling" do
|
204
|
+
it "dumps config data to disk" do
|
205
|
+
expect(Dir).to receive(:mkdir).with(config_dir)
|
206
|
+
expect(File).to receive(:write).with(config_path, body.to_json)
|
207
|
+
|
208
|
+
remote_settings = described_class.poll(project_id, host) {}
|
209
|
+
sleep(0.2)
|
210
|
+
remote_settings.stop_polling
|
211
|
+
|
212
|
+
expect(stub).to have_been_requested.once
|
213
|
+
end
|
214
|
+
|
215
|
+
context "when config dumping fails" do
|
216
|
+
it "logs an error" do
|
217
|
+
expect(File).to receive(:write).and_raise(StandardError)
|
218
|
+
expect(Airbrake::Loggable.instance).to receive(:error).with(
|
219
|
+
'**Airbrake: config dumping failed: StandardError',
|
220
|
+
)
|
221
|
+
|
222
|
+
remote_settings = described_class.poll(project_id, host) {}
|
223
|
+
sleep(0.2)
|
224
|
+
remote_settings.stop_polling
|
225
|
+
|
226
|
+
expect(stub).to have_been_requested.once
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
data/spec/request_spec.rb
CHANGED
@@ -1,21 +1,9 @@
|
|
1
1
|
RSpec.describe Airbrake::Request do
|
2
2
|
describe "#stash" do
|
3
3
|
subject do
|
4
|
-
described_class.new(
|
5
|
-
method: 'GET', route: '/', status_code: 200, start_time: Time.now,
|
6
|
-
)
|
4
|
+
described_class.new(method: 'GET', route: '/', status_code: 200)
|
7
5
|
end
|
8
6
|
|
9
7
|
it { is_expected.to respond_to(:stash) }
|
10
8
|
end
|
11
|
-
|
12
|
-
describe "#end_time" do
|
13
|
-
it "is always equal to start_time + 1 second by default" do
|
14
|
-
time = Time.now
|
15
|
-
request = described_class.new(
|
16
|
-
method: 'GET', route: '/', status_code: 200, start_time: time,
|
17
|
-
)
|
18
|
-
expect(request.end_time).to eq(time + 1)
|
19
|
-
end
|
20
|
-
end
|
21
9
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -33,7 +33,7 @@ class AirbrakeTestError < RuntimeError
|
|
33
33
|
|
34
34
|
def initialize(*)
|
35
35
|
super
|
36
|
-
# rubocop:disable
|
36
|
+
# rubocop:disable Layout/LineLength
|
37
37
|
@backtrace = [
|
38
38
|
"/home/kyrylo/code/airbrake/ruby/spec/spec_helper.rb:23:in `<top (required)>'",
|
39
39
|
"/opt/rubies/ruby-2.2.2/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'",
|
@@ -49,7 +49,7 @@ class AirbrakeTestError < RuntimeError
|
|
49
49
|
"/home/kyrylo/.gem/ruby/2.2.2/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:41:in `invoke'",
|
50
50
|
"/home/kyrylo/.gem/ruby/2.2.2/gems/rspec-core-3.3.2/exe/rspec:4:in `<main>'",
|
51
51
|
]
|
52
|
-
# rubocop:enable
|
52
|
+
# rubocop:enable Layout/LineLength
|
53
53
|
end
|
54
54
|
|
55
55
|
# rubocop:disable Naming/AccessorMethodName
|
@@ -66,7 +66,7 @@ end
|
|
66
66
|
class JavaAirbrakeTestError < AirbrakeTestError
|
67
67
|
def initialize(*)
|
68
68
|
super
|
69
|
-
# rubocop:disable
|
69
|
+
# rubocop:disable Layout/LineLength
|
70
70
|
@backtrace = [
|
71
71
|
"org.jruby.java.invokers.InstanceMethodInvoker.call(InstanceMethodInvoker.java:26)",
|
72
72
|
"org.jruby.ir.interpreter.Interpreter.INTERPRET_EVAL(Interpreter.java:126)",
|
@@ -80,7 +80,7 @@ class JavaAirbrakeTestError < AirbrakeTestError
|
|
80
80
|
"org.jruby.Main.run(Main.java:225)",
|
81
81
|
"org.jruby.Main.main(Main.java:197)",
|
82
82
|
]
|
83
|
-
# rubocop:enable
|
83
|
+
# rubocop:enable Layout/LineLength
|
84
84
|
end
|
85
85
|
|
86
86
|
def is_a?(*)
|
data/spec/stat_spec.rb
CHANGED
@@ -10,15 +10,6 @@ RSpec.describe Airbrake::Stat do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
describe "#increment" do
|
14
|
-
let(:start_time) { Time.new(2018, 1, 1, 0, 0, 20, 0) }
|
15
|
-
let(:end_time) { Time.new(2018, 1, 1, 0, 0, 22, 0) }
|
16
|
-
|
17
|
-
before { subject.increment(start_time, end_time) }
|
18
|
-
|
19
|
-
its(:sum) { is_expected.to eq(2000) }
|
20
|
-
end
|
21
|
-
|
22
13
|
describe "#increment_ms" do
|
23
14
|
before { subject.increment_ms(1000) }
|
24
15
|
|
data/spec/sync_sender_spec.rb
CHANGED
@@ -27,7 +27,9 @@ RSpec.describe Airbrake::SyncSender do
|
|
27
27
|
expect(
|
28
28
|
a_request(:post, endpoint).with(
|
29
29
|
headers: {
|
30
|
-
'User-Agent' => %r{
|
30
|
+
'User-Agent' => %r{
|
31
|
+
airbrake-ruby/\d+\.\d+\.\d+(\.rc\.\d+)?\sRuby/\d+\.\d+\.\d+
|
32
|
+
}x,
|
31
33
|
},
|
32
34
|
),
|
33
35
|
).to have_been_made.once
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: airbrake-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.2
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Airbrake Technologies, Inc.
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rbtree-jruby
|
@@ -44,6 +44,7 @@ files:
|
|
44
44
|
- lib/airbrake-ruby/benchmark.rb
|
45
45
|
- lib/airbrake-ruby/code_hunk.rb
|
46
46
|
- lib/airbrake-ruby/config.rb
|
47
|
+
- lib/airbrake-ruby/config/processor.rb
|
47
48
|
- lib/airbrake-ruby/config/validator.rb
|
48
49
|
- lib/airbrake-ruby/deploy_notifier.rb
|
49
50
|
- lib/airbrake-ruby/file_cache.rb
|
@@ -77,6 +78,9 @@ files:
|
|
77
78
|
- lib/airbrake-ruby/promise.rb
|
78
79
|
- lib/airbrake-ruby/query.rb
|
79
80
|
- lib/airbrake-ruby/queue.rb
|
81
|
+
- lib/airbrake-ruby/remote_settings.rb
|
82
|
+
- lib/airbrake-ruby/remote_settings/callback.rb
|
83
|
+
- lib/airbrake-ruby/remote_settings/settings_data.rb
|
80
84
|
- lib/airbrake-ruby/request.rb
|
81
85
|
- lib/airbrake-ruby/response.rb
|
82
86
|
- lib/airbrake-ruby/stashable.rb
|
@@ -93,6 +97,7 @@ files:
|
|
93
97
|
- spec/backtrace_spec.rb
|
94
98
|
- spec/benchmark_spec.rb
|
95
99
|
- spec/code_hunk_spec.rb
|
100
|
+
- spec/config/processor_spec.rb
|
96
101
|
- spec/config/validator_spec.rb
|
97
102
|
- spec/config_spec.rb
|
98
103
|
- spec/deploy_notifier_spec.rb
|
@@ -131,6 +136,9 @@ files:
|
|
131
136
|
- spec/promise_spec.rb
|
132
137
|
- spec/query_spec.rb
|
133
138
|
- spec/queue_spec.rb
|
139
|
+
- spec/remote_settings/callback_spec.rb
|
140
|
+
- spec/remote_settings/settings_data_spec.rb
|
141
|
+
- spec/remote_settings_spec.rb
|
134
142
|
- spec/request_spec.rb
|
135
143
|
- spec/response_spec.rb
|
136
144
|
- spec/spec_helper.rb
|
@@ -146,7 +154,7 @@ homepage: https://airbrake.io
|
|
146
154
|
licenses:
|
147
155
|
- MIT
|
148
156
|
metadata: {}
|
149
|
-
post_install_message:
|
157
|
+
post_install_message:
|
150
158
|
rdoc_options: []
|
151
159
|
require_paths:
|
152
160
|
- lib
|
@@ -154,7 +162,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
154
162
|
requirements:
|
155
163
|
- - ">="
|
156
164
|
- !ruby/object:Gem::Version
|
157
|
-
version: '2.
|
165
|
+
version: '2.3'
|
158
166
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
167
|
requirements:
|
160
168
|
- - ">="
|
@@ -162,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
170
|
version: '0'
|
163
171
|
requirements: []
|
164
172
|
rubygems_version: 3.1.2
|
165
|
-
signing_key:
|
173
|
+
signing_key:
|
166
174
|
specification_version: 4
|
167
175
|
summary: Ruby notifier for https://airbrake.io
|
168
176
|
test_files:
|
@@ -196,6 +204,7 @@ test_files:
|
|
196
204
|
- spec/promise_spec.rb
|
197
205
|
- spec/thread_pool_spec.rb
|
198
206
|
- spec/config/validator_spec.rb
|
207
|
+
- spec/config/processor_spec.rb
|
199
208
|
- spec/sync_sender_spec.rb
|
200
209
|
- spec/ignorable_spec.rb
|
201
210
|
- spec/deploy_notifier_spec.rb
|
@@ -207,6 +216,8 @@ test_files:
|
|
207
216
|
- spec/request_spec.rb
|
208
217
|
- spec/notice_notifier/options_spec.rb
|
209
218
|
- spec/filter_chain_spec.rb
|
219
|
+
- spec/remote_settings/settings_data_spec.rb
|
220
|
+
- spec/remote_settings/callback_spec.rb
|
210
221
|
- spec/response_spec.rb
|
211
222
|
- spec/queue_spec.rb
|
212
223
|
- spec/code_hunk_spec.rb
|
@@ -220,3 +231,4 @@ test_files:
|
|
220
231
|
- spec/inspectable_spec.rb
|
221
232
|
- spec/stashable_spec.rb
|
222
233
|
- spec/query_spec.rb
|
234
|
+
- spec/remote_settings_spec.rb
|