sentry-ruby 5.22.3 → 5.23.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/Gemfile +4 -3
- data/lib/sentry/backtrace.rb +1 -1
- data/lib/sentry/breadcrumb.rb +1 -1
- data/lib/sentry/client.rb +1 -1
- data/lib/sentry/configuration.rb +64 -8
- data/lib/sentry/hub.rb +31 -1
- data/lib/sentry/linecache.rb +3 -3
- data/lib/sentry/test_helper.rb +13 -0
- data/lib/sentry/transaction.rb +8 -2
- data/lib/sentry/transaction_event.rb +4 -1
- data/lib/sentry/transport/http_transport.rb +0 -1
- data/lib/sentry/utils/http_tracing.rb +15 -1
- data/lib/sentry/vernier/profiler.rb +3 -2
- data/lib/sentry/version.rb +1 -1
- data/lib/sentry-ruby.rb +14 -0
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '09ca0c97390e688d58572ffe3ae022523a1003a48ccea319857b302b3e1ebb95'
|
4
|
+
data.tar.gz: 28f154fb38f21c50090dc8ae3c2bc7b335f288a298e97d934a24db1b8e7ac372
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f170fe27327a1753f4a6f2d62b5a694f30c91f1f86c4e2caa837d70467298ea2af261475a2da1045e3513257f3a9be4bb66a0c2e0dba271e43a1478ecd42c0b
|
7
|
+
data.tar.gz: 32a7f13e8eee4f7c8958dfd1a083aecf7ee306fec695703c5dbeff810e4ae5ebd84a1435e7edaef8a61d94eaf64910442422d2142007d77c5be31080ad32f244
|
data/Gemfile
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
git_source(:github) { |name| "https://github.com/#{name}.git" }
|
5
5
|
|
6
|
+
eval_gemfile "../Gemfile"
|
7
|
+
|
6
8
|
gem "sentry-ruby", path: "./"
|
7
9
|
|
8
10
|
rack_version = ENV["RACK_VERSION"]
|
@@ -27,9 +29,8 @@ gem "benchmark_driver"
|
|
27
29
|
gem "benchmark-ipsa"
|
28
30
|
gem "benchmark-memory"
|
29
31
|
|
30
|
-
gem "yard"
|
32
|
+
gem "yard"
|
31
33
|
gem "webrick"
|
32
34
|
gem "faraday"
|
33
35
|
gem "excon"
|
34
|
-
|
35
|
-
eval_gemfile File.expand_path("../Gemfile", __dir__)
|
36
|
+
gem "webmock"
|
data/lib/sentry/backtrace.rb
CHANGED
@@ -16,7 +16,7 @@ module Sentry
|
|
16
16
|
/x
|
17
17
|
|
18
18
|
# org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:170)
|
19
|
-
JAVA_INPUT_FORMAT = /^(
|
19
|
+
JAVA_INPUT_FORMAT = /^([\w$.]+)\.([\w$]+)\(([\w$.]+):(\d+)\)$/
|
20
20
|
|
21
21
|
# The file portion of the line (such as app/models/user.rb)
|
22
22
|
attr_reader :file
|
data/lib/sentry/breadcrumb.rb
CHANGED
@@ -47,7 +47,7 @@ module Sentry
|
|
47
47
|
# @param message [String]
|
48
48
|
# @return [void]
|
49
49
|
def message=(message)
|
50
|
-
@message =
|
50
|
+
@message = message ? message.byteslice(0..Event::MAX_MESSAGE_SIZE_IN_BYTES) : ""
|
51
51
|
end
|
52
52
|
|
53
53
|
# @param level [String]
|
data/lib/sentry/client.rb
CHANGED
data/lib/sentry/configuration.rb
CHANGED
@@ -264,6 +264,7 @@ module Sentry
|
|
264
264
|
|
265
265
|
# Easier way to use performance tracing
|
266
266
|
# If set to true, will set traces_sample_rate to 1.0
|
267
|
+
# @deprecated It will be removed in the next major release.
|
267
268
|
# @return [Boolean, nil]
|
268
269
|
attr_reader :enable_tracing
|
269
270
|
|
@@ -360,8 +361,47 @@ module Sentry
|
|
360
361
|
def add_post_initialization_callback(&block)
|
361
362
|
post_initialization_callbacks << block
|
362
363
|
end
|
364
|
+
|
365
|
+
def validations
|
366
|
+
@validations ||= {}
|
367
|
+
end
|
368
|
+
|
369
|
+
def validate(attribute, optional: false, type: nil)
|
370
|
+
validations[attribute] = {
|
371
|
+
optional: optional,
|
372
|
+
type: type,
|
373
|
+
proc: build_validation_proc(optional, type)
|
374
|
+
}
|
375
|
+
end
|
376
|
+
|
377
|
+
private
|
378
|
+
|
379
|
+
def build_validation_proc(optional, type)
|
380
|
+
case type
|
381
|
+
when :numeric
|
382
|
+
->(value) do
|
383
|
+
if optional && value.nil?
|
384
|
+
true
|
385
|
+
else
|
386
|
+
unless value.is_a?(Numeric)
|
387
|
+
message = "must be a Numeric"
|
388
|
+
message += " or nil" if optional
|
389
|
+
|
390
|
+
{ error: message, value: value }
|
391
|
+
else
|
392
|
+
true
|
393
|
+
end
|
394
|
+
end
|
395
|
+
end
|
396
|
+
else
|
397
|
+
->(value) { true }
|
398
|
+
end
|
399
|
+
end
|
363
400
|
end
|
364
401
|
|
402
|
+
validate :traces_sample_rate, optional: true, type: :numeric
|
403
|
+
validate :profiles_sample_rate, optional: true, type: :numeric
|
404
|
+
|
365
405
|
def initialize
|
366
406
|
self.app_dirs_pattern = APP_DIRS_PATTERN
|
367
407
|
self.debug = Sentry::Utils::EnvHelper.env_to_bool(ENV["SENTRY_DEBUG"])
|
@@ -417,6 +457,24 @@ module Sentry
|
|
417
457
|
run_post_initialization_callbacks
|
418
458
|
end
|
419
459
|
|
460
|
+
def validate
|
461
|
+
if profiler_class == Sentry::Profiler && profiles_sample_rate && !Sentry.dependency_installed?(:StackProf)
|
462
|
+
log_warn("Please add the 'stackprof' gem to your Gemfile to use the StackProf profiler with Sentry.")
|
463
|
+
end
|
464
|
+
|
465
|
+
if profiler_class == Sentry::Vernier::Profiler && profiles_sample_rate && !Sentry.dependency_installed?(:Vernier)
|
466
|
+
log_warn("Please add the 'vernier' gem to your Gemfile to use the Vernier profiler with Sentry.")
|
467
|
+
end
|
468
|
+
|
469
|
+
self.class.validations.each do |attribute, validation|
|
470
|
+
value = public_send(attribute)
|
471
|
+
|
472
|
+
next if (result = validation[:proc].call(value)) === true
|
473
|
+
|
474
|
+
raise ArgumentError, result[:error]
|
475
|
+
end
|
476
|
+
end
|
477
|
+
|
420
478
|
def dsn=(value)
|
421
479
|
@dsn = init_dsn(value)
|
422
480
|
end
|
@@ -485,22 +543,21 @@ module Sentry
|
|
485
543
|
end
|
486
544
|
|
487
545
|
def enable_tracing=(enable_tracing)
|
546
|
+
unless enable_tracing.nil?
|
547
|
+
log_warn <<~MSG
|
548
|
+
`enable_tracing` is now deprecated in favor of `traces_sample_rate = 1.0`.
|
549
|
+
MSG
|
550
|
+
end
|
551
|
+
|
488
552
|
@enable_tracing = enable_tracing
|
489
553
|
@traces_sample_rate ||= 1.0 if enable_tracing
|
490
554
|
end
|
491
555
|
|
492
|
-
def is_numeric_or_nil?(value)
|
493
|
-
value.is_a?(Numeric) || value.nil?
|
494
|
-
end
|
495
|
-
|
496
556
|
def traces_sample_rate=(traces_sample_rate)
|
497
|
-
raise ArgumentError, "traces_sample_rate must be a Numeric or nil" unless is_numeric_or_nil?(traces_sample_rate)
|
498
557
|
@traces_sample_rate = traces_sample_rate
|
499
558
|
end
|
500
559
|
|
501
560
|
def profiles_sample_rate=(profiles_sample_rate)
|
502
|
-
raise ArgumentError, "profiles_sample_rate must be a Numeric or nil" unless is_numeric_or_nil?(profiles_sample_rate)
|
503
|
-
log_warn("Please make sure to include the 'stackprof' gem in your Gemfile to use Profiling with Sentry.") unless defined?(StackProf)
|
504
561
|
@profiles_sample_rate = profiles_sample_rate
|
505
562
|
end
|
506
563
|
|
@@ -509,7 +566,6 @@ module Sentry
|
|
509
566
|
begin
|
510
567
|
require "vernier"
|
511
568
|
rescue LoadError
|
512
|
-
raise ArgumentError, "Please add the 'vernier' gem to your Gemfile to use the Vernier profiler with Sentry."
|
513
569
|
end
|
514
570
|
end
|
515
571
|
|
data/lib/sentry/hub.rb
CHANGED
@@ -8,12 +8,42 @@ module Sentry
|
|
8
8
|
class Hub
|
9
9
|
include ArgumentCheckingHelper
|
10
10
|
|
11
|
+
MUTEX = Mutex.new
|
12
|
+
|
11
13
|
attr_reader :last_event_id
|
12
14
|
|
15
|
+
attr_reader :current_profiler
|
16
|
+
|
13
17
|
def initialize(client, scope)
|
14
18
|
first_layer = Layer.new(client, scope)
|
15
19
|
@stack = [first_layer]
|
16
20
|
@last_event_id = nil
|
21
|
+
@current_profiler = {}
|
22
|
+
end
|
23
|
+
|
24
|
+
# This is an internal private method
|
25
|
+
# @api private
|
26
|
+
def start_profiler!(transaction)
|
27
|
+
MUTEX.synchronize do
|
28
|
+
transaction.start_profiler!
|
29
|
+
@current_profiler[transaction.__id__] = transaction.profiler
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# This is an internal private method
|
34
|
+
# @api private
|
35
|
+
def stop_profiler!(transaction)
|
36
|
+
MUTEX.synchronize do
|
37
|
+
@current_profiler.delete(transaction.__id__)&.stop
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# This is an internal private method
|
42
|
+
# @api private
|
43
|
+
def profiler_running?
|
44
|
+
MUTEX.synchronize do
|
45
|
+
!@current_profiler.empty?
|
46
|
+
end
|
17
47
|
end
|
18
48
|
|
19
49
|
def new_from_top
|
@@ -96,7 +126,7 @@ module Sentry
|
|
96
126
|
sampling_context.merge!(custom_sampling_context)
|
97
127
|
transaction.set_initial_sample_decision(sampling_context: sampling_context)
|
98
128
|
|
99
|
-
|
129
|
+
start_profiler!(transaction)
|
100
130
|
|
101
131
|
transaction
|
102
132
|
end
|
data/lib/sentry/linecache.rb
CHANGED
data/lib/sentry/test_helper.rb
CHANGED
@@ -83,5 +83,18 @@ module Sentry
|
|
83
83
|
def extract_sentry_exceptions(event)
|
84
84
|
event&.exception&.values || []
|
85
85
|
end
|
86
|
+
|
87
|
+
def reset_sentry_globals!
|
88
|
+
Sentry::MUTEX.synchronize do
|
89
|
+
# Don't check initialized? because sometimes we stub it in tests
|
90
|
+
if Sentry.instance_variable_defined?(:@main_hub)
|
91
|
+
Sentry::GLOBALS.each do |var|
|
92
|
+
Sentry.instance_variable_set(:"@#{var}", nil)
|
93
|
+
end
|
94
|
+
|
95
|
+
Thread.current.thread_variable_set(Sentry::THREAD_LOCAL, nil)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
86
99
|
end
|
87
100
|
end
|
data/lib/sentry/transaction.rb
CHANGED
@@ -85,7 +85,11 @@ module Sentry
|
|
85
85
|
@effective_sample_rate = nil
|
86
86
|
@contexts = {}
|
87
87
|
@measurements = {}
|
88
|
-
|
88
|
+
|
89
|
+
unless @hub.profiler_running?
|
90
|
+
@profiler = @configuration.profiler_class.new(@configuration)
|
91
|
+
end
|
92
|
+
|
89
93
|
init_span_recorder
|
90
94
|
end
|
91
95
|
|
@@ -257,7 +261,7 @@ module Sentry
|
|
257
261
|
@name = UNLABELD_NAME
|
258
262
|
end
|
259
263
|
|
260
|
-
@
|
264
|
+
@hub.stop_profiler!(self)
|
261
265
|
|
262
266
|
if @sampled
|
263
267
|
event = hub.current_client.event_from_transaction(self)
|
@@ -299,6 +303,8 @@ module Sentry
|
|
299
303
|
# Start the profiler.
|
300
304
|
# @return [void]
|
301
305
|
def start_profiler!
|
306
|
+
return unless profiler
|
307
|
+
|
302
308
|
profiler.set_initial_sample_decision(sampled)
|
303
309
|
profiler.start
|
304
310
|
end
|
@@ -59,8 +59,11 @@ module Sentry
|
|
59
59
|
|
60
60
|
private
|
61
61
|
|
62
|
+
EMPTY_PROFILE = {}.freeze
|
63
|
+
|
62
64
|
def populate_profile(transaction)
|
63
|
-
profile_hash = transaction.profiler
|
65
|
+
profile_hash = transaction.profiler&.to_hash || EMPTY_PROFILE
|
66
|
+
|
64
67
|
return if profile_hash.empty?
|
65
68
|
|
66
69
|
profile_hash.merge!(
|
@@ -17,7 +17,7 @@ module Sentry
|
|
17
17
|
|
18
18
|
def record_sentry_breadcrumb(request_info, response_status)
|
19
19
|
crumb = Sentry::Breadcrumb.new(
|
20
|
-
level:
|
20
|
+
level: get_level(response_status),
|
21
21
|
category: self.class::BREADCRUMB_CATEGORY,
|
22
22
|
type: "info",
|
23
23
|
data: { status: response_status, **request_info }
|
@@ -55,6 +55,20 @@ module Sentry
|
|
55
55
|
"#{URI.encode_www_form_component(prefix)}=#{URI.encode_www_form_component(value)}"
|
56
56
|
end
|
57
57
|
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def get_level(status)
|
62
|
+
return :info unless status && status.is_a?(Integer)
|
63
|
+
|
64
|
+
if status >= 500
|
65
|
+
:error
|
66
|
+
elsif status >= 400
|
67
|
+
:warning
|
68
|
+
else
|
69
|
+
:info
|
70
|
+
end
|
71
|
+
end
|
58
72
|
end
|
59
73
|
end
|
60
74
|
end
|
@@ -74,6 +74,7 @@ module Sentry
|
|
74
74
|
return unless @started
|
75
75
|
|
76
76
|
@result = ::Vernier.stop_profile
|
77
|
+
@started = false
|
77
78
|
|
78
79
|
log("Stopped")
|
79
80
|
rescue RuntimeError => e
|
@@ -89,13 +90,13 @@ module Sentry
|
|
89
90
|
end
|
90
91
|
|
91
92
|
def to_hash
|
92
|
-
return EMPTY_RESULT unless @started
|
93
|
-
|
94
93
|
unless @sampled
|
95
94
|
record_lost_event(:sample_rate)
|
96
95
|
return EMPTY_RESULT
|
97
96
|
end
|
98
97
|
|
98
|
+
return EMPTY_RESULT unless result
|
99
|
+
|
99
100
|
{ **profile_meta, profile: output.to_h }
|
100
101
|
end
|
101
102
|
|
data/lib/sentry/version.rb
CHANGED
data/lib/sentry-ruby.rb
CHANGED
@@ -52,6 +52,14 @@ module Sentry
|
|
52
52
|
|
53
53
|
MUTEX = Mutex.new
|
54
54
|
|
55
|
+
GLOBALS = %i[
|
56
|
+
main_hub
|
57
|
+
session_flusher
|
58
|
+
backpressure_monitor
|
59
|
+
metrics_aggregator
|
60
|
+
exception_locals_tp
|
61
|
+
].freeze
|
62
|
+
|
55
63
|
class << self
|
56
64
|
# @!visibility private
|
57
65
|
def exception_locals_tp
|
@@ -232,6 +240,7 @@ module Sentry
|
|
232
240
|
yield(config) if block_given?
|
233
241
|
config.detect_release
|
234
242
|
apply_patches(config)
|
243
|
+
config.validate
|
235
244
|
client = Client.new(config)
|
236
245
|
scope = Scope.new(max_breadcrumbs: config.max_breadcrumbs)
|
237
246
|
hub = Hub.new(client, scope)
|
@@ -608,6 +617,11 @@ module Sentry
|
|
608
617
|
def utc_now
|
609
618
|
Time.now.utc
|
610
619
|
end
|
620
|
+
|
621
|
+
# @!visibility private
|
622
|
+
def dependency_installed?(name)
|
623
|
+
Object.const_defined?(name)
|
624
|
+
end
|
611
625
|
end
|
612
626
|
end
|
613
627
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sentry-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.23.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sentry Team
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-
|
10
|
+
date: 2025-03-11 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: concurrent-ruby
|
@@ -150,15 +150,15 @@ files:
|
|
150
150
|
- lib/sentry/version.rb
|
151
151
|
- sentry-ruby-core.gemspec
|
152
152
|
- sentry-ruby.gemspec
|
153
|
-
homepage: https://github.com/getsentry/sentry-ruby/tree/5.
|
153
|
+
homepage: https://github.com/getsentry/sentry-ruby/tree/5.23.0/sentry-ruby
|
154
154
|
licenses:
|
155
155
|
- MIT
|
156
156
|
metadata:
|
157
|
-
homepage_uri: https://github.com/getsentry/sentry-ruby/tree/5.
|
158
|
-
source_code_uri: https://github.com/getsentry/sentry-ruby/tree/5.
|
159
|
-
changelog_uri: https://github.com/getsentry/sentry-ruby/blob/5.
|
157
|
+
homepage_uri: https://github.com/getsentry/sentry-ruby/tree/5.23.0/sentry-ruby
|
158
|
+
source_code_uri: https://github.com/getsentry/sentry-ruby/tree/5.23.0/sentry-ruby
|
159
|
+
changelog_uri: https://github.com/getsentry/sentry-ruby/blob/5.23.0/CHANGELOG.md
|
160
160
|
bug_tracker_uri: https://github.com/getsentry/sentry-ruby/issues
|
161
|
-
documentation_uri: http://www.rubydoc.info/gems/sentry-ruby/5.
|
161
|
+
documentation_uri: http://www.rubydoc.info/gems/sentry-ruby/5.23.0
|
162
162
|
rdoc_options: []
|
163
163
|
require_paths:
|
164
164
|
- lib
|