sentry-ruby-core 5.6.0 → 5.7.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: 032d7200cb3a21a063c173eb9a842d897eff8d7ae26faaa27ae7cf3771812c3a
4
- data.tar.gz: 1b76f778b06e4928eb32cabe31fc208a4aa92bf8b62f447abf9dd204c97e26cb
3
+ metadata.gz: 2b278a33d0084cedcfbe91b489c53c56dee24543e5a319d764aff94cc41c579a
4
+ data.tar.gz: 923f906cd698d18f2fcb419bfeb2d1262c4165e6a8ffe2484de7027a90e69644
5
5
  SHA512:
6
- metadata.gz: 9e6aee8eaba585cf1fd36bafc70097ae88d05a9febab76ebd0ae2b7ef52c8e95e9c01b81402a0f8a2b90c792c1fad86c784694ac5bc933ecd14c9be1ab3c7b05
7
- data.tar.gz: 2194f3cb7e4d604d8ddeaf3761406133a049a5e5870ac44e54e8d7ca90d4a41e489b39681b53c912d97c4710bd1813716863364f9de6f233e345c353b31d133f
6
+ metadata.gz: 47f71f658582bb3b81918b96780e118c4bc161c78f9d0c3e060a80fd6e75258824fc6be690d57899445fdc03f9cbf5c3693ad7754fcc9d96ba2d1480b0222444
7
+ data.tar.gz: 14b28401b32d9ce9ee7ac0351de736d0d9f11221010e61091e4976b71a58b1fef61ca4e282ec31a714e040148197c5fab46f0a0e39e475ea1f6dd0196b5f104d
data/README.md CHANGED
@@ -20,6 +20,7 @@ Sentry SDK for Ruby
20
20
  | [![Gem Version](https://img.shields.io/gem/v/sentry-sidekiq?label=sentry-sidekiq)](https://rubygems.org/gems/sentry-sidekiq) | [![Build Status](https://github.com/getsentry/sentry-ruby/workflows/sentry-sidekiq%20Test/badge.svg)](https://github.com/getsentry/sentry-ruby/actions/workflows/sentry_sidekiq_test.yml) | [![Coverage Status](https://img.shields.io/codecov/c/github/getsentry/sentry-ruby/master?logo=codecov)](https://codecov.io/gh/getsentry/sentry-ruby/branch/master) | [![Downloads](https://img.shields.io/gem/dt/sentry-sidekiq.svg)](https://rubygems.org/gems/sentry-sidekiq/) |
21
21
  | [![Gem Version](https://img.shields.io/gem/v/sentry-delayed_job?label=sentry-delayed_job)](https://rubygems.org/gems/sentry-delayed_job) | [![Build Status](https://github.com/getsentry/sentry-ruby/workflows/sentry-delayed_job%20Test/badge.svg)](https://github.com/getsentry/sentry-ruby/actions/workflows/sentry_delayed_job_test.yml) | [![Coverage Status](https://img.shields.io/codecov/c/github/getsentry/sentry-ruby/master?logo=codecov)](https://codecov.io/gh/getsentry/sentry-ruby/branch/master) | [![Downloads](https://img.shields.io/gem/dt/sentry-delayed_job.svg)](https://rubygems.org/gems/sentry-delayed_job/) |
22
22
  | [![Gem Version](https://img.shields.io/gem/v/sentry-resque?label=sentry-resque)](https://rubygems.org/gems/sentry-resque) | [![Build Status](https://github.com/getsentry/sentry-ruby/workflows/sentry-resque%20Test/badge.svg)](https://github.com/getsentry/sentry-ruby/actions/workflows/sentry_resque_test.yml) | [![Coverage Status](https://img.shields.io/codecov/c/github/getsentry/sentry-ruby/master?logo=codecov)](https://codecov.io/gh/getsentry/sentry-ruby/branch/master) | [![Downloads](https://img.shields.io/gem/dt/sentry-resque.svg)](https://rubygems.org/gems/sentry-resque/) |
23
+ | [![Gem Version](https://img.shields.io/gem/v/sentry-opentelemetry?label=sentry-opentelemetry)](https://rubygems.org/gems/sentry-opentelemetry) | [![Build Status](https://github.com/getsentry/sentry-ruby/workflows/sentry-opentelemetry%20Test/badge.svg)](https://github.com/getsentry/sentry-ruby/actions/workflows/sentry_opentelemetry_test.yml) | [![Coverage Status](https://img.shields.io/codecov/c/github/getsentry/sentry-ruby/master?logo=codecov)](https://codecov.io/gh/getsentry/sentry-ruby/branch/master) | [![Downloads](https://img.shields.io/gem/dt/sentry-opentelemetry.svg)](https://rubygems.org/gems/sentry-opentelemetry/) |
23
24
 
24
25
 
25
26
 
@@ -51,6 +52,7 @@ gem "sentry-rails"
51
52
  gem "sentry-sidekiq"
52
53
  gem "sentry-delayed_job"
53
54
  gem "sentry-resque"
55
+ gem "sentry-opentelemetry"
54
56
  ```
55
57
 
56
58
  ### Configuration
@@ -88,6 +90,7 @@ To learn more about sampling transactions, please visit the [official documentat
88
90
  - [Sidekiq](https://docs.sentry.io/platforms/ruby/guides/sidekiq/)
89
91
  - [DelayedJob](https://docs.sentry.io/platforms/ruby/guides/delayed_job/)
90
92
  - [Resque](https://docs.sentry.io/platforms/ruby/guides/resque/)
93
+ - [OpenTemeletry](https://docs.sentry.io/platforms/ruby/performance/instrumentation/opentelemetry/)
91
94
 
92
95
  ### Enriching Events
93
96
 
@@ -211,6 +211,10 @@ module Sentry
211
211
  # @return [Boolean]
212
212
  attr_accessor :auto_session_tracking
213
213
 
214
+ # The instrumenter to use, :sentry or :otel
215
+ # @return [Symbol]
216
+ attr_reader :instrumenter
217
+
214
218
  # these are not config options
215
219
  # @!visibility private
216
220
  attr_reader :errors, :gem_specs
@@ -237,6 +241,8 @@ module Sentry
237
241
  MODULE_SEPARATOR = "::".freeze
238
242
  SKIP_INSPECTION_ATTRIBUTES = [:@linecache, :@stacktrace_builder]
239
243
 
244
+ INSTRUMENTERS = [:sentry, :otel]
245
+
240
246
  # Post initialization callbacks are called at the end of initialization process
241
247
  # allowing extending the configuration of sentry-ruby by multiple extensions
242
248
  @@post_initialization_callbacks = []
@@ -269,6 +275,7 @@ module Sentry
269
275
  self.trusted_proxies = []
270
276
  self.dsn = ENV['SENTRY_DSN']
271
277
  self.server_name = server_name_from_env
278
+ self.instrumenter = :sentry
272
279
 
273
280
  self.before_send = nil
274
281
  self.rack_env_whitelist = RACK_ENV_WHITELIST_DEFAULT
@@ -332,6 +339,10 @@ module Sentry
332
339
  @environment = environment.to_s
333
340
  end
334
341
 
342
+ def instrumenter=(instrumenter)
343
+ @instrumenter = INSTRUMENTERS.include?(instrumenter) ? instrumenter : :sentry
344
+ end
345
+
335
346
  def sending_allowed?
336
347
  @errors = []
337
348
 
data/lib/sentry/hub.rb CHANGED
@@ -76,8 +76,9 @@ module Sentry
76
76
  @stack.pop
77
77
  end
78
78
 
79
- def start_transaction(transaction: nil, custom_sampling_context: {}, **options)
79
+ def start_transaction(transaction: nil, custom_sampling_context: {}, instrumenter: :sentry, **options)
80
80
  return unless configuration.tracing_enabled?
81
+ return unless instrumenter == configuration.instrumenter
81
82
 
82
83
  transaction ||= Transaction.new(**options.merge(hub: self))
83
84
 
@@ -92,7 +93,9 @@ module Sentry
92
93
  transaction
93
94
  end
94
95
 
95
- def with_child_span(**attributes, &block)
96
+ def with_child_span(instrumenter: :sentry, **attributes, &block)
97
+ return yield(nil) unless instrumenter == configuration.instrumenter
98
+
96
99
  current_span = current_scope.get_span
97
100
  return yield(nil) unless current_span
98
101
 
data/lib/sentry/span.rb CHANGED
@@ -68,13 +68,14 @@ module Sentry
68
68
  op: nil,
69
69
  status: nil,
70
70
  trace_id: nil,
71
+ span_id: nil,
71
72
  parent_span_id: nil,
72
73
  sampled: nil,
73
74
  start_timestamp: nil,
74
75
  timestamp: nil
75
76
  )
76
77
  @trace_id = trace_id || SecureRandom.uuid.delete("-")
77
- @span_id = SecureRandom.hex(8)
78
+ @span_id = span_id || SecureRandom.hex(8)
78
79
  @parent_span_id = parent_span_id
79
80
  @sampled = sampled
80
81
  @start_timestamp = start_timestamp || Sentry.utc_now.to_f
@@ -89,11 +90,8 @@ module Sentry
89
90
 
90
91
  # Finishes the span by adding a timestamp.
91
92
  # @return [self]
92
- def finish
93
- # already finished
94
- return if @timestamp
95
-
96
- @timestamp = Sentry.utc_now.to_f
93
+ def finish(end_timestamp: nil)
94
+ @timestamp = end_timestamp || @timestamp || Sentry.utc_now.to_f
97
95
  self
98
96
  end
99
97
 
@@ -50,6 +50,10 @@ module Sentry
50
50
  # @return [Float, nil]
51
51
  attr_reader :effective_sample_rate
52
52
 
53
+ # Additional contexts stored directly on the transaction object.
54
+ # @return [Hash]
55
+ attr_reader :contexts
56
+
53
57
  def initialize(
54
58
  hub:,
55
59
  name: nil,
@@ -60,8 +64,7 @@ module Sentry
60
64
  )
61
65
  super(transaction: self, **options)
62
66
 
63
- @name = name
64
- @source = SOURCES.include?(source) ? source.to_sym : :custom
67
+ set_name(name, source: source)
65
68
  @parent_sampled = parent_sampled
66
69
  @hub = hub
67
70
  @baggage = baggage
@@ -74,6 +77,7 @@ module Sentry
74
77
  @environment = hub.configuration.environment
75
78
  @dsn = hub.configuration.dsn
76
79
  @effective_sample_rate = nil
80
+ @contexts = {}
77
81
  init_span_recorder
78
82
  end
79
83
 
@@ -91,16 +95,10 @@ module Sentry
91
95
  return unless hub.configuration.tracing_enabled?
92
96
  return unless sentry_trace
93
97
 
94
- match = SENTRY_TRACE_REGEXP.match(sentry_trace)
95
- return if match.nil?
96
- trace_id, parent_span_id, sampled_flag = match[1..3]
98
+ sentry_trace_data = extract_sentry_trace(sentry_trace)
99
+ return unless sentry_trace_data
97
100
 
98
- parent_sampled =
99
- if sampled_flag.nil?
100
- nil
101
- else
102
- sampled_flag != "0"
103
- end
101
+ trace_id, parent_span_id, parent_sampled = sentry_trace_data
104
102
 
105
103
  baggage = if baggage && !baggage.empty?
106
104
  Baggage.from_incoming_header(baggage)
@@ -123,6 +121,20 @@ module Sentry
123
121
  )
124
122
  end
125
123
 
124
+ # Extract the trace_id, parent_span_id and parent_sampled values from a sentry-trace header.
125
+ #
126
+ # @param sentry_trace [String] the sentry-trace header value from the previous transaction.
127
+ # @return [Array, nil]
128
+ def self.extract_sentry_trace(sentry_trace)
129
+ match = SENTRY_TRACE_REGEXP.match(sentry_trace)
130
+ return nil if match.nil?
131
+
132
+ trace_id, parent_span_id, sampled_flag = match[1..3]
133
+ parent_sampled = sampled_flag.nil? ? nil : sampled_flag != "0"
134
+
135
+ [trace_id, parent_span_id, parent_sampled]
136
+ end
137
+
126
138
  # @return [Hash]
127
139
  def to_hash
128
140
  hash = super
@@ -210,7 +222,7 @@ module Sentry
210
222
  # Finishes the transaction's recording and send it to Sentry.
211
223
  # @param hub [Hub] the hub that'll send this transaction. (Deprecated)
212
224
  # @return [TransactionEvent]
213
- def finish(hub: nil)
225
+ def finish(hub: nil, end_timestamp: nil)
214
226
  if hub
215
227
  log_warn(
216
228
  <<~MSG
@@ -222,7 +234,7 @@ module Sentry
222
234
 
223
235
  hub ||= @hub
224
236
 
225
- super() # Span#finish doesn't take arguments
237
+ super(end_timestamp: end_timestamp)
226
238
 
227
239
  if @name.nil?
228
240
  @name = UNLABELD_NAME
@@ -244,6 +256,24 @@ module Sentry
244
256
  @baggage
245
257
  end
246
258
 
259
+ # Set the transaction name directly.
260
+ # Considered internal api since it bypasses the usual scope logic.
261
+ # @param name [String]
262
+ # @param source [Symbol]
263
+ # @return [void]
264
+ def set_name(name, source: :custom)
265
+ @name = name
266
+ @source = SOURCES.include?(source) ? source.to_sym : :custom
267
+ end
268
+
269
+ # Set contexts directly on the transaction.
270
+ # @param key [String, Symbol]
271
+ # @param value [Object]
272
+ # @return [void]
273
+ def set_context(key, value)
274
+ @contexts[key] = value
275
+ end
276
+
247
277
  protected
248
278
 
249
279
  def init_span_recorder(limit = 1000)
@@ -19,6 +19,7 @@ module Sentry
19
19
 
20
20
  self.transaction = transaction.name
21
21
  self.transaction_info = { source: transaction.source }
22
+ self.contexts.merge!(transaction.contexts)
22
23
  self.contexts.merge!(trace: transaction.get_trace_context)
23
24
  self.timestamp = transaction.timestamp
24
25
  self.start_timestamp = transaction.start_timestamp
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sentry
4
- VERSION = "5.6.0"
4
+ VERSION = "5.7.0"
5
5
  end
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.6.0
4
+ version: 5.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sentry Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-08 00:00:00.000000000 Z
11
+ date: 2022-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sentry-ruby
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 5.6.0
19
+ version: 5.7.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 5.6.0
26
+ version: 5.7.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: concurrent-ruby
29
29
  requirement: !ruby/object:Gem::Requirement