airbrake-ruby 4.10.1 → 4.11.1
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 +23 -26
- data/lib/airbrake-ruby/benchmark.rb +1 -1
- data/lib/airbrake-ruby/notice_notifier.rb +2 -1
- data/lib/airbrake-ruby/performance_breakdown.rb +11 -6
- data/lib/airbrake-ruby/performance_notifier.rb +32 -6
- data/lib/airbrake-ruby/query.rb +12 -6
- data/lib/airbrake-ruby/queue.rb +12 -8
- data/lib/airbrake-ruby/request.rb +12 -8
- data/lib/airbrake-ruby/version.rb +1 -1
- data/spec/airbrake_spec.rb +9 -9
- data/spec/config_spec.rb +3 -7
- data/spec/filters/sql_filter_spec.rb +1 -3
- data/spec/notice_notifier_spec.rb +2 -2
- data/spec/performance_notifier_spec.rb +98 -38
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6b9d78ba8789ccfa27f139a5ad0fef6b544da9bde4239dfda22cc543493bdb45
|
|
4
|
+
data.tar.gz: c32c7e64425037221491c64de8e22d548815929ec6e3a0289aad3c74f8ffedc7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 711d058e48af32390e7b92243171014122b5e454cea35afd19ca72e5fe39d04b919f0cbc95dfdf23685a3114cac14430310eb5a0c785c263d85a52ca26bab861
|
|
7
|
+
data.tar.gz: 300176c0bab2a6ddcb4b3453069be19ef5a477021ca10f68256edabc97c9d0d15b3b4a5659f2676e53071f89229b59c90ac6d0f1016d953342af8d9fc8b27581
|
data/lib/airbrake-ruby.rb
CHANGED
|
@@ -328,9 +328,8 @@ module Airbrake
|
|
|
328
328
|
notice_notifier.merge_context(context)
|
|
329
329
|
end
|
|
330
330
|
|
|
331
|
-
# Increments request statistics of a certain +route+
|
|
332
|
-
#
|
|
333
|
-
# +status_code+.
|
|
331
|
+
# Increments request statistics of a certain +route+ invoked with +method+,
|
|
332
|
+
# which returned +status_code+.
|
|
334
333
|
#
|
|
335
334
|
# After a certain amount of time (n seconds) the aggregated route
|
|
336
335
|
# information will be sent to Airbrake.
|
|
@@ -343,8 +342,7 @@ module Airbrake
|
|
|
343
342
|
# func: 'do_stuff',
|
|
344
343
|
# file: 'app/models/foo.rb',
|
|
345
344
|
# line: 452,
|
|
346
|
-
#
|
|
347
|
-
# end_time: Time.now
|
|
345
|
+
# timing: 123.45 # ms
|
|
348
346
|
# )
|
|
349
347
|
#
|
|
350
348
|
# @param [Hash{Symbol=>Object}] request_info
|
|
@@ -358,8 +356,8 @@ module Airbrake
|
|
|
358
356
|
# called the query (optional)
|
|
359
357
|
# @option request_info [Integer] :line The line that executes the query
|
|
360
358
|
# (optional)
|
|
361
|
-
# @option request_info [
|
|
362
|
-
#
|
|
359
|
+
# @option request_info [Float] :timing How much time it took to process the
|
|
360
|
+
# request (in ms)
|
|
363
361
|
# @param [Hash] stash What needs to be appeneded to the stash, so it's
|
|
364
362
|
# available in filters
|
|
365
363
|
# @return [void]
|
|
@@ -371,9 +369,8 @@ module Airbrake
|
|
|
371
369
|
performance_notifier.notify(request)
|
|
372
370
|
end
|
|
373
371
|
|
|
374
|
-
# Synchronously
|
|
375
|
-
#
|
|
376
|
-
# returned +status_code+.
|
|
372
|
+
# Synchronously increments request statistics of a certain +route+ invoked
|
|
373
|
+
# with +method+, which returned +status_code+.
|
|
377
374
|
# @since v4.10.0
|
|
378
375
|
# @see .notify_request
|
|
379
376
|
def notify_request_sync(request_info, stash = {})
|
|
@@ -382,9 +379,8 @@ module Airbrake
|
|
|
382
379
|
performance_notifier.notify_sync(request)
|
|
383
380
|
end
|
|
384
381
|
|
|
385
|
-
# Increments SQL statistics of a certain +query
|
|
386
|
-
#
|
|
387
|
-
# provided, the query is grouped by these parameters.
|
|
382
|
+
# Increments SQL statistics of a certain +query+. When +method+ and +route+
|
|
383
|
+
# are provided, the query is grouped by these parameters.
|
|
388
384
|
#
|
|
389
385
|
# After a certain amount of time (n seconds) the aggregated query
|
|
390
386
|
# information will be sent to Airbrake.
|
|
@@ -394,18 +390,17 @@ module Airbrake
|
|
|
394
390
|
# method: 'GET',
|
|
395
391
|
# route: '/things',
|
|
396
392
|
# query: 'SELECT * FROM things',
|
|
397
|
-
#
|
|
398
|
-
# end_time: Time.now
|
|
393
|
+
# timing: 123.45 # ms
|
|
399
394
|
# )
|
|
400
395
|
#
|
|
401
396
|
# @param [Hash{Symbol=>Object}] query_info
|
|
402
|
-
# @option
|
|
397
|
+
# @option query_info [String] :method The HTTP method that triggered this
|
|
403
398
|
# SQL query (optional)
|
|
404
|
-
# @option
|
|
399
|
+
# @option query_info [String] :route The route that triggered this SQL
|
|
405
400
|
# query (optional)
|
|
406
|
-
# @option
|
|
407
|
-
# @option
|
|
408
|
-
#
|
|
401
|
+
# @option query_info [String] :query The query that was executed
|
|
402
|
+
# @option query_info [Float] :timing How much time it took to process the
|
|
403
|
+
# query (in ms)
|
|
409
404
|
# @param [Hash] stash What needs to be appeneded to the stash, so it's
|
|
410
405
|
# available in filters
|
|
411
406
|
# @return [void]
|
|
@@ -417,9 +412,9 @@ module Airbrake
|
|
|
417
412
|
performance_notifier.notify(query)
|
|
418
413
|
end
|
|
419
414
|
|
|
420
|
-
# Synchronously increments SQL statistics of a certain +query
|
|
421
|
-
#
|
|
422
|
-
#
|
|
415
|
+
# Synchronously increments SQL statistics of a certain +query+. When
|
|
416
|
+
# +method+ and +route+ are provided, the query is grouped by these
|
|
417
|
+
# parameters.
|
|
423
418
|
# @since v4.10.0
|
|
424
419
|
# @see .notify_query
|
|
425
420
|
def notify_query_sync(query_info, stash = {})
|
|
@@ -436,8 +431,7 @@ module Airbrake
|
|
|
436
431
|
# route: '/thing/:id/create',
|
|
437
432
|
# response_type: 'json',
|
|
438
433
|
# groups: { db: 24.0, view: 0.4 }, # ms
|
|
439
|
-
#
|
|
440
|
-
# end_time: Time.now
|
|
434
|
+
# timing: 123.45 # ms
|
|
441
435
|
# )
|
|
442
436
|
#
|
|
443
437
|
# @param [Hash{Symbol=>Object}] breakdown_info
|
|
@@ -445,7 +439,8 @@ module Airbrake
|
|
|
445
439
|
# @option breakdown_info [String] :route
|
|
446
440
|
# @option breakdown_info [String] :response_type
|
|
447
441
|
# @option breakdown_info [Array<Hash{Symbol=>Float}>] :groups
|
|
448
|
-
# @option breakdown_info [
|
|
442
|
+
# @option breakdown_info [Float] :timing How much time it took to process
|
|
443
|
+
# the performance breakdown (in ms)
|
|
449
444
|
# @param [Hash] stash What needs to be appeneded to the stash, so it's
|
|
450
445
|
# available in filters
|
|
451
446
|
# @return [void]
|
|
@@ -481,6 +476,8 @@ module Airbrake
|
|
|
481
476
|
# failed
|
|
482
477
|
# @option queue_info [Array<Hash{Symbol=>Float}>] :groups Where the job
|
|
483
478
|
# spent its time
|
|
479
|
+
# @option breakdown_info [Float] :timing How much time it took to process
|
|
480
|
+
# the queue (in ms)
|
|
484
481
|
# @param [Hash] stash What needs to be appended to the stash, so it's
|
|
485
482
|
# available in filters
|
|
486
483
|
# @return [void]
|
|
@@ -55,7 +55,8 @@ module Airbrake
|
|
|
55
55
|
def build_notice(exception, params = {})
|
|
56
56
|
if @async_sender.closed?
|
|
57
57
|
raise Airbrake::Error,
|
|
58
|
-
"
|
|
58
|
+
"Airbrake is closed; can't build exception: " \
|
|
59
|
+
"#{exception.class}: #{exception}"
|
|
59
60
|
end
|
|
60
61
|
|
|
61
62
|
if exception.is_a?(Airbrake::Notice)
|
|
@@ -7,7 +7,8 @@ module Airbrake
|
|
|
7
7
|
# @since v4.2.0
|
|
8
8
|
# rubocop:disable Metrics/BlockLength, Metrics/ParameterLists
|
|
9
9
|
PerformanceBreakdown = Struct.new(
|
|
10
|
-
:method, :route, :response_type, :groups, :start_time, :end_time
|
|
10
|
+
:method, :route, :response_type, :groups, :start_time, :end_time, :timing,
|
|
11
|
+
:time
|
|
11
12
|
) do
|
|
12
13
|
include HashKeyable
|
|
13
14
|
include Ignorable
|
|
@@ -19,11 +20,15 @@ module Airbrake
|
|
|
19
20
|
route:,
|
|
20
21
|
response_type:,
|
|
21
22
|
groups:,
|
|
22
|
-
start_time
|
|
23
|
-
end_time: start_time + 1
|
|
23
|
+
start_time: Time.now,
|
|
24
|
+
end_time: start_time + 1,
|
|
25
|
+
timing: nil,
|
|
26
|
+
time: Time.now
|
|
24
27
|
)
|
|
25
|
-
@
|
|
26
|
-
super(
|
|
28
|
+
@time_utc = TimeTruncate.utc_truncate_minutes(time)
|
|
29
|
+
super(
|
|
30
|
+
method, route, response_type, groups, start_time, end_time, timing, time
|
|
31
|
+
)
|
|
27
32
|
end
|
|
28
33
|
|
|
29
34
|
def destination
|
|
@@ -39,7 +44,7 @@ module Airbrake
|
|
|
39
44
|
'method' => method,
|
|
40
45
|
'route' => route,
|
|
41
46
|
'responseType' => response_type,
|
|
42
|
-
'time' => @
|
|
47
|
+
'time' => @time_utc,
|
|
43
48
|
}.delete_if { |_key, val| val.nil? }
|
|
44
49
|
end
|
|
45
50
|
end
|
|
@@ -62,7 +62,7 @@ module Airbrake
|
|
|
62
62
|
@payload[resource] = { total: Airbrake::Stat.new }
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
@payload[resource][:total]
|
|
65
|
+
update_total(resource, @payload[resource][:total])
|
|
66
66
|
|
|
67
67
|
resource.groups.each do |name, ms|
|
|
68
68
|
@payload[resource][name] ||= Airbrake::Stat.new
|
|
@@ -70,6 +70,19 @@ module Airbrake
|
|
|
70
70
|
end
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
+
def update_total(resource, total)
|
|
74
|
+
if resource.timing
|
|
75
|
+
total.increment_ms(resource.timing)
|
|
76
|
+
else
|
|
77
|
+
loc = caller_locations(6..6).first
|
|
78
|
+
Kernel.warn(
|
|
79
|
+
"#{loc.path}:#{loc.lineno}: warning: :start_time and :end_time are " \
|
|
80
|
+
"deprecated. Use :timing & :time instead",
|
|
81
|
+
)
|
|
82
|
+
total.increment(resource.start_time, resource.end_time)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
73
86
|
def schedule_flush
|
|
74
87
|
return if @payload.empty?
|
|
75
88
|
|
|
@@ -107,14 +120,13 @@ module Airbrake
|
|
|
107
120
|
end
|
|
108
121
|
|
|
109
122
|
def send_resource(resource, sync:)
|
|
110
|
-
promise =
|
|
111
|
-
return promise if promise.rejected?
|
|
112
|
-
|
|
113
|
-
promise = @config.check_performance_options(resource)
|
|
123
|
+
promise = check_configuration(resource)
|
|
114
124
|
return promise if promise.rejected?
|
|
115
125
|
|
|
116
126
|
@filter_chain.refine(resource)
|
|
117
|
-
|
|
127
|
+
if resource.ignored?
|
|
128
|
+
return Promise.new.reject("#{resource.class} was ignored by a filter")
|
|
129
|
+
end
|
|
118
130
|
|
|
119
131
|
@mutex.synchronize do
|
|
120
132
|
update_payload(resource)
|
|
@@ -126,6 +138,20 @@ module Airbrake
|
|
|
126
138
|
end
|
|
127
139
|
end
|
|
128
140
|
|
|
141
|
+
def check_configuration(resource)
|
|
142
|
+
promise = @config.check_configuration
|
|
143
|
+
return promise if promise.rejected?
|
|
144
|
+
|
|
145
|
+
promise = @config.check_performance_options(resource)
|
|
146
|
+
return promise if promise.rejected?
|
|
147
|
+
|
|
148
|
+
if resource.timing && resource.timing == 0
|
|
149
|
+
return Promise.new.reject(':timing cannot be zero')
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
Promise.new
|
|
153
|
+
end
|
|
154
|
+
|
|
129
155
|
def send(sender, payload, promise)
|
|
130
156
|
signature = "#{self.class.name}##{__method__}"
|
|
131
157
|
raise "#{signature}: payload (#{payload}) cannot be empty. Race?" if payload.none?
|
data/lib/airbrake-ruby/query.rb
CHANGED
|
@@ -6,7 +6,8 @@ module Airbrake
|
|
|
6
6
|
# @since v3.2.0
|
|
7
7
|
# rubocop:disable Metrics/ParameterLists, Metrics/BlockLength
|
|
8
8
|
Query = Struct.new(
|
|
9
|
-
:method, :route, :query, :func, :file, :line, :start_time, :end_time
|
|
9
|
+
:method, :route, :query, :func, :file, :line, :start_time, :end_time,
|
|
10
|
+
:timing, :time
|
|
10
11
|
) do
|
|
11
12
|
include HashKeyable
|
|
12
13
|
include Ignorable
|
|
@@ -21,11 +22,16 @@ module Airbrake
|
|
|
21
22
|
func: nil,
|
|
22
23
|
file: nil,
|
|
23
24
|
line: nil,
|
|
24
|
-
start_time
|
|
25
|
-
end_time: start_time + 1
|
|
25
|
+
start_time: Time.now,
|
|
26
|
+
end_time: start_time + 1,
|
|
27
|
+
timing: nil,
|
|
28
|
+
time: Time.now
|
|
26
29
|
)
|
|
27
|
-
@
|
|
28
|
-
super(
|
|
30
|
+
@time_utc = TimeTruncate.utc_truncate_minutes(time)
|
|
31
|
+
super(
|
|
32
|
+
method, route, query, func, file, line, start_time, end_time, timing,
|
|
33
|
+
time
|
|
34
|
+
)
|
|
29
35
|
end
|
|
30
36
|
|
|
31
37
|
def destination
|
|
@@ -41,7 +47,7 @@ module Airbrake
|
|
|
41
47
|
'method' => method,
|
|
42
48
|
'route' => route,
|
|
43
49
|
'query' => query,
|
|
44
|
-
'time' => @
|
|
50
|
+
'time' => @time_utc,
|
|
45
51
|
'function' => func,
|
|
46
52
|
'file' => file,
|
|
47
53
|
'line' => line,
|
data/lib/airbrake-ruby/queue.rb
CHANGED
|
@@ -4,8 +4,10 @@ module Airbrake
|
|
|
4
4
|
# @see Airbrake.notify_queue
|
|
5
5
|
# @api public
|
|
6
6
|
# @since v4.9.0
|
|
7
|
-
# rubocop:disable Metrics/BlockLength
|
|
8
|
-
Queue = Struct.new(
|
|
7
|
+
# rubocop:disable Metrics/BlockLength, Metrics/ParameterLists
|
|
8
|
+
Queue = Struct.new(
|
|
9
|
+
:queue, :error_count, :groups, :start_time, :end_time, :timing, :time
|
|
10
|
+
) do
|
|
9
11
|
include HashKeyable
|
|
10
12
|
include Ignorable
|
|
11
13
|
include Stashable
|
|
@@ -15,10 +17,12 @@ module Airbrake
|
|
|
15
17
|
error_count:,
|
|
16
18
|
groups: {},
|
|
17
19
|
start_time: Time.now,
|
|
18
|
-
end_time: start_time + 1
|
|
20
|
+
end_time: start_time + 1,
|
|
21
|
+
timing: nil,
|
|
22
|
+
time: Time.now
|
|
19
23
|
)
|
|
20
|
-
@
|
|
21
|
-
super(queue, error_count, groups, start_time, end_time)
|
|
24
|
+
@time_utc = TimeTruncate.utc_truncate_minutes(time)
|
|
25
|
+
super(queue, error_count, groups, start_time, end_time, timing, time)
|
|
22
26
|
end
|
|
23
27
|
|
|
24
28
|
def destination
|
|
@@ -33,14 +37,14 @@ module Airbrake
|
|
|
33
37
|
{
|
|
34
38
|
'queue' => queue,
|
|
35
39
|
'errorCount' => error_count,
|
|
36
|
-
'time' => @
|
|
40
|
+
'time' => @time_utc,
|
|
37
41
|
}
|
|
38
42
|
end
|
|
39
43
|
|
|
40
44
|
def hash
|
|
41
45
|
{
|
|
42
46
|
'queue' => queue,
|
|
43
|
-
'time' => @
|
|
47
|
+
'time' => @time_utc,
|
|
44
48
|
}.hash
|
|
45
49
|
end
|
|
46
50
|
|
|
@@ -48,5 +52,5 @@ module Airbrake
|
|
|
48
52
|
self.error_count += other.error_count
|
|
49
53
|
end
|
|
50
54
|
end
|
|
51
|
-
# rubocop:enable Metrics/BlockLength
|
|
55
|
+
# rubocop:enable Metrics/BlockLength, Metrics/ParameterLists
|
|
52
56
|
end
|
|
@@ -4,8 +4,10 @@ module Airbrake
|
|
|
4
4
|
# @see Airbrake.notify_request
|
|
5
5
|
# @api public
|
|
6
6
|
# @since v3.2.0
|
|
7
|
-
# rubocop:disable Metrics/BlockLength
|
|
8
|
-
Request = Struct.new(
|
|
7
|
+
# rubocop:disable Metrics/BlockLength, Metrics/ParameterLists
|
|
8
|
+
Request = Struct.new(
|
|
9
|
+
:method, :route, :status_code, :start_time, :end_time, :timing, :time
|
|
10
|
+
) do
|
|
9
11
|
include HashKeyable
|
|
10
12
|
include Ignorable
|
|
11
13
|
include Stashable
|
|
@@ -16,11 +18,13 @@ module Airbrake
|
|
|
16
18
|
method:,
|
|
17
19
|
route:,
|
|
18
20
|
status_code:,
|
|
19
|
-
start_time
|
|
20
|
-
end_time: start_time + 1
|
|
21
|
+
start_time: Time.now,
|
|
22
|
+
end_time: start_time + 1,
|
|
23
|
+
timing: nil,
|
|
24
|
+
time: Time.now
|
|
21
25
|
)
|
|
22
|
-
@
|
|
23
|
-
super(method, route, status_code, start_time, end_time)
|
|
26
|
+
@time_utc = TimeTruncate.utc_truncate_minutes(time)
|
|
27
|
+
super(method, route, status_code, start_time, end_time, timing, time)
|
|
24
28
|
end
|
|
25
29
|
|
|
26
30
|
def destination
|
|
@@ -36,9 +40,9 @@ module Airbrake
|
|
|
36
40
|
'method' => method,
|
|
37
41
|
'route' => route,
|
|
38
42
|
'statusCode' => status_code,
|
|
39
|
-
'time' => @
|
|
43
|
+
'time' => @time_utc,
|
|
40
44
|
}.delete_if { |_key, val| val.nil? }
|
|
41
45
|
end
|
|
42
46
|
end
|
|
43
|
-
# rubocop:enable Metrics/BlockLength
|
|
47
|
+
# rubocop:enable Metrics/BlockLength, Metrics/ParameterLists
|
|
44
48
|
end
|
data/spec/airbrake_spec.rb
CHANGED
|
@@ -171,7 +171,7 @@ RSpec.describe Airbrake do
|
|
|
171
171
|
method: 'GET',
|
|
172
172
|
route: '/',
|
|
173
173
|
status_code: 200,
|
|
174
|
-
|
|
174
|
+
timing: 1,
|
|
175
175
|
)
|
|
176
176
|
end
|
|
177
177
|
end
|
|
@@ -187,7 +187,7 @@ RSpec.describe Airbrake do
|
|
|
187
187
|
method: 'GET',
|
|
188
188
|
route: '/',
|
|
189
189
|
status_code: 200,
|
|
190
|
-
|
|
190
|
+
timing: 1,
|
|
191
191
|
},
|
|
192
192
|
request_id: 1,
|
|
193
193
|
)
|
|
@@ -204,7 +204,7 @@ RSpec.describe Airbrake do
|
|
|
204
204
|
method: 'GET',
|
|
205
205
|
route: '/',
|
|
206
206
|
status_code: 200,
|
|
207
|
-
|
|
207
|
+
timing: 1,
|
|
208
208
|
},
|
|
209
209
|
request_id: 1,
|
|
210
210
|
)
|
|
@@ -222,7 +222,7 @@ RSpec.describe Airbrake do
|
|
|
222
222
|
method: 'GET',
|
|
223
223
|
route: '/',
|
|
224
224
|
query: '',
|
|
225
|
-
|
|
225
|
+
timing: 1,
|
|
226
226
|
)
|
|
227
227
|
end
|
|
228
228
|
end
|
|
@@ -238,7 +238,7 @@ RSpec.describe Airbrake do
|
|
|
238
238
|
method: 'GET',
|
|
239
239
|
route: '/',
|
|
240
240
|
query: '',
|
|
241
|
-
|
|
241
|
+
timing: 1,
|
|
242
242
|
},
|
|
243
243
|
request_id: 1,
|
|
244
244
|
)
|
|
@@ -255,7 +255,7 @@ RSpec.describe Airbrake do
|
|
|
255
255
|
method: 'GET',
|
|
256
256
|
route: '/',
|
|
257
257
|
query: '',
|
|
258
|
-
|
|
258
|
+
timing: 1,
|
|
259
259
|
},
|
|
260
260
|
request_id: 1,
|
|
261
261
|
)
|
|
@@ -273,7 +273,7 @@ RSpec.describe Airbrake do
|
|
|
273
273
|
method: 'GET',
|
|
274
274
|
route: '/',
|
|
275
275
|
query: '',
|
|
276
|
-
|
|
276
|
+
timing: 1,
|
|
277
277
|
)
|
|
278
278
|
end
|
|
279
279
|
end
|
|
@@ -292,7 +292,7 @@ RSpec.describe Airbrake do
|
|
|
292
292
|
route: '/',
|
|
293
293
|
response_type: :html,
|
|
294
294
|
groups: {},
|
|
295
|
-
|
|
295
|
+
timing: 1,
|
|
296
296
|
},
|
|
297
297
|
request_id: 1,
|
|
298
298
|
)
|
|
@@ -310,7 +310,7 @@ RSpec.describe Airbrake do
|
|
|
310
310
|
route: '/',
|
|
311
311
|
response_type: :html,
|
|
312
312
|
groups: {},
|
|
313
|
-
|
|
313
|
+
timing: 1,
|
|
314
314
|
},
|
|
315
315
|
request_id: 1,
|
|
316
316
|
)
|
data/spec/config_spec.rb
CHANGED
|
@@ -110,9 +110,7 @@ RSpec.describe Airbrake::Config do
|
|
|
110
110
|
|
|
111
111
|
describe "#check_performance_options" do
|
|
112
112
|
it "returns a promise" do
|
|
113
|
-
resource = Airbrake::Query.new(
|
|
114
|
-
method: '', route: '', query: '', start_time: Time.now,
|
|
115
|
-
)
|
|
113
|
+
resource = Airbrake::Query.new(method: '', route: '', query: '', timing: 1)
|
|
116
114
|
expect(subject.check_performance_options(resource))
|
|
117
115
|
.to be_an(Airbrake::Promise)
|
|
118
116
|
end
|
|
@@ -122,7 +120,7 @@ RSpec.describe Airbrake::Config do
|
|
|
122
120
|
|
|
123
121
|
let(:resource) do
|
|
124
122
|
Airbrake::Request.new(
|
|
125
|
-
method: 'GET', route: '/foo', status_code: 200,
|
|
123
|
+
method: 'GET', route: '/foo', status_code: 200, timing: 1,
|
|
126
124
|
)
|
|
127
125
|
end
|
|
128
126
|
|
|
@@ -138,9 +136,7 @@ RSpec.describe Airbrake::Config do
|
|
|
138
136
|
before { subject.query_stats = false }
|
|
139
137
|
|
|
140
138
|
let(:resource) do
|
|
141
|
-
Airbrake::Query.new(
|
|
142
|
-
method: 'GET', route: '/foo', query: '', start_time: Time.new,
|
|
143
|
-
)
|
|
139
|
+
Airbrake::Query.new(method: 'GET', route: '/foo', query: '', timing: 1)
|
|
144
140
|
end
|
|
145
141
|
|
|
146
142
|
it "returns a rejected promise" do
|
|
@@ -13,9 +13,7 @@ RSpec.describe Airbrake::Filters::SqlFilter do
|
|
|
13
13
|
shared_examples "query blacklisting" do |query, opts|
|
|
14
14
|
it "ignores '#{query}'" do
|
|
15
15
|
filter = described_class.new('postgres')
|
|
16
|
-
q = Airbrake::Query.new(
|
|
17
|
-
query: query, method: 'GET', route: '/', start_time: Time.now,
|
|
18
|
-
)
|
|
16
|
+
q = Airbrake::Query.new(query: query, method: 'GET', route: '/', timing: 1)
|
|
19
17
|
filter.call(q)
|
|
20
18
|
|
|
21
19
|
expect(q.ignored?).to eq(opts[:should_ignore])
|
|
@@ -328,9 +328,9 @@ RSpec.describe Airbrake::NoticeNotifier do
|
|
|
328
328
|
end
|
|
329
329
|
|
|
330
330
|
it "raises error" do
|
|
331
|
-
expect { subject.build_notice(Exception.new) }.to raise_error(
|
|
331
|
+
expect { subject.build_notice(Exception.new('oops')) }.to raise_error(
|
|
332
332
|
Airbrake::Error,
|
|
333
|
-
|
|
333
|
+
"Airbrake is closed; can't build exception: Exception: oops",
|
|
334
334
|
)
|
|
335
335
|
end
|
|
336
336
|
end
|
|
@@ -29,8 +29,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
29
29
|
func: 'foo',
|
|
30
30
|
file: 'foo.rb',
|
|
31
31
|
line: 123,
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
timing: 60000,
|
|
33
|
+
time: Time.new(2018, 1, 1, 0, 49, 0, 0),
|
|
34
34
|
),
|
|
35
35
|
)
|
|
36
36
|
subject.close
|
|
@@ -59,8 +59,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
59
59
|
method: 'POST',
|
|
60
60
|
route: '/foo',
|
|
61
61
|
status_code: 200,
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
timing: 60000,
|
|
63
|
+
time: Time.new(2018, 1, 1, 0, 49, 0, 0),
|
|
64
64
|
),
|
|
65
65
|
)
|
|
66
66
|
subject.close
|
|
@@ -86,8 +86,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
86
86
|
method: 'DELETE',
|
|
87
87
|
route: '/routes-breakdowns',
|
|
88
88
|
response_type: 'json',
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
timing: 60000,
|
|
90
|
+
time: Time.new(2018, 1, 1, 0, 49, 0, 0),
|
|
91
91
|
groups: { db: 131, view: 421 },
|
|
92
92
|
),
|
|
93
93
|
)
|
|
@@ -128,8 +128,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
128
128
|
queue: 'emails',
|
|
129
129
|
error_count: 2,
|
|
130
130
|
groups: { redis: 131, sql: 421 },
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
timing: 60000,
|
|
132
|
+
time: Time.new(2018, 1, 1, 0, 49, 0, 0),
|
|
133
133
|
),
|
|
134
134
|
)
|
|
135
135
|
subject.close
|
|
@@ -168,7 +168,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
168
168
|
method: 'GET',
|
|
169
169
|
route: '/foo',
|
|
170
170
|
status_code: 200,
|
|
171
|
-
|
|
171
|
+
timing: 60000,
|
|
172
|
+
time: Time.new(2018, 1, 1, 0, 0, 20, 0),
|
|
172
173
|
),
|
|
173
174
|
)
|
|
174
175
|
subject.close
|
|
@@ -184,7 +185,7 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
184
185
|
method: 'GET',
|
|
185
186
|
route: '/foo',
|
|
186
187
|
status_code: 200,
|
|
187
|
-
|
|
188
|
+
timing: 213,
|
|
188
189
|
),
|
|
189
190
|
)
|
|
190
191
|
subject.notify(
|
|
@@ -192,7 +193,7 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
192
193
|
method: 'GET',
|
|
193
194
|
route: '/foo',
|
|
194
195
|
status_code: 200,
|
|
195
|
-
|
|
196
|
+
timing: 123,
|
|
196
197
|
),
|
|
197
198
|
)
|
|
198
199
|
subject.close
|
|
@@ -208,8 +209,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
208
209
|
method: 'GET',
|
|
209
210
|
route: '/foo',
|
|
210
211
|
status_code: 200,
|
|
211
|
-
|
|
212
|
-
|
|
212
|
+
timing: 1000,
|
|
213
|
+
time: Time.new(2018, 1, 1, 0, 0, 49, 0),
|
|
213
214
|
),
|
|
214
215
|
)
|
|
215
216
|
subject.notify(
|
|
@@ -217,8 +218,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
217
218
|
method: 'GET',
|
|
218
219
|
route: '/foo',
|
|
219
220
|
status_code: 200,
|
|
220
|
-
|
|
221
|
-
|
|
221
|
+
timing: 6000,
|
|
222
|
+
time: Time.new(2018, 1, 1, 0, 1, 49, 0),
|
|
222
223
|
),
|
|
223
224
|
)
|
|
224
225
|
subject.close
|
|
@@ -244,8 +245,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
244
245
|
method: 'GET',
|
|
245
246
|
route: '/foo',
|
|
246
247
|
status_code: 200,
|
|
247
|
-
|
|
248
|
-
|
|
248
|
+
timing: 60000,
|
|
249
|
+
time: Time.new(2018, 1, 1, 0, 49, 0, 0),
|
|
249
250
|
),
|
|
250
251
|
)
|
|
251
252
|
subject.notify(
|
|
@@ -253,8 +254,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
253
254
|
method: 'POST',
|
|
254
255
|
route: '/foo',
|
|
255
256
|
status_code: 200,
|
|
256
|
-
|
|
257
|
-
|
|
257
|
+
timing: 60000,
|
|
258
|
+
time: Time.new(2018, 1, 1, 0, 49, 0, 0),
|
|
258
259
|
),
|
|
259
260
|
)
|
|
260
261
|
subject.close
|
|
@@ -280,8 +281,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
280
281
|
method: 'DELETE',
|
|
281
282
|
route: '/routes-breakdowns',
|
|
282
283
|
response_type: 'json',
|
|
283
|
-
|
|
284
|
-
|
|
284
|
+
timing: 2000,
|
|
285
|
+
time: Time.new(2018, 1, 1, 0, 0, 20, 0),
|
|
285
286
|
groups: { db: 131, view: 421 },
|
|
286
287
|
),
|
|
287
288
|
)
|
|
@@ -290,8 +291,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
290
291
|
method: 'DELETE',
|
|
291
292
|
route: '/routes-breakdowns',
|
|
292
293
|
response_type: 'json',
|
|
293
|
-
|
|
294
|
-
|
|
294
|
+
timing: 2000,
|
|
295
|
+
time: Time.new(2018, 1, 1, 0, 0, 30, 0),
|
|
295
296
|
groups: { db: 55, view: 11 },
|
|
296
297
|
),
|
|
297
298
|
)
|
|
@@ -332,8 +333,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
332
333
|
queue: 'emails',
|
|
333
334
|
error_count: 2,
|
|
334
335
|
groups: { redis: 131, sql: 421 },
|
|
335
|
-
|
|
336
|
-
|
|
336
|
+
timing: 60000,
|
|
337
|
+
time: Time.new(2018, 1, 1, 0, 49, 0, 0),
|
|
337
338
|
),
|
|
338
339
|
)
|
|
339
340
|
subject.notify(
|
|
@@ -341,8 +342,8 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
341
342
|
queue: 'emails',
|
|
342
343
|
error_count: 3,
|
|
343
344
|
groups: { redis: 131, sql: 421 },
|
|
344
|
-
|
|
345
|
-
|
|
345
|
+
timing: 60000,
|
|
346
|
+
time: Time.new(2018, 1, 1, 0, 49, 0, 0),
|
|
346
347
|
),
|
|
347
348
|
)
|
|
348
349
|
subject.close
|
|
@@ -381,7 +382,7 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
381
382
|
method: 'GET',
|
|
382
383
|
route: '/foo',
|
|
383
384
|
status_code: 200,
|
|
384
|
-
|
|
385
|
+
timing: 123,
|
|
385
386
|
),
|
|
386
387
|
)
|
|
387
388
|
subject.close
|
|
@@ -392,7 +393,7 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
392
393
|
|
|
393
394
|
it "checks performance stat configuration" do
|
|
394
395
|
request = Airbrake::Request.new(
|
|
395
|
-
method: 'GET', route: '/foo', status_code: 200,
|
|
396
|
+
method: 'GET', route: '/foo', status_code: 200, timing: 123,
|
|
396
397
|
)
|
|
397
398
|
expect(Airbrake::Config.instance).to receive(:check_performance_options)
|
|
398
399
|
.with(request).and_return(Airbrake::Promise.new)
|
|
@@ -408,7 +409,7 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
408
409
|
method: 'POST',
|
|
409
410
|
route: '/foo',
|
|
410
411
|
status_code: 200,
|
|
411
|
-
|
|
412
|
+
timing: 123,
|
|
412
413
|
),
|
|
413
414
|
)
|
|
414
415
|
subject.close
|
|
@@ -445,7 +446,7 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
445
446
|
method: 'GET',
|
|
446
447
|
route: '/foo',
|
|
447
448
|
status_code: 200,
|
|
448
|
-
|
|
449
|
+
timing: 123,
|
|
449
450
|
),
|
|
450
451
|
)
|
|
451
452
|
|
|
@@ -454,7 +455,7 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
454
455
|
method: 'POST',
|
|
455
456
|
route: '/foo',
|
|
456
457
|
query: 'SELECT * FROM things',
|
|
457
|
-
|
|
458
|
+
timing: 123,
|
|
458
459
|
),
|
|
459
460
|
)
|
|
460
461
|
|
|
@@ -474,7 +475,7 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
474
475
|
method: 'GET',
|
|
475
476
|
route: '/foo',
|
|
476
477
|
status_code: 200,
|
|
477
|
-
|
|
478
|
+
timing: 1,
|
|
478
479
|
),
|
|
479
480
|
)
|
|
480
481
|
subject.close
|
|
@@ -488,13 +489,29 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
488
489
|
method: 'POST',
|
|
489
490
|
route: '/foo',
|
|
490
491
|
query: 'SELECT * FROM things',
|
|
491
|
-
|
|
492
|
+
timing: 1,
|
|
492
493
|
),
|
|
493
494
|
)
|
|
494
495
|
subject.close
|
|
495
496
|
|
|
496
497
|
expect(a_request(:put, queries)).not_to have_been_made
|
|
497
498
|
end
|
|
499
|
+
|
|
500
|
+
it "returns a rejected promise" do
|
|
501
|
+
promise = subject.notify(
|
|
502
|
+
Airbrake::Query.new(
|
|
503
|
+
method: 'POST',
|
|
504
|
+
route: '/foo',
|
|
505
|
+
query: 'SELECT * FROM things',
|
|
506
|
+
timing: 1,
|
|
507
|
+
),
|
|
508
|
+
)
|
|
509
|
+
subject.close
|
|
510
|
+
|
|
511
|
+
expect(promise.value).to eq(
|
|
512
|
+
'error' => 'Airbrake::Query was ignored by a filter',
|
|
513
|
+
)
|
|
514
|
+
end
|
|
498
515
|
end
|
|
499
516
|
|
|
500
517
|
context "when a filter that modifies payload was defined" do
|
|
@@ -510,7 +527,7 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
510
527
|
method: 'POST',
|
|
511
528
|
route: '/foo',
|
|
512
529
|
query: 'SELECT * FROM things',
|
|
513
|
-
|
|
530
|
+
timing: 123,
|
|
514
531
|
),
|
|
515
532
|
)
|
|
516
533
|
subject.close
|
|
@@ -522,6 +539,49 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
522
539
|
).to have_been_made
|
|
523
540
|
end
|
|
524
541
|
end
|
|
542
|
+
|
|
543
|
+
context "when :start_time is specified (deprecated)" do
|
|
544
|
+
before do
|
|
545
|
+
allow(Kernel).to receive(:warn)
|
|
546
|
+
end
|
|
547
|
+
|
|
548
|
+
it "uses the value of :start_time to update stat" do
|
|
549
|
+
subject.notify(
|
|
550
|
+
Airbrake::Query.new(
|
|
551
|
+
method: 'POST',
|
|
552
|
+
route: '/foo',
|
|
553
|
+
query: 'SELECT * FROM things',
|
|
554
|
+
start_time: Time.new(2018, 1, 1, 0, 49, 0, 0),
|
|
555
|
+
end_time: Time.new(2018, 1, 1, 0, 50, 0, 0),
|
|
556
|
+
),
|
|
557
|
+
)
|
|
558
|
+
subject.close
|
|
559
|
+
|
|
560
|
+
expect(
|
|
561
|
+
a_request(:put, queries).with(
|
|
562
|
+
body: /"count":1,"sum":60000.0,"sumsq":3600000000.0/,
|
|
563
|
+
),
|
|
564
|
+
).to have_been_made
|
|
565
|
+
end
|
|
566
|
+
end
|
|
567
|
+
|
|
568
|
+
context "when provided :timing is zero" do
|
|
569
|
+
it "doesn't notify" do
|
|
570
|
+
queue = Airbrake::Queue.new(queue: 'bananas', error_count: 0, timing: 0)
|
|
571
|
+
subject.notify(queue)
|
|
572
|
+
subject.close
|
|
573
|
+
|
|
574
|
+
expect(a_request(:put, queues)).not_to have_been_made
|
|
575
|
+
end
|
|
576
|
+
|
|
577
|
+
it "returns a rejected promise" do
|
|
578
|
+
queue = Airbrake::Queue.new(queue: 'bananas', error_count: 0, timing: 0)
|
|
579
|
+
promise = subject.notify(queue)
|
|
580
|
+
subject.close
|
|
581
|
+
|
|
582
|
+
expect(promise.value).to eq('error' => ':timing cannot be zero')
|
|
583
|
+
end
|
|
584
|
+
end
|
|
525
585
|
end
|
|
526
586
|
|
|
527
587
|
describe "#notify_sync" do
|
|
@@ -531,7 +591,7 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
531
591
|
method: 'POST',
|
|
532
592
|
route: '/foo',
|
|
533
593
|
query: 'SELECT * FROM things',
|
|
534
|
-
|
|
594
|
+
timing: 123,
|
|
535
595
|
),
|
|
536
596
|
)
|
|
537
597
|
|
|
@@ -560,7 +620,7 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
560
620
|
method: 'POST',
|
|
561
621
|
route: '/foo',
|
|
562
622
|
query: 'SELECT * FROM things',
|
|
563
|
-
|
|
623
|
+
timing: 123,
|
|
564
624
|
),
|
|
565
625
|
)
|
|
566
626
|
subject.close
|
|
@@ -591,7 +651,7 @@ RSpec.describe Airbrake::PerformanceNotifier do
|
|
|
591
651
|
method: 'POST',
|
|
592
652
|
route: '/foo',
|
|
593
653
|
status_code: 200,
|
|
594
|
-
|
|
654
|
+
timing: 123,
|
|
595
655
|
),
|
|
596
656
|
)
|
|
597
657
|
subject.close
|
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.
|
|
4
|
+
version: 4.11.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Airbrake Technologies, Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-12-
|
|
11
|
+
date: 2019-12-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rbtree3
|