sentry-ruby-core 5.2.1 → 5.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 896f183ea604d1e6857591eff87175f8bb8a83dd1e40fc3e80982a71dd3abe0e
4
- data.tar.gz: ffc931b4d436be3c5b1858260a5e2a0508d75455c23d0971bd0f1d2a02f0e178
3
+ metadata.gz: 03d233c6e1bd55ddc4044c7a23b6bc74047eec17a8c16d5f33f768065641259c
4
+ data.tar.gz: bec07f880bff192b6ef71aaefdf9dc9ff2ff072a539f94ed5c4fd0398ad1146a
5
5
  SHA512:
6
- metadata.gz: 467c2493df9a8ba98148b1d467d313bfc23defd9b34a9355242b01ed7ac4f092932b19607ad79e16883f83ba9b1fa53b736872f920f4fb0590761fcdbfc12a25
7
- data.tar.gz: 074c4ac8eff86f456646ceef087433abf38a81ad1e8a3d0cec465caddf5a4e96459ed9c641854f7dba37ac9e851fde8f7e09798f35420f4d12586b89039282d4
6
+ metadata.gz: c3d90a9b888db8a396e260dccf5df3a38d4f153c9bc2b31b92fc206009553fec2d3d0fe47bb1a871b001372fcba8013fee4e16b60405588db4ce3984f56d675e
7
+ data.tar.gz: 2ae1db7dee78487fec06b1cb1c6fb2dfa77852ae20b0c28b6c2f0e0b964f728fdea40a8261495439ef6e193182a0f7dc3196dc1bd75368abcf2d78852310361a
data/README.md CHANGED
@@ -29,7 +29,7 @@ If you're using `sentry-raven`, we recommend you to migrate to this new SDK. You
29
29
 
30
30
  ## Requirements
31
31
 
32
- We test on Ruby 2.4, 2.5, 2.6, 2.7, and 3.0 at the latest patchlevel/teeny version. We also support JRuby 9.0.
32
+ We test on Ruby 2.4, 2.5, 2.6, 2.7, 3.0, and 3.1 at the latest patchlevel/teeny version. We also support JRuby 9.0.
33
33
 
34
34
  If you use self-hosted Sentry, please also make sure its version is above `20.6.0`.
35
35
 
@@ -29,7 +29,7 @@ module Sentry
29
29
  log_debug("config.background_worker_threads is set to 0, all events will be sent synchronously")
30
30
  Concurrent::ImmediateExecutor.new
31
31
  else
32
- log_debug("initialized a background worker with #{@number_of_threads} threads")
32
+ log_debug("Initializing the background worker with #{@number_of_threads} threads")
33
33
 
34
34
  executor = Concurrent::ThreadPoolExecutor.new(
35
35
  min_threads: 0,
@@ -59,6 +59,7 @@ module Sentry
59
59
  end
60
60
 
61
61
  def shutdown
62
+ log_debug("Shutting down background worker")
62
63
  @shutdown_callback&.call
63
64
  end
64
65
 
data/lib/sentry/client.rb CHANGED
@@ -80,9 +80,10 @@ module Sentry
80
80
 
81
81
  integration_meta = Sentry.integrations[hint[:integration]]
82
82
 
83
- Event.new(configuration: configuration, integration_meta: integration_meta).tap do |event|
83
+ ErrorEvent.new(configuration: configuration, integration_meta: integration_meta).tap do |event|
84
84
  event.add_exception_interface(exception)
85
85
  event.add_threads_interface(crashed: true)
86
+ event.level = :error
86
87
  end
87
88
  end
88
89
 
@@ -94,8 +95,9 @@ module Sentry
94
95
  return unless @configuration.sending_allowed?
95
96
 
96
97
  integration_meta = Sentry.integrations[hint[:integration]]
97
- event = Event.new(configuration: configuration, integration_meta: integration_meta, message: message)
98
+ event = ErrorEvent.new(configuration: configuration, integration_meta: integration_meta, message: message)
98
99
  event.add_threads_interface(backtrace: backtrace || caller)
100
+ event.level = :error
99
101
  event
100
102
  end
101
103
 
@@ -133,7 +135,7 @@ module Sentry
133
135
 
134
136
  event
135
137
  rescue => e
136
- loggable_event_type = (event_type || "event").capitalize
138
+ loggable_event_type = event_type.capitalize
137
139
  log_error("#{loggable_event_type} sending failed", e, debug: configuration.debug)
138
140
 
139
141
  event_info = Event.get_log_message(event.to_hash)
@@ -174,8 +176,7 @@ module Sentry
174
176
  async_block.call(event_hash)
175
177
  end
176
178
  rescue => e
177
- loggable_event_type = event_hash["type"] || "event"
178
- log_error("Async #{loggable_event_type} sending failed", e, debug: configuration.debug)
179
+ log_error("Async #{event_hash["type"]} sending failed", e, debug: configuration.debug)
179
180
  send_event(event, hint)
180
181
  end
181
182
  end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sentry
4
+ # ErrorEvent represents error or normal message events.
5
+ class ErrorEvent < Event
6
+ # @return [ExceptionInterface]
7
+ attr_reader :exception
8
+
9
+ # @return [ThreadsInterface]
10
+ attr_reader :threads
11
+
12
+ # @return [Hash]
13
+ def to_hash
14
+ data = super
15
+ data[:threads] = threads.to_hash if threads
16
+ data[:exception] = exception.to_hash if exception
17
+ data
18
+ end
19
+
20
+ # @!visibility private
21
+ def add_threads_interface(backtrace: nil, **options)
22
+ @threads = ThreadsInterface.build(
23
+ backtrace: backtrace,
24
+ stacktrace_builder: @stacktrace_builder,
25
+ **options
26
+ )
27
+ end
28
+
29
+ # @!visibility private
30
+ def add_exception_interface(exception)
31
+ if exception.respond_to?(:sentry_context)
32
+ @extra.merge!(exception.sentry_context)
33
+ end
34
+
35
+ @exception = Sentry::ExceptionInterface.build(exception: exception, stacktrace_builder: @stacktrace_builder)
36
+ end
37
+ end
38
+ end
data/lib/sentry/event.rb CHANGED
@@ -9,7 +9,10 @@ require 'sentry/utils/request_id'
9
9
  require 'sentry/utils/custom_inspection'
10
10
 
11
11
  module Sentry
12
+ # This is an abstract class that defines the shared attributes of an event.
13
+ # Please don't use it directly. The user-facing classes are its child classes.
12
14
  class Event
15
+ TYPE = "event"
13
16
  # These are readable attributes.
14
17
  SERIALIZEABLE_ATTRIBUTES = %i(
15
18
  event_id level timestamp
@@ -35,12 +38,6 @@ module Sentry
35
38
  # @return [RequestInterface]
36
39
  attr_reader :request
37
40
 
38
- # @return [ExceptionInterface]
39
- attr_reader :exception
40
-
41
- # @return [ThreadsInterface]
42
- attr_reader :threads
43
-
44
41
  # @param configuration [Configuration]
45
42
  # @param integration_meta [Hash, nil]
46
43
  # @param message [String, nil]
@@ -49,6 +46,7 @@ module Sentry
49
46
  @event_id = SecureRandom.uuid.delete("-")
50
47
  @timestamp = Sentry.utc_now.iso8601
51
48
  @platform = :ruby
49
+ @type = self.class::TYPE
52
50
  @sdk = integration_meta || Sentry.sdk_meta
53
51
 
54
52
  @user = {}
@@ -71,8 +69,6 @@ module Sentry
71
69
  @rack_env_whitelist = configuration.rack_env_whitelist
72
70
 
73
71
  @message = (message || "").byteslice(0..MAX_MESSAGE_SIZE_IN_BYTES)
74
-
75
- self.level = :error
76
72
  end
77
73
 
78
74
  class << self
@@ -146,9 +142,6 @@ module Sentry
146
142
  data = serialize_attributes
147
143
  data[:breadcrumbs] = breadcrumbs.to_hash if breadcrumbs
148
144
  data[:request] = request.to_hash if request
149
- data[:exception] = exception.to_hash if exception
150
- data[:threads] = threads.to_hash if threads
151
-
152
145
  data
153
146
  end
154
147
 
@@ -157,24 +150,6 @@ module Sentry
157
150
  JSON.parse(JSON.generate(to_hash))
158
151
  end
159
152
 
160
- # @!visibility private
161
- def add_threads_interface(backtrace: nil, **options)
162
- @threads = ThreadsInterface.build(
163
- backtrace: backtrace,
164
- stacktrace_builder: @stacktrace_builder,
165
- **options
166
- )
167
- end
168
-
169
- # @!visibility private
170
- def add_exception_interface(exception)
171
- if exception.respond_to?(:sentry_context)
172
- @extra.merge!(exception.sentry_context)
173
- end
174
-
175
- @exception = Sentry::ExceptionInterface.build(exception: exception, stacktrace_builder: @stacktrace_builder)
176
- end
177
-
178
153
  private
179
154
 
180
155
  def add_request_interface(env)
data/lib/sentry/hub.rb CHANGED
@@ -150,7 +150,7 @@ module Sentry
150
150
  configuration.log_debug(event.to_json_compatible)
151
151
  end
152
152
 
153
- @last_event_id = event&.event_id
153
+ @last_event_id = event&.event_id unless event.is_a?(Sentry::TransactionEvent)
154
154
  event
155
155
  end
156
156
 
@@ -74,11 +74,11 @@ module Sentry
74
74
  end
75
75
 
76
76
  def start_sentry_span
77
- return unless Sentry.initialized? && transaction = Sentry.get_current_scope.get_transaction
77
+ return unless Sentry.initialized? && span = Sentry.get_current_scope.get_span
78
78
  return if from_sentry_sdk?
79
- return if transaction.sampled == false
79
+ return if span.sampled == false
80
80
 
81
- transaction.start_child(op: OP_NAME, start_timestamp: Sentry.utc_now.to_f)
81
+ span.start_child(op: OP_NAME, start_timestamp: Sentry.utc_now.to_f)
82
82
  end
83
83
 
84
84
  def finish_sentry_span(sentry_span)
@@ -39,6 +39,7 @@ module Sentry
39
39
  end
40
40
 
41
41
  def kill
42
+ log_debug("Killing session flusher")
42
43
  @thread&.kill
43
44
  end
44
45
 
@@ -1,32 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sentry
4
+ # TransactionEvent represents events that carry transaction data (type: "transaction").
4
5
  class TransactionEvent < Event
5
6
  TYPE = "transaction"
6
7
 
7
- SERIALIZEABLE_ATTRIBUTES = %i(
8
- event_id level timestamp start_timestamp
9
- release environment server_name modules
10
- user tags contexts extra
11
- transaction platform sdk type
12
- )
13
-
14
- WRITER_ATTRIBUTES = SERIALIZEABLE_ATTRIBUTES - %i(type timestamp start_timestamp level)
15
-
16
- attr_writer(*WRITER_ATTRIBUTES)
17
- attr_reader(*SERIALIZEABLE_ATTRIBUTES)
18
-
19
8
  # @return [<Array[Span]>]
20
9
  attr_accessor :spans
21
10
 
22
- # @param configuration [Configuration]
23
- # @param integration_meta [Hash, nil]
24
- # @param message [String, nil]
25
- def initialize(configuration:, integration_meta: nil, message: nil)
26
- super
27
- @type = TYPE
28
- self.level = nil
29
- end
11
+ # @return [Float, nil]
12
+ attr_reader :start_timestamp
30
13
 
31
14
  # Sets the event's start_timestamp.
32
15
  # @param time [Time, Float]
@@ -39,6 +22,7 @@ module Sentry
39
22
  def to_hash
40
23
  data = super
41
24
  data[:spans] = @spans.map(&:to_hash) if @spans
25
+ data[:start_timestamp] = @start_timestamp
42
26
  data
43
27
  end
44
28
  end
@@ -130,7 +130,7 @@ module Sentry
130
130
  server = URI(@dsn.server)
131
131
 
132
132
  connection =
133
- if proxy = @transport_configuration.proxy
133
+ if proxy = normalize_proxy(@transport_configuration.proxy)
134
134
  ::Net::HTTP.new(server.hostname, server.port, proxy[:uri].hostname, proxy[:uri].port, proxy[:user], proxy[:password])
135
135
  else
136
136
  ::Net::HTTP.new(server.hostname, server.port, nil)
@@ -148,6 +148,20 @@ module Sentry
148
148
  connection
149
149
  end
150
150
 
151
+ def normalize_proxy(proxy)
152
+ return proxy unless proxy
153
+
154
+ case proxy
155
+ when String
156
+ uri = URI(proxy)
157
+ { uri: uri, user: uri.user, password: uri.password }
158
+ when URI
159
+ { uri: proxy, user: proxy.user, password: proxy.password }
160
+ when Hash
161
+ proxy
162
+ end
163
+ end
164
+
151
165
  def ssl_configuration
152
166
  configuration = {
153
167
  verify: @transport_configuration.ssl_verification,
@@ -148,7 +148,7 @@ module Sentry
148
148
  # Convert to hash
149
149
  event_payload = event.to_hash
150
150
  event_id = event_payload[:event_id] || event_payload["event_id"]
151
- item_type = get_item_type(event_payload)
151
+ item_type = event_payload[:type] || event_payload["type"]
152
152
 
153
153
  envelope = Envelope.new(
154
154
  {
@@ -174,16 +174,11 @@ module Sentry
174
174
  return unless @send_client_reports
175
175
  return unless CLIENT_REPORT_REASONS.include?(reason)
176
176
 
177
- item_type ||= 'event'
178
177
  @discarded_events[[reason, item_type]] += 1
179
178
  end
180
179
 
181
180
  private
182
181
 
183
- def get_item_type(event_hash)
184
- event_hash[:type] || event_hash["type"] || "event"
185
- end
186
-
187
182
  def fetch_pending_client_report
188
183
  return nil unless @send_client_reports
189
184
  return nil if @last_client_report_sent > Time.now - CLIENT_REPORT_INTERVAL
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sentry
4
- VERSION = "5.2.1"
4
+ VERSION = "5.3.0"
5
5
  end
data/lib/sentry-ruby.rb CHANGED
@@ -12,6 +12,7 @@ require "sentry/utils/logging_helper"
12
12
  require "sentry/configuration"
13
13
  require "sentry/logger"
14
14
  require "sentry/event"
15
+ require "sentry/error_event"
15
16
  require "sentry/transaction_event"
16
17
  require "sentry/span"
17
18
  require "sentry/transaction"
@@ -102,7 +103,7 @@ module Sentry
102
103
  if initialized?
103
104
  logger.warn(LOGGER_PROGNAME) do
104
105
  <<~MSG
105
- Integration '#{name}' is loaded after the SDK is initialized, which can cause expected behavior. Please make sure all integrations are loaded before SDK initialization.
106
+ Integration '#{name}' is loaded after the SDK is initialized, which can cause unexpected behavior. Please make sure all integrations are loaded before SDK initialization.
106
107
  MSG
107
108
  end
108
109
  end
@@ -384,6 +385,40 @@ module Sentry
384
385
  get_current_hub.start_transaction(**options)
385
386
  end
386
387
 
388
+ # Records the block's execution as a child of the current span.
389
+ # If the current scope doesn't have a span, the block would still be executed but the yield param will be nil.
390
+ # @param attributes [Hash] attributes for the child span.
391
+ # @yieldparam child_span [Span, nil]
392
+ # @return yield result
393
+ #
394
+ # @example
395
+ # Sentry.with_child_span(op: "my operation") do |child_span|
396
+ # child_span.set_data(operation_data)
397
+ # child_span.set_description(operation_detail)
398
+ # # result will be returned
399
+ # end
400
+ #
401
+ def with_child_span(**attributes, &block)
402
+ current_span = get_current_scope.get_span
403
+
404
+ if current_span
405
+ result = nil
406
+
407
+ begin
408
+ current_span.with_child_span(**attributes) do |child_span|
409
+ get_current_scope.set_span(child_span)
410
+ result = yield(child_span)
411
+ end
412
+ ensure
413
+ get_current_scope.set_span(current_span)
414
+ end
415
+
416
+ result
417
+ else
418
+ yield(nil)
419
+ end
420
+ end
421
+
387
422
  # Returns the id of the lastly reported Sentry::Event.
388
423
  #
389
424
  # @return [String, nil]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sentry-ruby-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.1
4
+ version: 5.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sentry Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-18 00:00:00.000000000 Z
11
+ date: 2022-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -56,6 +56,7 @@ files:
56
56
  - lib/sentry/core_ext/object/duplicable.rb
57
57
  - lib/sentry/dsn.rb
58
58
  - lib/sentry/envelope.rb
59
+ - lib/sentry/error_event.rb
59
60
  - lib/sentry/event.rb
60
61
  - lib/sentry/exceptions.rb
61
62
  - lib/sentry/hub.rb