sentry-ruby 5.5.0 → 5.10.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,22 +11,32 @@ module Sentry
11
11
  # @return [Hash, nil]
12
12
  attr_accessor :dynamic_sampling_context
13
13
 
14
+ # @return [Hash]
15
+ attr_accessor :measurements
16
+
14
17
  # @return [Float, nil]
15
18
  attr_reader :start_timestamp
16
19
 
20
+ # @return [Hash, nil]
21
+ attr_accessor :profile
22
+
17
23
  def initialize(transaction:, **options)
18
24
  super(**options)
19
25
 
20
26
  self.transaction = transaction.name
21
27
  self.transaction_info = { source: transaction.source }
28
+ self.contexts.merge!(transaction.contexts)
22
29
  self.contexts.merge!(trace: transaction.get_trace_context)
23
30
  self.timestamp = transaction.timestamp
24
31
  self.start_timestamp = transaction.start_timestamp
25
32
  self.tags = transaction.tags
26
33
  self.dynamic_sampling_context = transaction.get_baggage.dynamic_sampling_context
34
+ self.measurements = transaction.measurements
27
35
 
28
36
  finished_spans = transaction.span_recorder.spans.select { |span| span.timestamp && span != transaction }
29
37
  self.spans = finished_spans.map(&:to_hash)
38
+
39
+ populate_profile(transaction)
30
40
  end
31
41
 
32
42
  # Sets the event's start_timestamp.
@@ -41,7 +51,33 @@ module Sentry
41
51
  data = super
42
52
  data[:spans] = @spans.map(&:to_hash) if @spans
43
53
  data[:start_timestamp] = @start_timestamp
54
+ data[:measurements] = @measurements
44
55
  data
45
56
  end
57
+
58
+ private
59
+
60
+ def populate_profile(transaction)
61
+ profile_hash = transaction.profiler.to_hash
62
+ return if profile_hash.empty?
63
+
64
+ profile_hash.merge!(
65
+ environment: environment,
66
+ release: release,
67
+ timestamp: Time.at(start_timestamp).iso8601,
68
+ device: { architecture: Scope.os_context[:machine] },
69
+ os: { name: Scope.os_context[:name], version: Scope.os_context[:version] },
70
+ runtime: Scope.runtime_context,
71
+ transaction: {
72
+ id: event_id,
73
+ name: transaction.name,
74
+ trace_id: transaction.trace_id,
75
+ # TODO-neel-profiler stubbed for now, see thread_id note in profiler.rb
76
+ active_thead_id: '0'
77
+ }
78
+ )
79
+
80
+ self.profile = profile_hash
81
+ end
46
82
  end
47
83
  end
@@ -154,6 +154,13 @@ module Sentry
154
154
  event_payload
155
155
  )
156
156
 
157
+ if event.is_a?(TransactionEvent) && event.profile
158
+ envelope.add_item(
159
+ { type: 'profile', content_type: 'application/json' },
160
+ event.profile
161
+ )
162
+ end
163
+
157
164
  client_report_headers, client_report_payload = fetch_pending_client_report
158
165
  envelope.add_item(client_report_headers, client_report_payload) if client_report_headers
159
166
 
@@ -4,9 +4,9 @@ module Sentry
4
4
  module ArgumentCheckingHelper
5
5
  private
6
6
 
7
- def check_argument_type!(argument, expected_type)
8
- unless argument.is_a?(expected_type)
9
- raise ArgumentError, "expect the argument to be a #{expected_type}, got #{argument.class} (#{argument.inspect})"
7
+ def check_argument_type!(argument, *expected_types)
8
+ unless expected_types.any? { |t| argument.is_a?(t) }
9
+ raise ArgumentError, "expect the argument to be a #{expected_types.join(' or ')}, got #{argument.class} (#{argument.inspect})"
10
10
  end
11
11
  end
12
12
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sentry
4
+ module Utils
5
+ module EncodingHelper
6
+ def self.encode_to_utf_8(value)
7
+ if value.encoding != Encoding::UTF_8 && value.respond_to?(:force_encoding)
8
+ value = value.dup.force_encoding(Encoding::UTF_8)
9
+ end
10
+
11
+ value = value.scrub unless value.valid_encoding?
12
+ value
13
+ end
14
+
15
+ def self.valid_utf_8?(value)
16
+ return true unless value.respond_to?(:force_encoding)
17
+
18
+ value.dup.force_encoding(Encoding::UTF_8).valid_encoding?
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sentry
4
- VERSION = "5.5.0"
4
+ VERSION = "5.10.0"
5
5
  end
data/lib/sentry-ruby.rb CHANGED
@@ -8,6 +8,7 @@ require "sentry/version"
8
8
  require "sentry/exceptions"
9
9
  require "sentry/core_ext/object/deep_dup"
10
10
  require "sentry/utils/argument_checking_helper"
11
+ require "sentry/utils/encoding_helper"
11
12
  require "sentry/utils/logging_helper"
12
13
  require "sentry/configuration"
13
14
  require "sentry/logger"
@@ -72,8 +73,18 @@ module Sentry
72
73
  ##### Patch Registration #####
73
74
 
74
75
  # @!visibility private
75
- def register_patch(&block)
76
- registered_patches << block
76
+ def register_patch(patch = nil, target = nil, &block)
77
+ if patch && block
78
+ raise ArgumentError.new("Please provide either a patch and its target OR a block, but not both")
79
+ end
80
+
81
+ if block
82
+ registered_patches << block
83
+ else
84
+ registered_patches << proc do
85
+ target.send(:prepend, patch) unless target.ancestors.include?(patch)
86
+ end
87
+ end
77
88
  end
78
89
 
79
90
  # @!visibility private
@@ -211,7 +222,7 @@ module Sentry
211
222
  nil
212
223
  end
213
224
 
214
- if config.capture_exception_frame_locals
225
+ if config.include_local_variables
215
226
  exception_locals_tp.enable
216
227
  end
217
228
 
@@ -233,7 +244,7 @@ module Sentry
233
244
  @session_flusher = nil
234
245
  end
235
246
 
236
- if configuration&.capture_exception_frame_locals
247
+ if configuration&.include_local_variables
237
248
  exception_locals_tp.disable
238
249
  end
239
250
 
@@ -441,22 +452,8 @@ module Sentry
441
452
  # end
442
453
  #
443
454
  def with_child_span(**attributes, &block)
444
- if Sentry.initialized? && current_span = get_current_scope.get_span
445
- result = nil
446
-
447
- begin
448
- current_span.with_child_span(**attributes) do |child_span|
449
- get_current_scope.set_span(child_span)
450
- result = yield(child_span)
451
- end
452
- ensure
453
- get_current_scope.set_span(current_span)
454
- end
455
-
456
- result
457
- else
458
- yield(nil)
459
- end
455
+ return yield(nil) unless Sentry.initialized?
456
+ get_current_hub.with_child_span(**attributes, &block)
460
457
  end
461
458
 
462
459
  # Returns the id of the lastly reported Sentry::Event.
@@ -475,6 +472,23 @@ module Sentry
475
472
  !!exc.instance_variable_get(CAPTURED_SIGNATURE)
476
473
  end
477
474
 
475
+ # Add a global event processor [Proc].
476
+ # These run before scope event processors.
477
+ #
478
+ # @yieldparam event [Event]
479
+ # @yieldparam hint [Hash, nil]
480
+ # @return [void]
481
+ #
482
+ # @example
483
+ # Sentry.add_global_event_processor do |event, hint|
484
+ # event.tags = { foo: 42 }
485
+ # event
486
+ # end
487
+ #
488
+ def add_global_event_processor(&block)
489
+ Scope.add_global_event_processor(&block)
490
+ end
491
+
478
492
  ##### Helpers #####
479
493
 
480
494
  # @!visibility private
@@ -505,3 +519,4 @@ end
505
519
  # patches
506
520
  require "sentry/net/http"
507
521
  require "sentry/redis"
522
+ require "sentry/puma"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sentry-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.5.0
4
+ version: 5.10.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-10-03 00:00:00.000000000 Z
11
+ date: 2023-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -42,7 +42,6 @@ files:
42
42
  - ".rspec"
43
43
  - ".yardopts"
44
44
  - CHANGELOG.md
45
- - CODE_OF_CONDUCT.md
46
45
  - Gemfile
47
46
  - LICENSE.txt
48
47
  - Makefile
@@ -78,6 +77,8 @@ files:
78
77
  - lib/sentry/linecache.rb
79
78
  - lib/sentry/logger.rb
80
79
  - lib/sentry/net/http.rb
80
+ - lib/sentry/profiler.rb
81
+ - lib/sentry/puma.rb
81
82
  - lib/sentry/rack.rb
82
83
  - lib/sentry/rack/capture_exceptions.rb
83
84
  - lib/sentry/rake.rb
@@ -96,6 +97,7 @@ files:
96
97
  - lib/sentry/transport/http_transport.rb
97
98
  - lib/sentry/utils/argument_checking_helper.rb
98
99
  - lib/sentry/utils/custom_inspection.rb
100
+ - lib/sentry/utils/encoding_helper.rb
99
101
  - lib/sentry/utils/exception_cause_chain.rb
100
102
  - lib/sentry/utils/logging_helper.rb
101
103
  - lib/sentry/utils/real_ip.rb
data/CODE_OF_CONDUCT.md DELETED
@@ -1,74 +0,0 @@
1
- # Contributor Covenant Code of Conduct
2
-
3
- ## Our Pledge
4
-
5
- In the interest of fostering an open and welcoming environment, we as
6
- contributors and maintainers pledge to making participation in our project and
7
- our community a harassment-free experience for everyone, regardless of age, body
8
- size, disability, ethnicity, gender identity and expression, level of experience,
9
- nationality, personal appearance, race, religion, or sexual identity and
10
- orientation.
11
-
12
- ## Our Standards
13
-
14
- Examples of behavior that contributes to creating a positive environment
15
- include:
16
-
17
- * Using welcoming and inclusive language
18
- * Being respectful of differing viewpoints and experiences
19
- * Gracefully accepting constructive criticism
20
- * Focusing on what is best for the community
21
- * Showing empathy towards other community members
22
-
23
- Examples of unacceptable behavior by participants include:
24
-
25
- * The use of sexualized language or imagery and unwelcome sexual attention or
26
- advances
27
- * Trolling, insulting/derogatory comments, and personal or political attacks
28
- * Public or private harassment
29
- * Publishing others' private information, such as a physical or electronic
30
- address, without explicit permission
31
- * Other conduct which could reasonably be considered inappropriate in a
32
- professional setting
33
-
34
- ## Our Responsibilities
35
-
36
- Project maintainers are responsible for clarifying the standards of acceptable
37
- behavior and are expected to take appropriate and fair corrective action in
38
- response to any instances of unacceptable behavior.
39
-
40
- Project maintainers have the right and responsibility to remove, edit, or
41
- reject comments, commits, code, wiki edits, issues, and other contributions
42
- that are not aligned to this Code of Conduct, or to ban temporarily or
43
- permanently any contributor for other behaviors that they deem inappropriate,
44
- threatening, offensive, or harmful.
45
-
46
- ## Scope
47
-
48
- This Code of Conduct applies both within project spaces and in public spaces
49
- when an individual is representing the project or its community. Examples of
50
- representing a project or community include using an official project e-mail
51
- address, posting via an official social media account, or acting as an appointed
52
- representative at an online or offline event. Representation of a project may be
53
- further defined and clarified by project maintainers.
54
-
55
- ## Enforcement
56
-
57
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at stan001212@gmail.com. All
59
- complaints will be reviewed and investigated and will result in a response that
60
- is deemed necessary and appropriate to the circumstances. The project team is
61
- obligated to maintain confidentiality with regard to the reporter of an incident.
62
- Further details of specific enforcement policies may be posted separately.
63
-
64
- Project maintainers who do not follow or enforce the Code of Conduct in good
65
- faith may face temporary or permanent repercussions as determined by other
66
- members of the project's leadership.
67
-
68
- ## Attribution
69
-
70
- This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
- available at [https://contributor-covenant.org/version/1/4][version]
72
-
73
- [homepage]: https://contributor-covenant.org
74
- [version]: https://contributor-covenant.org/version/1/4/