sentry-ruby-core 4.7.3 → 4.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +2 -0
  3. data/Gemfile +6 -2
  4. data/README.md +7 -7
  5. data/bin/console +5 -1
  6. data/lib/sentry/background_worker.rb +30 -2
  7. data/lib/sentry/backtrace.rb +1 -0
  8. data/lib/sentry/breadcrumb/sentry_logger.rb +2 -0
  9. data/lib/sentry/breadcrumb.rb +2 -0
  10. data/lib/sentry/breadcrumb_buffer.rb +2 -0
  11. data/lib/sentry/client.rb +13 -1
  12. data/lib/sentry/configuration.rb +136 -112
  13. data/lib/sentry/core_ext/object/deep_dup.rb +2 -0
  14. data/lib/sentry/core_ext/object/duplicable.rb +1 -0
  15. data/lib/sentry/dsn.rb +2 -0
  16. data/lib/sentry/envelope.rb +26 -0
  17. data/lib/sentry/event.rb +5 -0
  18. data/lib/sentry/exceptions.rb +2 -0
  19. data/lib/sentry/hub.rb +7 -0
  20. data/lib/sentry/integrable.rb +2 -0
  21. data/lib/sentry/interface.rb +2 -0
  22. data/lib/sentry/interfaces/exception.rb +2 -0
  23. data/lib/sentry/interfaces/single_exception.rb +31 -0
  24. data/lib/sentry/interfaces/stacktrace.rb +10 -0
  25. data/lib/sentry/interfaces/stacktrace_builder.rb +2 -0
  26. data/lib/sentry/interfaces/threads.rb +2 -0
  27. data/lib/sentry/linecache.rb +3 -0
  28. data/lib/sentry/net/http.rb +3 -0
  29. data/lib/sentry/rack/capture_exceptions.rb +2 -0
  30. data/lib/sentry/rack.rb +2 -0
  31. data/lib/sentry/rake.rb +16 -6
  32. data/lib/sentry/release_detector.rb +39 -0
  33. data/lib/sentry/scope.rb +8 -4
  34. data/lib/sentry/span.rb +1 -0
  35. data/lib/sentry/transaction.rb +6 -1
  36. data/lib/sentry/transport/configuration.rb +2 -0
  37. data/lib/sentry/transport/dummy_transport.rb +2 -0
  38. data/lib/sentry/transport/http_transport.rb +6 -4
  39. data/lib/sentry/transport.rb +77 -19
  40. data/lib/sentry/utils/argument_checking_helper.rb +2 -0
  41. data/lib/sentry/utils/custom_inspection.rb +14 -0
  42. data/lib/sentry/utils/exception_cause_chain.rb +10 -10
  43. data/lib/sentry/utils/logging_helper.rb +2 -0
  44. data/lib/sentry/utils/real_ip.rb +2 -0
  45. data/lib/sentry/utils/request_id.rb +2 -0
  46. data/lib/sentry/version.rb +3 -1
  47. data/lib/sentry-ruby.rb +102 -28
  48. data/sentry-ruby.gemspec +1 -1
  49. metadata +6 -2
data/lib/sentry-ruby.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "English"
2
4
  require "forwardable"
3
5
  require "time"
@@ -37,46 +39,77 @@ module Sentry
37
39
  THREAD_LOCAL = :sentry_hub
38
40
 
39
41
  class << self
42
+ # @!visibility private
43
+ def exception_locals_tp
44
+ @exception_locals_tp ||= TracePoint.new(:raise) do |tp|
45
+ exception = tp.raised_exception
46
+
47
+ # don't collect locals again if the exception is re-raised
48
+ next if exception.instance_variable_get(:@sentry_locals)
49
+ next unless tp.binding
50
+
51
+ locals = tp.binding.local_variables.each_with_object({}) do |local, result|
52
+ result[local] = tp.binding.local_variable_get(local)
53
+ end
54
+
55
+ exception.instance_variable_set(:@sentry_locals, locals)
56
+ end
57
+ end
58
+
59
+ # @!attribute [rw] background_worker
60
+ # @return [BackgroundWorker]
40
61
  attr_accessor :background_worker
41
62
 
42
63
  ##### Patch Registration #####
43
- #
64
+
65
+ # @!visibility private
44
66
  def register_patch(&block)
45
67
  registered_patches << block
46
68
  end
47
69
 
70
+ # @!visibility private
48
71
  def apply_patches(config)
49
72
  registered_patches.each do |patch|
50
73
  patch.call(config)
51
74
  end
52
75
  end
53
76
 
77
+ # @!visibility private
54
78
  def registered_patches
55
79
  @registered_patches ||= []
56
80
  end
57
81
 
58
82
  ##### Integrations #####
59
- #
83
+
60
84
  # Returns a hash that contains all the integrations that have been registered to the main SDK.
85
+ #
86
+ # @return [Hash{String=>Hash}]
61
87
  def integrations
62
88
  @integrations ||= {}
63
89
  end
64
90
 
65
91
  # Registers the SDK integration with its name and version.
92
+ #
93
+ # @param name [String] name of the integration
94
+ # @param version [String] version of the integration
66
95
  def register_integration(name, version)
67
96
  meta = { name: "sentry.ruby.#{name}", version: version }.freeze
68
97
  integrations[name.to_s] = meta
69
98
  end
70
99
 
71
100
  ##### Method Delegation #####
72
- #
101
+
73
102
  extend Forwardable
74
103
 
75
104
  def_delegators :get_current_client, :configuration, :send_event
76
105
  def_delegators :get_current_scope, :set_tags, :set_extras, :set_user, :set_context
77
106
 
78
107
  ##### Main APIs #####
108
+
109
+ # Initializes the SDK with given configuration.
79
110
  #
111
+ # @yieldparam config [Configuration]
112
+ # @return [void]
80
113
  def init(&block)
81
114
  config = Configuration.new
82
115
  yield(config) if block_given?
@@ -88,26 +121,46 @@ module Sentry
88
121
  Thread.current.thread_variable_set(THREAD_LOCAL, hub)
89
122
  @main_hub = hub
90
123
  @background_worker = Sentry::BackgroundWorker.new(config)
124
+
125
+ if config.capture_exception_frame_locals
126
+ exception_locals_tp.enable
127
+ end
128
+
129
+ at_exit do
130
+ @background_worker.shutdown
131
+ end
132
+ end
133
+
134
+ # Returns true if the SDK is initialized.
135
+ #
136
+ # @return [Boolean]
137
+ def initialized?
138
+ !!@main_hub
91
139
  end
92
140
 
93
141
  # Returns an uri for security policy reporting that's generated from the given DSN
94
142
  # (To learn more about security policy reporting: https://docs.sentry.io/product/security-policy-reporting/)
95
143
  #
96
144
  # It returns nil if
145
+ # - The SDK is not initialized yet.
146
+ # - The DSN is not provided or is invalid.
97
147
  #
98
- # 1. The SDK is not initialized yet.
99
- # 2. The DSN is not provided or is invalid.
148
+ # @return [String, nil]
100
149
  def csp_report_uri
101
150
  return unless initialized?
102
151
  configuration.csp_report_uri
103
152
  end
104
153
 
105
154
  # Returns the main thread's active hub.
155
+ #
156
+ # @return [Hub]
106
157
  def get_main_hub
107
158
  @main_hub
108
159
  end
109
160
 
110
161
  # Takes an instance of Sentry::Breadcrumb and stores it to the current active scope.
162
+ #
163
+ # @return [Breadcrumb, nil]
111
164
  def add_breadcrumb(breadcrumb, **options)
112
165
  get_current_hub&.add_breadcrumb(breadcrumb, **options)
113
166
  end
@@ -115,6 +168,8 @@ module Sentry
115
168
  # Returns the current active hub.
116
169
  # If the current thread doesn't have an active hub, it will clone the main thread's active hub,
117
170
  # stores it in the current thread, and then returns it.
171
+ #
172
+ # @return [Hub]
118
173
  def get_current_hub
119
174
  # we need to assign a hub to the current thread if it doesn't have one yet
120
175
  #
@@ -125,85 +180,105 @@ module Sentry
125
180
  end
126
181
 
127
182
  # Returns the current active client.
183
+ # @return [Client, nil]
128
184
  def get_current_client
129
185
  get_current_hub&.current_client
130
186
  end
131
187
 
132
188
  # Returns the current active scope.
189
+ #
190
+ # @return [Scope, nil]
133
191
  def get_current_scope
134
192
  get_current_hub&.current_scope
135
193
  end
136
194
 
137
195
  # Clones the main thread's active hub and stores it to the current thread.
196
+ #
197
+ # @return [void]
138
198
  def clone_hub_to_current_thread
139
199
  Thread.current.thread_variable_set(THREAD_LOCAL, get_main_hub.clone)
140
200
  end
141
201
 
142
202
  # Takes a block and yields the current active scope.
143
203
  #
144
- # ```ruby
145
- # Sentry.configure_scope do |scope|
146
- # scope.set_tags(foo: "bar")
147
- # end
204
+ # @example
205
+ # Sentry.configure_scope do |scope|
206
+ # scope.set_tags(foo: "bar")
207
+ # end
148
208
  #
149
- # Sentry.capture_message("test message") # this event will have tags { foo: "bar" }
150
- # ```
209
+ # Sentry.capture_message("test message") # this event will have tags { foo: "bar" }
151
210
  #
211
+ # @yieldparam scope [Scope]
212
+ # @return [void]
152
213
  def configure_scope(&block)
153
214
  get_current_hub&.configure_scope(&block)
154
215
  end
155
216
 
156
217
  # Takes a block and yields a temporary scope.
157
218
  # The temporary scope will inherit all the attributes from the current active scope and replace it to be the active
158
- # scope inside the block. For example:
219
+ # scope inside the block.
159
220
  #
160
- # ```ruby
161
- # Sentry.configure_scope do |scope|
162
- # scope.set_tags(foo: "bar")
163
- # end
221
+ # @example
222
+ # Sentry.configure_scope do |scope|
223
+ # scope.set_tags(foo: "bar")
224
+ # end
164
225
  #
165
- # Sentry.capture_message("test message") # this event will have tags { foo: "bar" }
226
+ # Sentry.capture_message("test message") # this event will have tags { foo: "bar" }
166
227
  #
167
- # Sentry.with_scope do |temp_scope|
168
- # temp_scope.set_tags(foo: "baz")
169
- # Sentry.capture_message("test message 2") # this event will have tags { foo: "baz" }
170
- # end
228
+ # Sentry.with_scope do |temp_scope|
229
+ # temp_scope.set_tags(foo: "baz")
230
+ # Sentry.capture_message("test message 2") # this event will have tags { foo: "baz" }
231
+ # end
171
232
  #
172
- # Sentry.capture_message("test message 3") # this event will have tags { foo: "bar" }
173
- # ```
233
+ # Sentry.capture_message("test message 3") # this event will have tags { foo: "bar" }
174
234
  #
235
+ # @yieldparam scope [Scope]
236
+ # @return [void]
175
237
  def with_scope(&block)
176
238
  get_current_hub&.with_scope(&block)
177
239
  end
178
240
 
179
241
  # Takes an exception and reports it to Sentry via the currently active hub.
242
+ #
243
+ # @yieldparam scope [Scope]
244
+ # @return [Event, nil]
180
245
  def capture_exception(exception, **options, &block)
181
246
  get_current_hub&.capture_exception(exception, **options, &block)
182
247
  end
183
248
 
184
249
  # Takes a message string and reports it to Sentry via the currently active hub.
250
+ #
251
+ # @yieldparam scope [Scope]
252
+ # @return [Event, nil]
185
253
  def capture_message(message, **options, &block)
186
254
  get_current_hub&.capture_message(message, **options, &block)
187
255
  end
188
256
 
189
257
  # Takes an instance of Sentry::Event and dispatches it to the currently active hub.
258
+ #
259
+ # @return [Event, nil]
190
260
  def capture_event(event)
191
261
  get_current_hub&.capture_event(event)
192
262
  end
193
263
 
194
264
  # Takes or initializes a new Sentry::Transaction and makes a sampling decision for it.
265
+ #
266
+ # @return [Transaction, nil]
195
267
  def start_transaction(**options)
196
268
  get_current_hub&.start_transaction(**options)
197
269
  end
198
270
 
199
271
  # Returns the id of the lastly reported Sentry::Event.
272
+ #
273
+ # @return [String, nil]
200
274
  def last_event_id
201
275
  get_current_hub&.last_event_id
202
276
  end
203
277
 
204
278
 
205
279
  ##### Helpers #####
206
- #
280
+
281
+ # @!visibility private
207
282
  def sys_command(command)
208
283
  result = `#{command} 2>&1` rescue nil
209
284
  return if result.nil? || result.empty? || ($CHILD_STATUS && $CHILD_STATUS.exitstatus != 0)
@@ -211,18 +286,17 @@ module Sentry
211
286
  result.strip
212
287
  end
213
288
 
214
- def initialized?
215
- !!@main_hub
216
- end
217
-
289
+ # @!visibility private
218
290
  def logger
219
291
  configuration.logger
220
292
  end
221
293
 
294
+ # @!visibility private
222
295
  def sdk_meta
223
296
  META
224
297
  end
225
298
 
299
+ # @!visibility private
226
300
  def utc_now
227
301
  Time.now.utc
228
302
  end
data/sentry-ruby.gemspec CHANGED
@@ -18,6 +18,6 @@ Gem::Specification.new do |spec|
18
18
  spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/master/CHANGELOG.md"
19
19
 
20
20
  spec.add_dependency "sentry-ruby-core", Sentry::VERSION
21
- spec.add_dependency "faraday", ">= 1.0"
21
+ spec.add_dependency "faraday", "~> 1.0"
22
22
  spec.add_dependency "concurrent-ruby", '~> 1.0', '>= 1.0.2'
23
23
  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: 4.7.3
4
+ version: 4.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sentry Team
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-22 00:00:00.000000000 Z
11
+ date: 2022-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -48,6 +48,7 @@ extra_rdoc_files:
48
48
  files:
49
49
  - ".gitignore"
50
50
  - ".rspec"
51
+ - ".yardopts"
51
52
  - CHANGELOG.md
52
53
  - CODE_OF_CONDUCT.md
53
54
  - Gemfile
@@ -68,6 +69,7 @@ files:
68
69
  - lib/sentry/core_ext/object/deep_dup.rb
69
70
  - lib/sentry/core_ext/object/duplicable.rb
70
71
  - lib/sentry/dsn.rb
72
+ - lib/sentry/envelope.rb
71
73
  - lib/sentry/event.rb
72
74
  - lib/sentry/exceptions.rb
73
75
  - lib/sentry/hub.rb
@@ -85,6 +87,7 @@ files:
85
87
  - lib/sentry/rack.rb
86
88
  - lib/sentry/rack/capture_exceptions.rb
87
89
  - lib/sentry/rake.rb
90
+ - lib/sentry/release_detector.rb
88
91
  - lib/sentry/scope.rb
89
92
  - lib/sentry/span.rb
90
93
  - lib/sentry/transaction.rb
@@ -94,6 +97,7 @@ files:
94
97
  - lib/sentry/transport/dummy_transport.rb
95
98
  - lib/sentry/transport/http_transport.rb
96
99
  - lib/sentry/utils/argument_checking_helper.rb
100
+ - lib/sentry/utils/custom_inspection.rb
97
101
  - lib/sentry/utils/exception_cause_chain.rb
98
102
  - lib/sentry/utils/logging_helper.rb
99
103
  - lib/sentry/utils/real_ip.rb