airbrake-ruby 4.8.0 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/airbrake-ruby.rb +132 -57
- data/lib/airbrake-ruby/async_sender.rb +7 -30
- data/lib/airbrake-ruby/backtrace.rb +8 -7
- data/lib/airbrake-ruby/benchmark.rb +1 -1
- data/lib/airbrake-ruby/code_hunk.rb +1 -1
- data/lib/airbrake-ruby/config.rb +59 -15
- data/lib/airbrake-ruby/config/processor.rb +71 -0
- data/lib/airbrake-ruby/config/validator.rb +9 -3
- data/lib/airbrake-ruby/deploy_notifier.rb +1 -1
- data/lib/airbrake-ruby/file_cache.rb +1 -1
- data/lib/airbrake-ruby/filter_chain.rb +16 -1
- data/lib/airbrake-ruby/filters/dependency_filter.rb +1 -0
- data/lib/airbrake-ruby/filters/exception_attributes_filter.rb +2 -2
- data/lib/airbrake-ruby/filters/gem_root_filter.rb +1 -0
- data/lib/airbrake-ruby/filters/git_last_checkout_filter.rb +5 -5
- 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_whitelist.rb → keys_allowlist.rb} +3 -3
- data/lib/airbrake-ruby/filters/{keys_blacklist.rb → keys_blocklist.rb} +3 -3
- data/lib/airbrake-ruby/filters/keys_filter.rb +39 -20
- data/lib/airbrake-ruby/filters/root_directory_filter.rb +1 -0
- data/lib/airbrake-ruby/filters/sql_filter.rb +7 -7
- data/lib/airbrake-ruby/filters/system_exit_filter.rb +1 -0
- data/lib/airbrake-ruby/filters/thread_filter.rb +5 -4
- data/lib/airbrake-ruby/grouppable.rb +12 -0
- data/lib/airbrake-ruby/ignorable.rb +1 -0
- data/lib/airbrake-ruby/inspectable.rb +2 -2
- data/lib/airbrake-ruby/loggable.rb +1 -1
- data/lib/airbrake-ruby/mergeable.rb +12 -0
- data/lib/airbrake-ruby/monotonic_time.rb +5 -0
- data/lib/airbrake-ruby/notice.rb +7 -14
- data/lib/airbrake-ruby/notice_notifier.rb +11 -3
- data/lib/airbrake-ruby/performance_breakdown.rb +16 -10
- data/lib/airbrake-ruby/performance_notifier.rb +80 -58
- data/lib/airbrake-ruby/promise.rb +1 -0
- data/lib/airbrake-ruby/query.rb +20 -15
- data/lib/airbrake-ruby/queue.rb +65 -0
- data/lib/airbrake-ruby/remote_settings.rb +105 -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 +14 -12
- data/lib/airbrake-ruby/stat.rb +26 -33
- data/lib/airbrake-ruby/sync_sender.rb +3 -2
- data/lib/airbrake-ruby/tdigest.rb +43 -58
- data/lib/airbrake-ruby/thread_pool.rb +11 -1
- data/lib/airbrake-ruby/truncator.rb +10 -4
- data/lib/airbrake-ruby/version.rb +11 -1
- data/spec/airbrake_spec.rb +206 -71
- data/spec/async_sender_spec.rb +3 -12
- data/spec/backtrace_spec.rb +44 -44
- data/spec/code_hunk_spec.rb +11 -11
- data/spec/config/processor_spec.rb +143 -0
- data/spec/config/validator_spec.rb +23 -6
- data/spec/config_spec.rb +40 -14
- data/spec/deploy_notifier_spec.rb +2 -2
- data/spec/filter_chain_spec.rb +28 -1
- data/spec/filters/dependency_filter_spec.rb +1 -1
- data/spec/filters/gem_root_filter_spec.rb +9 -9
- data/spec/filters/git_last_checkout_filter_spec.rb +21 -4
- data/spec/filters/git_repository_filter.rb +1 -1
- data/spec/filters/git_revision_filter_spec.rb +10 -10
- data/spec/filters/{keys_whitelist_spec.rb → keys_allowlist_spec.rb} +29 -28
- data/spec/filters/{keys_blacklist_spec.rb → keys_blocklist_spec.rb} +39 -29
- data/spec/filters/root_directory_filter_spec.rb +9 -9
- data/spec/filters/sql_filter_spec.rb +58 -60
- data/spec/filters/system_exit_filter_spec.rb +1 -1
- data/spec/filters/thread_filter_spec.rb +32 -30
- data/spec/fixtures/project_root/code.rb +9 -9
- data/spec/loggable_spec.rb +17 -0
- data/spec/monotonic_time_spec.rb +11 -0
- data/spec/notice_notifier/options_spec.rb +17 -17
- data/spec/notice_notifier_spec.rb +20 -20
- data/spec/notice_spec.rb +6 -6
- data/spec/performance_breakdown_spec.rb +0 -1
- data/spec/performance_notifier_spec.rb +220 -73
- data/spec/query_spec.rb +1 -1
- data/spec/queue_spec.rb +18 -0
- data/spec/remote_settings/callback_spec.rb +143 -0
- data/spec/remote_settings/settings_data_spec.rb +348 -0
- data/spec/remote_settings_spec.rb +187 -0
- data/spec/request_spec.rb +1 -3
- data/spec/response_spec.rb +8 -8
- data/spec/spec_helper.rb +6 -6
- data/spec/stat_spec.rb +2 -12
- data/spec/sync_sender_spec.rb +14 -12
- data/spec/tdigest_spec.rb +7 -7
- data/spec/thread_pool_spec.rb +39 -10
- data/spec/timed_trace_spec.rb +1 -1
- data/spec/truncator_spec.rb +12 -12
- metadata +32 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8102082d97168a2204b3e730fc2085d30d06d4ab501e6207d91ce9d67bd91584
|
4
|
+
data.tar.gz: cf2234bd6fc61e439796b0f664163a12fdd4c39c4256a1c469f06dd1f8132de3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5b353597aa2bf9d59fa454f8a6a87fadcdc71685a7e21ef3ec9f74e57b20268e5d6cad2d6d0fe061bdcdbe02e65cf2e5761d4e92c6370ea1d1316972da9d9af
|
7
|
+
data.tar.gz: d13b77d0f959ff3a5326f054b8df67c9402b216038afd25672df8b6803623ac135bb5366739687fc5c234ae2e127d075828f747bb945d9ba4d48f3f354775f17
|
data/lib/airbrake-ruby.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'net/https'
|
2
2
|
require 'logger'
|
3
3
|
require 'json'
|
4
|
-
require 'thread'
|
5
4
|
require 'set'
|
6
5
|
require 'socket'
|
7
6
|
require 'time'
|
@@ -9,8 +8,14 @@ require 'time'
|
|
9
8
|
require 'airbrake-ruby/version'
|
10
9
|
require 'airbrake-ruby/loggable'
|
11
10
|
require 'airbrake-ruby/stashable'
|
11
|
+
require 'airbrake-ruby/mergeable'
|
12
|
+
require 'airbrake-ruby/grouppable'
|
12
13
|
require 'airbrake-ruby/config'
|
13
14
|
require 'airbrake-ruby/config/validator'
|
15
|
+
require 'airbrake-ruby/config/processor'
|
16
|
+
require 'airbrake-ruby/remote_settings/callback'
|
17
|
+
require 'airbrake-ruby/remote_settings/settings_data'
|
18
|
+
require 'airbrake-ruby/remote_settings'
|
14
19
|
require 'airbrake-ruby/promise'
|
15
20
|
require 'airbrake-ruby/thread_pool'
|
16
21
|
require 'airbrake-ruby/sync_sender'
|
@@ -23,8 +28,8 @@ require 'airbrake-ruby/notice'
|
|
23
28
|
require 'airbrake-ruby/backtrace'
|
24
29
|
require 'airbrake-ruby/truncator'
|
25
30
|
require 'airbrake-ruby/filters/keys_filter'
|
26
|
-
require 'airbrake-ruby/filters/
|
27
|
-
require 'airbrake-ruby/filters/
|
31
|
+
require 'airbrake-ruby/filters/keys_allowlist'
|
32
|
+
require 'airbrake-ruby/filters/keys_blocklist'
|
28
33
|
require 'airbrake-ruby/filters/gem_root_filter'
|
29
34
|
require 'airbrake-ruby/filters/system_exit_filter'
|
30
35
|
require 'airbrake-ruby/filters/root_directory_filter'
|
@@ -52,6 +57,7 @@ require 'airbrake-ruby/performance_breakdown'
|
|
52
57
|
require 'airbrake-ruby/benchmark'
|
53
58
|
require 'airbrake-ruby/monotonic_time'
|
54
59
|
require 'airbrake-ruby/timed_trace'
|
60
|
+
require 'airbrake-ruby/queue'
|
55
61
|
|
56
62
|
# Airbrake is a thin wrapper around instances of the notifier classes (such as
|
57
63
|
# notice, performance & deploy notifiers). It creates a way to access them via a
|
@@ -69,6 +75,7 @@ require 'airbrake-ruby/timed_trace'
|
|
69
75
|
#
|
70
76
|
# @since v1.0.0
|
71
77
|
# @api public
|
78
|
+
# rubocop:disable Metrics/ModuleLength
|
72
79
|
module Airbrake
|
73
80
|
# The general error that this library uses when it wants to raise.
|
74
81
|
Error = Class.new(StandardError)
|
@@ -80,6 +87,13 @@ module Airbrake
|
|
80
87
|
# special cases where we need to work around older implementations
|
81
88
|
JRUBY = (RUBY_ENGINE == 'jruby')
|
82
89
|
|
90
|
+
# @return [Boolean] true if this Ruby supports safe levels and tainting,
|
91
|
+
# to guard against using deprecated or unsupported features.
|
92
|
+
HAS_SAFE_LEVEL = (
|
93
|
+
RUBY_ENGINE == 'ruby' &&
|
94
|
+
Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.7')
|
95
|
+
)
|
96
|
+
|
83
97
|
class << self
|
84
98
|
# @since v4.2.3
|
85
99
|
# @api private
|
@@ -107,7 +121,15 @@ module Airbrake
|
|
107
121
|
def configure
|
108
122
|
yield config = Airbrake::Config.instance
|
109
123
|
Airbrake::Loggable.instance = config.logger
|
110
|
-
|
124
|
+
|
125
|
+
config_processor = Airbrake::Config::Processor.new(config)
|
126
|
+
|
127
|
+
config_processor.process_blocklist(notice_notifier)
|
128
|
+
config_processor.process_allowlist(notice_notifier)
|
129
|
+
|
130
|
+
@remote_settings ||= config_processor.process_remote_configuration
|
131
|
+
|
132
|
+
config_processor.add_filters(notice_notifier)
|
111
133
|
end
|
112
134
|
|
113
135
|
# @since v4.2.3
|
@@ -131,7 +153,7 @@ module Airbrake
|
|
131
153
|
# @return [Boolean] true if the notifier was configured, false otherwise
|
132
154
|
# @since v2.3.0
|
133
155
|
def configured?
|
134
|
-
notice_notifier.configured?
|
156
|
+
@notice_notifier && @notice_notifier.configured?
|
135
157
|
end
|
136
158
|
|
137
159
|
# Sends an exception to Airbrake asynchronously.
|
@@ -250,11 +272,24 @@ module Airbrake
|
|
250
272
|
# Airbrake.close
|
251
273
|
# Airbrake.notify('App crashed!') #=> raises Airbrake::Error
|
252
274
|
#
|
253
|
-
# @return [
|
275
|
+
# @return [nil]
|
276
|
+
# rubocop:disable Style/IfUnlessModifier, Metrics/CyclomaticComplexity
|
254
277
|
def close
|
255
|
-
notice_notifier
|
256
|
-
|
278
|
+
if defined?(@notice_notifier) && @notice_notifier
|
279
|
+
@notice_notifier.close
|
280
|
+
end
|
281
|
+
|
282
|
+
if defined?(@performance_notifier) && @performance_notifier
|
283
|
+
@performance_notifier.close
|
284
|
+
end
|
285
|
+
|
286
|
+
if defined?(@remote_settings) && @remote_settings
|
287
|
+
@remote_settings.stop_polling
|
288
|
+
end
|
289
|
+
|
290
|
+
nil
|
257
291
|
end
|
292
|
+
# rubocop:enable Style/IfUnlessModifier, Metrics/CyclomaticComplexity
|
258
293
|
|
259
294
|
# Pings the Airbrake Deploy API endpoint about the occurred deploy.
|
260
295
|
#
|
@@ -317,9 +352,8 @@ module Airbrake
|
|
317
352
|
notice_notifier.merge_context(context)
|
318
353
|
end
|
319
354
|
|
320
|
-
# Increments request statistics of a certain +route+
|
321
|
-
#
|
322
|
-
# +status_code+.
|
355
|
+
# Increments request statistics of a certain +route+ invoked with +method+,
|
356
|
+
# which returned +status_code+.
|
323
357
|
#
|
324
358
|
# After a certain amount of time (n seconds) the aggregated route
|
325
359
|
# information will be sent to Airbrake.
|
@@ -332,8 +366,7 @@ module Airbrake
|
|
332
366
|
# func: 'do_stuff',
|
333
367
|
# file: 'app/models/foo.rb',
|
334
368
|
# line: 452,
|
335
|
-
#
|
336
|
-
# end_time: Time.now
|
369
|
+
# timing: 123.45 # ms
|
337
370
|
# )
|
338
371
|
#
|
339
372
|
# @param [Hash{Symbol=>Object}] request_info
|
@@ -347,22 +380,31 @@ module Airbrake
|
|
347
380
|
# called the query (optional)
|
348
381
|
# @option request_info [Integer] :line The line that executes the query
|
349
382
|
# (optional)
|
350
|
-
# @option request_info [
|
351
|
-
#
|
383
|
+
# @option request_info [Float] :timing How much time it took to process the
|
384
|
+
# request (in ms)
|
352
385
|
# @param [Hash] stash What needs to be appeneded to the stash, so it's
|
353
386
|
# available in filters
|
354
387
|
# @return [void]
|
355
388
|
# @since v3.0.0
|
356
389
|
# @see Airbrake::PerformanceNotifier#notify
|
357
390
|
def notify_request(request_info, stash = {})
|
358
|
-
request = Request.new(request_info)
|
391
|
+
request = Request.new(**request_info)
|
359
392
|
request.stash.merge!(stash)
|
360
393
|
performance_notifier.notify(request)
|
361
394
|
end
|
362
395
|
|
363
|
-
#
|
364
|
-
# +
|
365
|
-
#
|
396
|
+
# Synchronously increments request statistics of a certain +route+ invoked
|
397
|
+
# with +method+, which returned +status_code+.
|
398
|
+
# @since v4.10.0
|
399
|
+
# @see .notify_request
|
400
|
+
def notify_request_sync(request_info, stash = {})
|
401
|
+
request = Request.new(**request_info)
|
402
|
+
request.stash.merge!(stash)
|
403
|
+
performance_notifier.notify_sync(request)
|
404
|
+
end
|
405
|
+
|
406
|
+
# Increments SQL statistics of a certain +query+. When +method+ and +route+
|
407
|
+
# are provided, the query is grouped by these parameters.
|
366
408
|
#
|
367
409
|
# After a certain amount of time (n seconds) the aggregated query
|
368
410
|
# information will be sent to Airbrake.
|
@@ -372,29 +414,39 @@ module Airbrake
|
|
372
414
|
# method: 'GET',
|
373
415
|
# route: '/things',
|
374
416
|
# query: 'SELECT * FROM things',
|
375
|
-
#
|
376
|
-
# end_time: Time.now
|
417
|
+
# timing: 123.45 # ms
|
377
418
|
# )
|
378
419
|
#
|
379
420
|
# @param [Hash{Symbol=>Object}] query_info
|
380
|
-
# @option
|
421
|
+
# @option query_info [String] :method The HTTP method that triggered this
|
381
422
|
# SQL query (optional)
|
382
|
-
# @option
|
423
|
+
# @option query_info [String] :route The route that triggered this SQL
|
383
424
|
# query (optional)
|
384
|
-
# @option
|
385
|
-
# @option
|
386
|
-
#
|
425
|
+
# @option query_info [String] :query The query that was executed
|
426
|
+
# @option query_info [Float] :timing How much time it took to process the
|
427
|
+
# query (in ms)
|
387
428
|
# @param [Hash] stash What needs to be appeneded to the stash, so it's
|
388
429
|
# available in filters
|
389
430
|
# @return [void]
|
390
431
|
# @since v3.2.0
|
391
432
|
# @see Airbrake::PerformanceNotifier#notify
|
392
433
|
def notify_query(query_info, stash = {})
|
393
|
-
query = Query.new(query_info)
|
434
|
+
query = Query.new(**query_info)
|
394
435
|
query.stash.merge!(stash)
|
395
436
|
performance_notifier.notify(query)
|
396
437
|
end
|
397
438
|
|
439
|
+
# Synchronously increments SQL statistics of a certain +query+. When
|
440
|
+
# +method+ and +route+ are provided, the query is grouped by these
|
441
|
+
# parameters.
|
442
|
+
# @since v4.10.0
|
443
|
+
# @see .notify_query
|
444
|
+
def notify_query_sync(query_info, stash = {})
|
445
|
+
query = Query.new(**query_info)
|
446
|
+
query.stash.merge!(stash)
|
447
|
+
performance_notifier.notify_sync(query)
|
448
|
+
end
|
449
|
+
|
398
450
|
# Increments performance breakdown statistics of a certain route.
|
399
451
|
#
|
400
452
|
# @example
|
@@ -403,8 +455,7 @@ module Airbrake
|
|
403
455
|
# route: '/thing/:id/create',
|
404
456
|
# response_type: 'json',
|
405
457
|
# groups: { db: 24.0, view: 0.4 }, # ms
|
406
|
-
#
|
407
|
-
# end_time: Time.now
|
458
|
+
# timing: 123.45 # ms
|
408
459
|
# )
|
409
460
|
#
|
410
461
|
# @param [Hash{Symbol=>Object}] breakdown_info
|
@@ -412,17 +463,65 @@ module Airbrake
|
|
412
463
|
# @option breakdown_info [String] :route
|
413
464
|
# @option breakdown_info [String] :response_type
|
414
465
|
# @option breakdown_info [Array<Hash{Symbol=>Float}>] :groups
|
415
|
-
# @option breakdown_info [
|
466
|
+
# @option breakdown_info [Float] :timing How much time it took to process
|
467
|
+
# the performance breakdown (in ms)
|
416
468
|
# @param [Hash] stash What needs to be appeneded to the stash, so it's
|
417
469
|
# available in filters
|
418
470
|
# @return [void]
|
419
471
|
# @since v4.2.0
|
420
472
|
def notify_performance_breakdown(breakdown_info, stash = {})
|
421
|
-
performance_breakdown = PerformanceBreakdown.new(breakdown_info)
|
473
|
+
performance_breakdown = PerformanceBreakdown.new(**breakdown_info)
|
422
474
|
performance_breakdown.stash.merge!(stash)
|
423
475
|
performance_notifier.notify(performance_breakdown)
|
424
476
|
end
|
425
477
|
|
478
|
+
# Increments performance breakdown statistics of a certain route
|
479
|
+
# synchronously.
|
480
|
+
# @since v4.10.0
|
481
|
+
# @see .notify_performance_breakdown
|
482
|
+
def notify_performance_breakdown_sync(breakdown_info, stash = {})
|
483
|
+
performance_breakdown = PerformanceBreakdown.new(**breakdown_info)
|
484
|
+
performance_breakdown.stash.merge!(stash)
|
485
|
+
performance_notifier.notify_sync(performance_breakdown)
|
486
|
+
end
|
487
|
+
|
488
|
+
# Increments statistics of a certain queue (worker).
|
489
|
+
#
|
490
|
+
# @example
|
491
|
+
# Airbrake.notify_queue(
|
492
|
+
# queue: 'emails',
|
493
|
+
# error_count: 1,
|
494
|
+
# groups: { redis: 24.0, sql: 0.4 } # ms
|
495
|
+
# )
|
496
|
+
#
|
497
|
+
# @param [Hash{Symbol=>Object}] queue_info
|
498
|
+
# @option queue_info [String] :queue The name of the queue/worker
|
499
|
+
# @option queue_info [Integer] :error_count How many times this worker
|
500
|
+
# failed
|
501
|
+
# @option queue_info [Array<Hash{Symbol=>Float}>] :groups Where the job
|
502
|
+
# spent its time
|
503
|
+
# @option breakdown_info [Float] :timing How much time it took to process
|
504
|
+
# the queue (in ms)
|
505
|
+
# @param [Hash] stash What needs to be appended to the stash, so it's
|
506
|
+
# available in filters
|
507
|
+
# @return [void]
|
508
|
+
# @since v4.9.0
|
509
|
+
# @see .notify_queue_sync
|
510
|
+
def notify_queue(queue_info, stash = {})
|
511
|
+
queue = Queue.new(**queue_info)
|
512
|
+
queue.stash.merge!(stash)
|
513
|
+
performance_notifier.notify(queue)
|
514
|
+
end
|
515
|
+
|
516
|
+
# Increments statistics of a certain queue (worker) synchronously.
|
517
|
+
# @since v4.10.0
|
518
|
+
# @see .notify_queue
|
519
|
+
def notify_queue_sync(queue_info, stash = {})
|
520
|
+
queue = Queue.new(**queue_info)
|
521
|
+
queue.stash.merge!(stash)
|
522
|
+
performance_notifier.notify_sync(queue)
|
523
|
+
end
|
524
|
+
|
426
525
|
# Runs a callback before {.notify_request} or {.notify_query} kicks in. This
|
427
526
|
# is useful if you want to ignore specific resources or filter the data the
|
428
527
|
# resource contains.
|
@@ -480,36 +579,12 @@ module Airbrake
|
|
480
579
|
# @return [void]
|
481
580
|
# @since v4.2.2
|
482
581
|
def reset
|
483
|
-
close
|
582
|
+
close
|
484
583
|
|
485
584
|
self.performance_notifier = PerformanceNotifier.new
|
486
585
|
self.notice_notifier = NoticeNotifier.new
|
487
586
|
self.deploy_notifier = DeployNotifier.new
|
488
587
|
end
|
489
|
-
|
490
|
-
private
|
491
|
-
|
492
|
-
def process_config_options(config)
|
493
|
-
if config.blacklist_keys.any?
|
494
|
-
blacklist = Airbrake::Filters::KeysBlacklist.new(config.blacklist_keys)
|
495
|
-
notice_notifier.add_filter(blacklist)
|
496
|
-
end
|
497
|
-
|
498
|
-
if config.whitelist_keys.any?
|
499
|
-
whitelist = Airbrake::Filters::KeysWhitelist.new(config.whitelist_keys)
|
500
|
-
notice_notifier.add_filter(whitelist)
|
501
|
-
end
|
502
|
-
|
503
|
-
return unless config.root_directory
|
504
|
-
|
505
|
-
[
|
506
|
-
Airbrake::Filters::RootDirectoryFilter,
|
507
|
-
Airbrake::Filters::GitRevisionFilter,
|
508
|
-
Airbrake::Filters::GitRepositoryFilter,
|
509
|
-
Airbrake::Filters::GitLastCheckoutFilter
|
510
|
-
].each do |filter|
|
511
|
-
notice_notifier.add_filter(filter.new(config.root_directory))
|
512
|
-
end
|
513
|
-
end
|
514
588
|
end
|
515
589
|
end
|
590
|
+
# rubocop:enable Metrics/ModuleLength
|
@@ -7,12 +7,6 @@ module Airbrake
|
|
7
7
|
class AsyncSender
|
8
8
|
include Loggable
|
9
9
|
|
10
|
-
# @return [String]
|
11
|
-
WILL_NOT_DELIVER_MSG =
|
12
|
-
"%<log_label>s AsyncSender has reached its capacity of %<capacity>s " \
|
13
|
-
"and the following notice will not be delivered " \
|
14
|
-
"Error: %<type>s - %<message>s\nBacktrace: %<backtrace>s\n".freeze
|
15
|
-
|
16
10
|
def initialize(method = :post)
|
17
11
|
@config = Airbrake::Config.instance
|
18
12
|
@method = method
|
@@ -20,12 +14,13 @@ module Airbrake
|
|
20
14
|
|
21
15
|
# Asynchronously sends a notice to Airbrake.
|
22
16
|
#
|
23
|
-
# @param [
|
24
|
-
# library
|
17
|
+
# @param [Hash] payload Whatever needs to be sent
|
25
18
|
# @return [Airbrake::Promise]
|
26
|
-
def send(
|
27
|
-
unless thread_pool << [
|
28
|
-
return
|
19
|
+
def send(payload, promise, endpoint = @config.error_endpoint)
|
20
|
+
unless thread_pool << [payload, promise, endpoint]
|
21
|
+
return promise.reject(
|
22
|
+
"AsyncSender has reached its capacity of #{@config.queue_size}",
|
23
|
+
)
|
29
24
|
end
|
30
25
|
|
31
26
|
promise
|
@@ -54,27 +49,9 @@ module Airbrake
|
|
54
49
|
ThreadPool.new(
|
55
50
|
worker_size: @config.workers,
|
56
51
|
queue_size: @config.queue_size,
|
57
|
-
block: proc { |args| sender.send(*args) }
|
52
|
+
block: proc { |args| sender.send(*args) },
|
58
53
|
)
|
59
54
|
end
|
60
55
|
end
|
61
|
-
|
62
|
-
def will_not_deliver(notice, promise)
|
63
|
-
error = notice[:errors].first
|
64
|
-
|
65
|
-
logger.error(
|
66
|
-
format(
|
67
|
-
WILL_NOT_DELIVER_MSG,
|
68
|
-
log_label: LOG_LABEL,
|
69
|
-
capacity: @config.queue_size,
|
70
|
-
type: error[:type],
|
71
|
-
message: error[:message],
|
72
|
-
backtrace: error[:backtrace].map do |line|
|
73
|
-
"#{line[:file]}:#{line[:line]} in `#{line[:function]}'"
|
74
|
-
end.join("\n")
|
75
|
-
)
|
76
|
-
)
|
77
|
-
promise.reject("AsyncSender has reached its capacity of #{@config.queue_size}")
|
78
|
-
end
|
79
56
|
end
|
80
57
|
end
|
@@ -22,7 +22,7 @@ module Airbrake
|
|
22
22
|
(?<line>\d+) # Matches '43'
|
23
23
|
:in\s
|
24
24
|
`(?<function>.*)' # Matches "`block (3 levels) in <top (required)>'"
|
25
|
-
\z}x
|
25
|
+
\z}x.freeze
|
26
26
|
|
27
27
|
# @return [Regexp] the pattern that matches JRuby Java stack frames, such
|
28
28
|
# as org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105)
|
@@ -39,7 +39,7 @@ module Airbrake
|
|
39
39
|
:?
|
40
40
|
(?<line>\d+)? # Matches '105'
|
41
41
|
\)
|
42
|
-
\z}x
|
42
|
+
\z}x.freeze
|
43
43
|
|
44
44
|
# @return [Regexp] the pattern that tries to assume what a generic stack
|
45
45
|
# frame might look like, when exception's backtrace is set manually.
|
@@ -53,7 +53,7 @@ module Airbrake
|
|
53
53
|
|
|
54
54
|
:in\s(?<function>.+) # Matches ":in func"
|
55
55
|
)? # ... or nothing
|
56
|
-
\z}x
|
56
|
+
\z}x.freeze
|
57
57
|
|
58
58
|
# @return [Regexp] the pattern that matches exceptions from PL/SQL such as
|
59
59
|
# ORA-06512: at "STORE.LI_LICENSES_PACK", line 1945
|
@@ -67,7 +67,7 @@ module Airbrake
|
|
67
67
|
|
|
68
68
|
#{GENERIC}
|
69
69
|
)
|
70
|
-
\z/x
|
70
|
+
\z/x.freeze
|
71
71
|
|
72
72
|
# @return [Regexp] the pattern that matches CoffeeScript backtraces
|
73
73
|
# usually coming from Rails & ExecJS
|
@@ -82,7 +82,7 @@ module Airbrake
|
|
82
82
|
# Matches the Ruby part of the backtrace
|
83
83
|
#{RUBY}
|
84
84
|
)
|
85
|
-
\z/x
|
85
|
+
\z/x.freeze
|
86
86
|
end
|
87
87
|
|
88
88
|
# @return [Integer] how many first frames should include code hunks
|
@@ -95,6 +95,7 @@ module Airbrake
|
|
95
95
|
# @return [Array<Hash{Symbol=>String,Integer}>] the parsed backtrace
|
96
96
|
def self.parse(exception)
|
97
97
|
return [] if exception.backtrace.nil? || exception.backtrace.none?
|
98
|
+
|
98
99
|
parse_backtrace(exception)
|
99
100
|
end
|
100
101
|
|
@@ -147,13 +148,13 @@ module Airbrake
|
|
147
148
|
return {
|
148
149
|
file: match[:file],
|
149
150
|
line: (Integer(match[:line]) if match[:line]),
|
150
|
-
function: match[:function]
|
151
|
+
function: match[:function],
|
151
152
|
}
|
152
153
|
end
|
153
154
|
|
154
155
|
logger.error(
|
155
156
|
"can't parse '#{stackframe}' (please file an issue so we can fix " \
|
156
|
-
"it: https://github.com/airbrake/airbrake-ruby/issues/new)"
|
157
|
+
"it: https://github.com/airbrake/airbrake-ruby/issues/new)",
|
157
158
|
)
|
158
159
|
{ file: nil, line: nil, function: stackframe }
|
159
160
|
end
|