airbrake-ruby 4.2.3-java → 4.2.4-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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 21a4892144d86df478ce7d7d694797e7ed01e1a6
4
- data.tar.gz: b286b7e4ac43b7386c67ad1f98403a8f8cbc9371
3
+ metadata.gz: 95d28a9be05212c519e1626767a363c09dedb9b4
4
+ data.tar.gz: 7f423d7dc6a3d470d3309a6b2443c94166b0e622
5
5
  SHA512:
6
- metadata.gz: f1840ca5c36d9d581403fa7eed0db66f4a750636b6759ae86f44e02b0246106035dcaf9946c4316ba16a61719844f6aabb690c12199c9e8d557a382c07b43e8c
7
- data.tar.gz: 81cd2aa61fa9cb2f325f4b6d3578ff820db81393e8be563635963098c8c68e3e4020e55362fbb5df11a7a752ca47a83c3c08b4b62bf42122918f8185274c0efc
6
+ metadata.gz: f1bb40a3498c6d48b13aa665152d9235a23edc20416468eedd46862841d00e5db4a059cda730dc80d4681e2ec890e12060db8ce0239e8de36618514956b98d24
7
+ data.tar.gz: a688273b29302a1c6b831f33f9a76afa2bdad6d399e3defd2f43b737e6e81defbc0ebd7322098a7db9e98111505ebb64cd22912041f051adf2b4eb05bcb7ba81
@@ -0,0 +1,14 @@
1
+ module Airbrake
2
+ # Benchmark benchmarks Ruby code.
3
+ #
4
+ # @since v4.3.0
5
+ # @api private
6
+ module Benchmark
7
+ # Measures monotonic time for the given operation.
8
+ def self.measure
9
+ start = MonotonicTime.time_in_ms
10
+ yield
11
+ MonotonicTime.time_in_ms - start
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,43 @@
1
+ module Airbrake
2
+ # MonotonicTime is a helper for getting monotonic time suitable for
3
+ # performance measurements. It guarantees that the time is strictly linearly
4
+ # increasing (unlike realtime).
5
+ #
6
+ # @example
7
+ # MonotonicTime.time_in_ms #=> 287138801.144576
8
+ #
9
+ # @see http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html
10
+ # @since v4.3.0
11
+ # @api private
12
+ module MonotonicTime
13
+ class << self
14
+ # @return [Integer] current monotonic time in milliseconds
15
+ def time_in_ms
16
+ time_in_nanoseconds / (10.0**6)
17
+ end
18
+
19
+ private
20
+
21
+ if defined?(Process::CLOCK_MONOTONIC)
22
+
23
+ def time_in_nanoseconds
24
+ Process.clock_gettime(Process::CLOCK_MONOTONIC, :nanosecond)
25
+ end
26
+
27
+ elsif RUBY_ENGINE == 'jruby'
28
+
29
+ def time_in_nanoseconds
30
+ java.lang.System.nanoTime
31
+ end
32
+
33
+ else
34
+
35
+ def time_in_nanoseconds
36
+ time = Time.now
37
+ time.to_i * (10**9) + time.nsec
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+ end
@@ -25,7 +25,10 @@ module Airbrake
25
25
  @async_sender = AsyncSender.new
26
26
  @sync_sender = SyncSender.new
27
27
 
28
- add_default_filters
28
+ DEFAULT_FILTERS.each { |filter| add_filter(filter.new) }
29
+
30
+ add_filter(Airbrake::Filters::ContextFilter.new(@context))
31
+ add_filter(Airbrake::Filters::ExceptionAttributesFilter.new)
29
32
  end
30
33
 
31
34
  # @macro see_public_api_method
@@ -127,35 +130,5 @@ module Airbrake
127
130
  return caller_copy if clean_bt.empty?
128
131
  clean_bt
129
132
  end
130
-
131
- # rubocop:disable Metrics/AbcSize
132
- def add_default_filters
133
- DEFAULT_FILTERS.each { |f| add_filter(f.new) }
134
-
135
- if (whitelist_keys = @config.whitelist_keys).any?
136
- add_filter(Airbrake::Filters::KeysWhitelist.new(whitelist_keys))
137
- end
138
-
139
- if (blacklist_keys = @config.blacklist_keys).any?
140
- add_filter(Airbrake::Filters::KeysBlacklist.new(blacklist_keys))
141
- end
142
-
143
- add_filter(Airbrake::Filters::ContextFilter.new(@context))
144
- add_filter(Airbrake::Filters::ExceptionAttributesFilter.new)
145
-
146
- return unless (root_directory = @config.root_directory)
147
- [
148
- Airbrake::Filters::RootDirectoryFilter,
149
- Airbrake::Filters::GitRevisionFilter,
150
- Airbrake::Filters::GitRepositoryFilter
151
- ].each do |filter|
152
- add_filter(filter.new(root_directory))
153
- end
154
-
155
- add_filter(
156
- Airbrake::Filters::GitLastCheckoutFilter.new(root_directory)
157
- )
158
- end
159
- # rubocop:enable Metrics/AbcSize
160
133
  end
161
134
  end
@@ -2,5 +2,5 @@
2
2
  # More information: http://semver.org/
3
3
  module Airbrake
4
4
  # @return [String] the library version
5
- AIRBRAKE_RUBY_VERSION = '4.2.3'.freeze
5
+ AIRBRAKE_RUBY_VERSION = '4.2.4'.freeze
6
6
  end
data/lib/airbrake-ruby.rb CHANGED
@@ -47,6 +47,8 @@ require 'airbrake-ruby/tdigest'
47
47
  require 'airbrake-ruby/query'
48
48
  require 'airbrake-ruby/request'
49
49
  require 'airbrake-ruby/performance_breakdown'
50
+ require 'airbrake-ruby/benchmark'
51
+ require 'airbrake-ruby/monotonic_time'
50
52
 
51
53
  # Airbrake is a thin wrapper around instances of the notifier classes (such as
52
54
  # notice, performance & deploy notifiers). It creates a way to access them via a
@@ -81,15 +83,15 @@ module Airbrake
81
83
  class << self
82
84
  # @since v4.2.3
83
85
  # @api private
84
- attr_accessor :performance_notifier
86
+ attr_writer :performance_notifier
85
87
 
86
88
  # @since v4.2.3
87
89
  # @api private
88
- attr_accessor :notice_notifier
90
+ attr_writer :notice_notifier
89
91
 
90
92
  # @since v4.2.3
91
93
  # @api private
92
- attr_accessor :deploy_notifier
94
+ attr_writer :deploy_notifier
93
95
 
94
96
  # Configures the Airbrake notifier.
95
97
  #
@@ -99,19 +101,31 @@ module Airbrake
99
101
  # c.project_key = 'fd04e13d806a90f96614ad8e529b2822'
100
102
  # end
101
103
  #
102
- # @yield [config] The configuration object
104
+ # @yield [config]
103
105
  # @yieldparam config [Airbrake::Config]
104
106
  # @return [void]
105
- # @raise [Airbrake::Error] when trying to reconfigure already
106
- # existing notifier
107
- # @note There's no way to read config values outside of this library
108
107
  def configure
109
108
  yield config = Airbrake::Config.instance
110
109
  Airbrake::Loggable.instance = config.logger
110
+ process_config_options(config)
111
+ end
111
112
 
112
- return if performance_notifier && notice_notifier && deploy_notifier
113
+ # @since v4.2.3
114
+ # @api private
115
+ def performance_notifier
116
+ @performance_notifier ||= NoticeNotifier.new
117
+ end
113
118
 
114
- reset
119
+ # @since v4.2.3
120
+ # @api private
121
+ def notice_notifier
122
+ @notice_notifier ||= NoticeNotifier.new
123
+ end
124
+
125
+ # @since v4.2.3
126
+ # @api private
127
+ def deploy_notifier
128
+ @deploy_notifier ||= PerformanceNotifier.new
115
129
  end
116
130
 
117
131
  # @return [Boolean] true if the notifier was configured, false otherwise
@@ -459,9 +473,30 @@ module Airbrake
459
473
  self.notice_notifier = NoticeNotifier.new
460
474
  self.deploy_notifier = DeployNotifier.new
461
475
  end
462
- end
463
- end
464
476
 
465
- Airbrake.configure do
466
- # Initialize Airbrake with default notifiers.
477
+ private
478
+
479
+ def process_config_options(config)
480
+ if config.blacklist_keys.any?
481
+ blacklist = Airbrake::Filters::KeysBlacklist.new(config.blacklist_keys)
482
+ notice_notifier.add_filter(blacklist)
483
+ end
484
+
485
+ if config.whitelist_keys.any?
486
+ whitelist = Airbrake::Filters::KeysWhitelist.new(config.whitelist_keys)
487
+ notice_notifier.add_filter(whitelist)
488
+ end
489
+
490
+ return unless config.root_directory
491
+
492
+ [
493
+ Airbrake::Filters::RootDirectoryFilter,
494
+ Airbrake::Filters::GitRevisionFilter,
495
+ Airbrake::Filters::GitRepositoryFilter,
496
+ Airbrake::Filters::GitLastCheckoutFilter
497
+ ].each do |filter|
498
+ notice_notifier.add_filter(filter.new(config.root_directory))
499
+ end
500
+ end
501
+ end
467
502
  end
@@ -98,6 +98,88 @@ RSpec.describe Airbrake do
98
98
  expect(described_class.deploy_notifier).to eql(deploy_notifier)
99
99
  end
100
100
  end
101
+
102
+ context "when blacklist_keys gets configured" do
103
+ before { allow(Airbrake.notice_notifier).to receive(:add_filter) }
104
+
105
+ it "adds blacklist filter" do
106
+ expect(Airbrake.notice_notifier).to receive(:add_filter)
107
+ .with(an_instance_of(Airbrake::Filters::KeysBlacklist))
108
+ described_class.configure { |c| c.blacklist_keys = %w[password] }
109
+ end
110
+
111
+ it "initializes blacklist with specified parameters" do
112
+ expect(Airbrake::Filters::KeysBlacklist).to receive(:new).with(%w[password])
113
+ described_class.configure { |c| c.blacklist_keys = %w[password] }
114
+ end
115
+ end
116
+
117
+ context "when whitelist_keys gets configured" do
118
+ before { allow(Airbrake.notice_notifier).to receive(:add_filter) }
119
+
120
+ it "adds whitelist filter" do
121
+ expect(Airbrake.notice_notifier).to receive(:add_filter)
122
+ .with(an_instance_of(Airbrake::Filters::KeysWhitelist))
123
+ described_class.configure { |c| c.whitelist_keys = %w[banana] }
124
+ end
125
+
126
+ it "initializes whitelist with specified parameters" do
127
+ expect(Airbrake::Filters::KeysWhitelist).to receive(:new).with(%w[banana])
128
+ described_class.configure { |c| c.whitelist_keys = %w[banana] }
129
+ end
130
+ end
131
+
132
+ context "when root_directory gets configured" do
133
+ before { allow(Airbrake.notice_notifier).to receive(:add_filter) }
134
+
135
+ it "adds root directory filter" do
136
+ expect(Airbrake.notice_notifier).to receive(:add_filter)
137
+ .with(an_instance_of(Airbrake::Filters::RootDirectoryFilter))
138
+ described_class.configure { |c| c.root_directory = '/my/path' }
139
+ end
140
+
141
+ it "initializes root directory filter with specified path" do
142
+ expect(Airbrake::Filters::RootDirectoryFilter)
143
+ .to receive(:new).with('/my/path')
144
+ described_class.configure { |c| c.root_directory = '/my/path' }
145
+ end
146
+
147
+ it "adds git revision filter" do
148
+ expect(Airbrake.notice_notifier).to receive(:add_filter)
149
+ .with(an_instance_of(Airbrake::Filters::GitRevisionFilter))
150
+ described_class.configure { |c| c.root_directory = '/my/path' }
151
+ end
152
+
153
+ it "initializes git revision filter with correct root directory" do
154
+ expect(Airbrake::Filters::GitRevisionFilter)
155
+ .to receive(:new).with('/my/path')
156
+ described_class.configure { |c| c.root_directory = '/my/path' }
157
+ end
158
+
159
+ it "adds git repository filter" do
160
+ expect(Airbrake.notice_notifier).to receive(:add_filter)
161
+ .with(an_instance_of(Airbrake::Filters::GitRepositoryFilter))
162
+ described_class.configure { |c| c.root_directory = '/my/path' }
163
+ end
164
+
165
+ it "initializes git repository filter with correct root directory" do
166
+ expect(Airbrake::Filters::GitRepositoryFilter)
167
+ .to receive(:new).with('/my/path')
168
+ described_class.configure { |c| c.root_directory = '/my/path' }
169
+ end
170
+
171
+ it "adds git last checkout filter" do
172
+ expect(Airbrake.notice_notifier).to receive(:add_filter)
173
+ .with(an_instance_of(Airbrake::Filters::GitLastCheckoutFilter))
174
+ described_class.configure { |c| c.root_directory = '/my/path' }
175
+ end
176
+
177
+ it "initializes git last checkout filter with correct root directory" do
178
+ expect(Airbrake::Filters::GitLastCheckoutFilter)
179
+ .to receive(:new).with('/my/path')
180
+ described_class.configure { |c| c.root_directory = '/my/path' }
181
+ end
182
+ end
101
183
  end
102
184
 
103
185
  describe "#reset" do
@@ -0,0 +1,7 @@
1
+ RSpec.describe Airbrake::Benchmark do
2
+ describe ".measure" do
3
+ it "returns measured performance time" do
4
+ expect(subject.measure { '10' * 10 }).to be_kind_of(Numeric)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ RSpec.describe Airbrake::MonotonicTime do
2
+ describe ".time_in_ms" do
3
+ it "returns monotonic time in milliseconds" do
4
+ expect(subject.time_in_ms).to be_a(Float)
5
+ end
6
+
7
+ it "always returns time in the future" do
8
+ old_time = subject.time_in_ms
9
+ expect(subject.time_in_ms).to be > old_time
10
+ end
11
+ end
12
+ end
@@ -63,7 +63,9 @@ RSpec.describe Airbrake::NoticeNotifier do
63
63
 
64
64
  describe ":root_directory" do
65
65
  before do
66
- Airbrake::Config.instance.merge(root_directory: '/home/kyrylo/code')
66
+ subject.add_filter(
67
+ Airbrake::Filters::RootDirectoryFilter.new('/home/kyrylo/code')
68
+ )
67
69
  end
68
70
 
69
71
  it "filters out frames" do
@@ -23,62 +23,6 @@ RSpec.describe Airbrake::NoticeNotifier do
23
23
  .with(instance_of(Airbrake::Filters::ExceptionAttributesFilter))
24
24
  subject
25
25
  end
26
-
27
- context "when user config has some whitelist keys" do
28
- before { Airbrake::Config.instance.merge(whitelist_keys: %w[foo]) }
29
-
30
- it "appends the whitelist filter" do
31
- expect_any_instance_of(Airbrake::FilterChain).to receive(:add_filter)
32
- .with(instance_of(Airbrake::Filters::KeysWhitelist))
33
- subject
34
- end
35
- end
36
-
37
- context "when user config doesn't have any whitelist keys" do
38
- it "doesn't append the whitelist filter" do
39
- expect_any_instance_of(Airbrake::FilterChain).not_to receive(:add_filter)
40
- .with(instance_of(Airbrake::Filters::KeysWhitelist))
41
- subject
42
- end
43
- end
44
-
45
- context "when user config has some blacklist keys" do
46
- before { Airbrake::Config.instance.merge(blacklist_keys: %w[bar]) }
47
-
48
- it "appends the blacklist filter" do
49
- expect_any_instance_of(Airbrake::FilterChain).to receive(:add_filter)
50
- .with(instance_of(Airbrake::Filters::KeysBlacklist))
51
- subject
52
- end
53
- end
54
-
55
- context "when user config doesn't have any blacklist keys" do
56
- it "doesn't append the blacklist filter" do
57
- expect_any_instance_of(Airbrake::FilterChain).not_to receive(:add_filter)
58
- .with(instance_of(Airbrake::Filters::KeysBlacklist))
59
- subject
60
- end
61
- end
62
-
63
- context "when user config specifies a root directory" do
64
- before { Airbrake::Config.instance.merge(root_directory: '/foo') }
65
-
66
- it "appends the root directory filter" do
67
- expect_any_instance_of(Airbrake::FilterChain).to receive(:add_filter)
68
- .with(instance_of(Airbrake::Filters::RootDirectoryFilter))
69
- subject
70
- end
71
- end
72
-
73
- context "when user config doesn't specify a root directory" do
74
- it "doesn't append the root directory filter" do
75
- expect_any_instance_of(Airbrake::Config).to receive(:root_directory)
76
- .and_return(nil)
77
- expect_any_instance_of(Airbrake::FilterChain).not_to receive(:add_filter)
78
- .with(instance_of(Airbrake::Filters::RootDirectoryFilter))
79
- subject
80
- end
81
- end
82
26
  end
83
27
  end
84
28
 
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.2.3
4
+ version: 4.2.4
5
5
  platform: java
6
6
  authors:
7
7
  - Airbrake Technologies, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-08 00:00:00.000000000 Z
11
+ date: 2019-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rbtree-jruby
@@ -41,6 +41,7 @@ files:
41
41
  - lib/airbrake-ruby.rb
42
42
  - lib/airbrake-ruby/async_sender.rb
43
43
  - lib/airbrake-ruby/backtrace.rb
44
+ - lib/airbrake-ruby/benchmark.rb
44
45
  - lib/airbrake-ruby/code_hunk.rb
45
46
  - lib/airbrake-ruby/config.rb
46
47
  - lib/airbrake-ruby/config/validator.rb
@@ -65,6 +66,7 @@ files:
65
66
  - lib/airbrake-ruby/ignorable.rb
66
67
  - lib/airbrake-ruby/inspectable.rb
67
68
  - lib/airbrake-ruby/loggable.rb
69
+ - lib/airbrake-ruby/monotonic_time.rb
68
70
  - lib/airbrake-ruby/nested_exception.rb
69
71
  - lib/airbrake-ruby/notice.rb
70
72
  - lib/airbrake-ruby/notice_notifier.rb
@@ -83,6 +85,7 @@ files:
83
85
  - spec/airbrake_spec.rb
84
86
  - spec/async_sender_spec.rb
85
87
  - spec/backtrace_spec.rb
88
+ - spec/benchmark_spec.rb
86
89
  - spec/code_hunk_spec.rb
87
90
  - spec/config/validator_spec.rb
88
91
  - spec/config_spec.rb
@@ -111,6 +114,7 @@ files:
111
114
  - spec/helpers.rb
112
115
  - spec/ignorable_spec.rb
113
116
  - spec/inspectable_spec.rb
117
+ - spec/monotonic_time_spec.rb
114
118
  - spec/nested_exception_spec.rb
115
119
  - spec/notice_notifier_spec.rb
116
120
  - spec/notice_notifier_spec/options_spec.rb
@@ -150,6 +154,7 @@ specification_version: 4
150
154
  summary: Ruby notifier for https://airbrake.io
151
155
  test_files:
152
156
  - spec/truncator_spec.rb
157
+ - spec/benchmark_spec.rb
153
158
  - spec/helpers.rb
154
159
  - spec/filters/exception_attributes_filter_spec.rb
155
160
  - spec/filters/root_directory_filter_spec.rb
@@ -191,5 +196,6 @@ test_files:
191
196
  - spec/fixtures/project_root/code.rb
192
197
  - spec/fixtures/project_root/short_file.rb
193
198
  - spec/fixtures/project_root/vendor/bundle/ignored_file.rb
199
+ - spec/monotonic_time_spec.rb
194
200
  - spec/inspectable_spec.rb
195
201
  - spec/notice_notifier_spec/options_spec.rb