sentry-ruby 5.1.0 → 5.4.2

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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.yardopts +2 -0
  5. data/CHANGELOG.md +313 -0
  6. data/CODE_OF_CONDUCT.md +74 -0
  7. data/Gemfile +27 -0
  8. data/Makefile +4 -0
  9. data/README.md +8 -7
  10. data/Rakefile +13 -0
  11. data/bin/console +18 -0
  12. data/bin/setup +8 -0
  13. data/lib/sentry/background_worker.rb +72 -0
  14. data/lib/sentry/backtrace.rb +124 -0
  15. data/lib/sentry/breadcrumb/sentry_logger.rb +90 -0
  16. data/lib/sentry/breadcrumb.rb +70 -0
  17. data/lib/sentry/breadcrumb_buffer.rb +64 -0
  18. data/lib/sentry/client.rb +190 -0
  19. data/lib/sentry/configuration.rb +502 -0
  20. data/lib/sentry/core_ext/object/deep_dup.rb +61 -0
  21. data/lib/sentry/core_ext/object/duplicable.rb +155 -0
  22. data/lib/sentry/dsn.rb +53 -0
  23. data/lib/sentry/envelope.rb +96 -0
  24. data/lib/sentry/error_event.rb +38 -0
  25. data/lib/sentry/event.rb +178 -0
  26. data/lib/sentry/exceptions.rb +9 -0
  27. data/lib/sentry/hub.rb +220 -0
  28. data/lib/sentry/integrable.rb +26 -0
  29. data/lib/sentry/interface.rb +16 -0
  30. data/lib/sentry/interfaces/exception.rb +43 -0
  31. data/lib/sentry/interfaces/request.rb +144 -0
  32. data/lib/sentry/interfaces/single_exception.rb +57 -0
  33. data/lib/sentry/interfaces/stacktrace.rb +87 -0
  34. data/lib/sentry/interfaces/stacktrace_builder.rb +79 -0
  35. data/lib/sentry/interfaces/threads.rb +42 -0
  36. data/lib/sentry/linecache.rb +47 -0
  37. data/lib/sentry/logger.rb +20 -0
  38. data/lib/sentry/net/http.rb +115 -0
  39. data/lib/sentry/rack/capture_exceptions.rb +80 -0
  40. data/lib/sentry/rack.rb +5 -0
  41. data/lib/sentry/rake.rb +41 -0
  42. data/lib/sentry/redis.rb +90 -0
  43. data/lib/sentry/release_detector.rb +39 -0
  44. data/lib/sentry/scope.rb +295 -0
  45. data/lib/sentry/session.rb +35 -0
  46. data/lib/sentry/session_flusher.rb +90 -0
  47. data/lib/sentry/span.rb +226 -0
  48. data/lib/sentry/test_helper.rb +76 -0
  49. data/lib/sentry/transaction.rb +206 -0
  50. data/lib/sentry/transaction_event.rb +29 -0
  51. data/lib/sentry/transport/configuration.rb +25 -0
  52. data/lib/sentry/transport/dummy_transport.rb +21 -0
  53. data/lib/sentry/transport/http_transport.rb +175 -0
  54. data/lib/sentry/transport.rb +210 -0
  55. data/lib/sentry/utils/argument_checking_helper.rb +13 -0
  56. data/lib/sentry/utils/custom_inspection.rb +14 -0
  57. data/lib/sentry/utils/exception_cause_chain.rb +20 -0
  58. data/lib/sentry/utils/logging_helper.rb +26 -0
  59. data/lib/sentry/utils/real_ip.rb +84 -0
  60. data/lib/sentry/utils/request_id.rb +18 -0
  61. data/lib/sentry/version.rb +5 -0
  62. data/lib/sentry-ruby.rb +505 -0
  63. data/sentry-ruby-core.gemspec +23 -0
  64. data/sentry-ruby.gemspec +24 -0
  65. metadata +64 -16
@@ -0,0 +1,505 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "English"
4
+ require "forwardable"
5
+ require "time"
6
+
7
+ require "sentry/version"
8
+ require "sentry/exceptions"
9
+ require "sentry/core_ext/object/deep_dup"
10
+ require "sentry/utils/argument_checking_helper"
11
+ require "sentry/utils/logging_helper"
12
+ require "sentry/configuration"
13
+ require "sentry/logger"
14
+ require "sentry/event"
15
+ require "sentry/error_event"
16
+ require "sentry/transaction_event"
17
+ require "sentry/span"
18
+ require "sentry/transaction"
19
+ require "sentry/hub"
20
+ require "sentry/background_worker"
21
+ require "sentry/session_flusher"
22
+
23
+ [
24
+ "sentry/rake",
25
+ "sentry/rack",
26
+ ].each do |lib|
27
+ begin
28
+ require lib
29
+ rescue LoadError
30
+ end
31
+ end
32
+
33
+ module Sentry
34
+ META = { "name" => "sentry.ruby", "version" => Sentry::VERSION }.freeze
35
+
36
+ CAPTURED_SIGNATURE = :@__sentry_captured
37
+
38
+ LOGGER_PROGNAME = "sentry".freeze
39
+
40
+ SENTRY_TRACE_HEADER_NAME = "sentry-trace".freeze
41
+
42
+ THREAD_LOCAL = :sentry_hub
43
+
44
+ class << self
45
+ # @!visibility private
46
+ def exception_locals_tp
47
+ @exception_locals_tp ||= TracePoint.new(:raise) do |tp|
48
+ exception = tp.raised_exception
49
+
50
+ # don't collect locals again if the exception is re-raised
51
+ next if exception.instance_variable_get(:@sentry_locals)
52
+ next unless tp.binding
53
+
54
+ locals = tp.binding.local_variables.each_with_object({}) do |local, result|
55
+ result[local] = tp.binding.local_variable_get(local)
56
+ end
57
+
58
+ exception.instance_variable_set(:@sentry_locals, locals)
59
+ end
60
+ end
61
+
62
+ # @!attribute [rw] background_worker
63
+ # @return [BackgroundWorker, nil]
64
+ attr_accessor :background_worker
65
+
66
+ # @!attribute [r] session_flusher
67
+ # @return [SessionFlusher, nil]
68
+ attr_reader :session_flusher
69
+
70
+ ##### Patch Registration #####
71
+
72
+ # @!visibility private
73
+ def register_patch(&block)
74
+ registered_patches << block
75
+ end
76
+
77
+ # @!visibility private
78
+ def apply_patches(config)
79
+ registered_patches.each do |patch|
80
+ patch.call(config)
81
+ end
82
+ end
83
+
84
+ # @!visibility private
85
+ def registered_patches
86
+ @registered_patches ||= []
87
+ end
88
+
89
+ ##### Integrations #####
90
+
91
+ # Returns a hash that contains all the integrations that have been registered to the main SDK.
92
+ #
93
+ # @return [Hash{String=>Hash}]
94
+ def integrations
95
+ @integrations ||= {}
96
+ end
97
+
98
+ # Registers the SDK integration with its name and version.
99
+ #
100
+ # @param name [String] name of the integration
101
+ # @param version [String] version of the integration
102
+ def register_integration(name, version)
103
+ if initialized?
104
+ logger.warn(LOGGER_PROGNAME) do
105
+ <<~MSG
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.
107
+ MSG
108
+ end
109
+ end
110
+
111
+ meta = { name: "sentry.ruby.#{name}", version: version }.freeze
112
+ integrations[name.to_s] = meta
113
+ end
114
+
115
+ ##### Method Delegation #####
116
+
117
+ extend Forwardable
118
+
119
+ # @!macro [new] configuration
120
+ # The Configuration object that's used for configuring the client and its transport.
121
+ # @return [Configuration]
122
+ # @!macro [new] send_event
123
+ # Sends the event to Sentry.
124
+ # @param event [Event] the event to be sent.
125
+ # @param hint [Hash] the hint data that'll be passed to `before_send` callback.
126
+ # @return [Event]
127
+
128
+ # @!method configuration
129
+ # @!macro configuration
130
+ def configuration
131
+ return unless initialized?
132
+ get_current_client.configuration
133
+ end
134
+
135
+ # @!method send_event
136
+ # @!macro send_event
137
+ def send_event(*args)
138
+ return unless initialized?
139
+ get_current_client.send_event(*args)
140
+ end
141
+
142
+ # @!macro [new] set_extras
143
+ # Updates the scope's extras attribute by merging with the old value.
144
+ # @param extras [Hash]
145
+ # @return [Hash]
146
+ # @!macro [new] set_user
147
+ # Sets the scope's user attribute.
148
+ # @param user [Hash]
149
+ # @return [Hash]
150
+ # @!macro [new] set_context
151
+ # Adds a new key-value pair to current contexts.
152
+ # @param key [String, Symbol]
153
+ # @param value [Object]
154
+ # @return [Hash]
155
+ # @!macro [new] set_tags
156
+ # Updates the scope's tags attribute by merging with the old value.
157
+ # @param tags [Hash]
158
+ # @return [Hash]
159
+
160
+ # @!method set_tags
161
+ # @!macro set_tags
162
+ def set_tags(*args)
163
+ return unless initialized?
164
+ get_current_scope.set_tags(*args)
165
+ end
166
+
167
+ # @!method set_extras
168
+ # @!macro set_extras
169
+ def set_extras(*args)
170
+ return unless initialized?
171
+ get_current_scope.set_extras(*args)
172
+ end
173
+
174
+ # @!method set_user
175
+ # @!macro set_user
176
+ def set_user(*args)
177
+ return unless initialized?
178
+ get_current_scope.set_user(*args)
179
+ end
180
+
181
+ # @!method set_context
182
+ # @!macro set_context
183
+ def set_context(*args)
184
+ return unless initialized?
185
+ get_current_scope.set_context(*args)
186
+ end
187
+
188
+ ##### Main APIs #####
189
+
190
+ # Initializes the SDK with given configuration.
191
+ #
192
+ # @yieldparam config [Configuration]
193
+ # @return [void]
194
+ def init(&block)
195
+ config = Configuration.new
196
+ yield(config) if block_given?
197
+ config.detect_release
198
+ apply_patches(config)
199
+ client = Client.new(config)
200
+ scope = Scope.new(max_breadcrumbs: config.max_breadcrumbs)
201
+ hub = Hub.new(client, scope)
202
+ Thread.current.thread_variable_set(THREAD_LOCAL, hub)
203
+ @main_hub = hub
204
+ @background_worker = Sentry::BackgroundWorker.new(config)
205
+
206
+ @session_flusher = if config.auto_session_tracking
207
+ Sentry::SessionFlusher.new(config, client)
208
+ else
209
+ nil
210
+ end
211
+
212
+ if config.capture_exception_frame_locals
213
+ exception_locals_tp.enable
214
+ end
215
+
216
+ at_exit { close }
217
+ end
218
+
219
+ # Flushes pending events and cleans up SDK state.
220
+ # SDK will stop sending events and all top-level APIs will be no-ops after this.
221
+ #
222
+ # @return [void]
223
+ def close
224
+ if @background_worker
225
+ @background_worker.shutdown
226
+ @background_worker = nil
227
+ end
228
+
229
+ if @session_flusher
230
+ @session_flusher.kill
231
+ @session_flusher = nil
232
+ end
233
+
234
+ if configuration&.capture_exception_frame_locals
235
+ exception_locals_tp.disable
236
+ end
237
+
238
+ @main_hub = nil
239
+ Thread.current.thread_variable_set(THREAD_LOCAL, nil)
240
+ end
241
+
242
+ # Returns true if the SDK is initialized.
243
+ #
244
+ # @return [Boolean]
245
+ def initialized?
246
+ !!get_main_hub
247
+ end
248
+
249
+ # Returns an uri for security policy reporting that's generated from the given DSN
250
+ # (To learn more about security policy reporting: https://docs.sentry.io/product/security-policy-reporting/)
251
+ #
252
+ # It returns nil if
253
+ # - The SDK is not initialized yet.
254
+ # - The DSN is not provided or is invalid.
255
+ #
256
+ # @return [String, nil]
257
+ def csp_report_uri
258
+ return unless initialized?
259
+ configuration.csp_report_uri
260
+ end
261
+
262
+ # Returns the main thread's active hub.
263
+ #
264
+ # @return [Hub]
265
+ def get_main_hub
266
+ @main_hub
267
+ end
268
+
269
+ # Takes an instance of Sentry::Breadcrumb and stores it to the current active scope.
270
+ #
271
+ # @return [Breadcrumb, nil]
272
+ def add_breadcrumb(breadcrumb, **options)
273
+ return unless initialized?
274
+ get_current_hub.add_breadcrumb(breadcrumb, **options)
275
+ end
276
+
277
+ # Returns the current active hub.
278
+ # If the current thread doesn't have an active hub, it will clone the main thread's active hub,
279
+ # stores it in the current thread, and then returns it.
280
+ #
281
+ # @return [Hub]
282
+ def get_current_hub
283
+ # we need to assign a hub to the current thread if it doesn't have one yet
284
+ #
285
+ # ideally, we should do this proactively whenever a new thread is created
286
+ # but it's impossible for the SDK to keep track every new thread
287
+ # so we need to use this rather passive way to make sure the app doesn't crash
288
+ Thread.current.thread_variable_get(THREAD_LOCAL) || clone_hub_to_current_thread
289
+ end
290
+
291
+ # Returns the current active client.
292
+ # @return [Client, nil]
293
+ def get_current_client
294
+ return unless initialized?
295
+ get_current_hub.current_client
296
+ end
297
+
298
+ # Returns the current active scope.
299
+ #
300
+ # @return [Scope, nil]
301
+ def get_current_scope
302
+ return unless initialized?
303
+ get_current_hub.current_scope
304
+ end
305
+
306
+ # Clones the main thread's active hub and stores it to the current thread.
307
+ #
308
+ # @return [void]
309
+ def clone_hub_to_current_thread
310
+ return unless initialized?
311
+ Thread.current.thread_variable_set(THREAD_LOCAL, get_main_hub.clone)
312
+ end
313
+
314
+ # Takes a block and yields the current active scope.
315
+ #
316
+ # @example
317
+ # Sentry.configure_scope do |scope|
318
+ # scope.set_tags(foo: "bar")
319
+ # end
320
+ #
321
+ # Sentry.capture_message("test message") # this event will have tags { foo: "bar" }
322
+ #
323
+ # @yieldparam scope [Scope]
324
+ # @return [void]
325
+ def configure_scope(&block)
326
+ return unless initialized?
327
+ get_current_hub.configure_scope(&block)
328
+ end
329
+
330
+ # Takes a block and yields a temporary scope.
331
+ # The temporary scope will inherit all the attributes from the current active scope and replace it to be the active
332
+ # scope inside the block.
333
+ #
334
+ # @example
335
+ # Sentry.configure_scope do |scope|
336
+ # scope.set_tags(foo: "bar")
337
+ # end
338
+ #
339
+ # Sentry.capture_message("test message") # this event will have tags { foo: "bar" }
340
+ #
341
+ # Sentry.with_scope do |temp_scope|
342
+ # temp_scope.set_tags(foo: "baz")
343
+ # Sentry.capture_message("test message 2") # this event will have tags { foo: "baz" }
344
+ # end
345
+ #
346
+ # Sentry.capture_message("test message 3") # this event will have tags { foo: "bar" }
347
+ #
348
+ # @yieldparam scope [Scope]
349
+ # @return [void]
350
+ def with_scope(&block)
351
+ return unless initialized?
352
+ get_current_hub.with_scope(&block)
353
+ end
354
+
355
+ # Wrap a given block with session tracking.
356
+ # Aggregate sessions in minutely buckets will be recorded
357
+ # around this block and flushed every minute.
358
+ #
359
+ # @example
360
+ # Sentry.with_session_tracking do
361
+ # a = 1 + 1 # new session recorded with :exited status
362
+ # end
363
+ #
364
+ # Sentry.with_session_tracking do
365
+ # 1 / 0
366
+ # rescue => e
367
+ # Sentry.capture_exception(e) # new session recorded with :errored status
368
+ # end
369
+ # @return [void]
370
+ def with_session_tracking(&block)
371
+ return yield unless initialized?
372
+ get_current_hub.with_session_tracking(&block)
373
+ end
374
+
375
+ # Takes an exception and reports it to Sentry via the currently active hub.
376
+ #
377
+ # @yieldparam scope [Scope]
378
+ # @return [Event, nil]
379
+ def capture_exception(exception, **options, &block)
380
+ return unless initialized?
381
+ get_current_hub.capture_exception(exception, **options, &block)
382
+ end
383
+
384
+ # Takes a block and evaluates it. If the block raised an exception, it reports the exception to Sentry and re-raises it.
385
+ # If the block ran without exception, it returns the evaluation result.
386
+ #
387
+ # @example
388
+ # Sentry.with_exception_captured do
389
+ # 1/1 #=> 1 will be returned
390
+ # end
391
+ #
392
+ # Sentry.with_exception_captured do
393
+ # 1/0 #=> ZeroDivisionError will be reported and re-raised
394
+ # end
395
+ #
396
+ def with_exception_captured(**options, &block)
397
+ yield
398
+ rescue Exception => e
399
+ capture_exception(e, **options)
400
+ raise
401
+ end
402
+
403
+ # Takes a message string and reports it to Sentry via the currently active hub.
404
+ #
405
+ # @yieldparam scope [Scope]
406
+ # @return [Event, nil]
407
+ def capture_message(message, **options, &block)
408
+ return unless initialized?
409
+ get_current_hub.capture_message(message, **options, &block)
410
+ end
411
+
412
+ # Takes an instance of Sentry::Event and dispatches it to the currently active hub.
413
+ #
414
+ # @return [Event, nil]
415
+ def capture_event(event)
416
+ return unless initialized?
417
+ get_current_hub.capture_event(event)
418
+ end
419
+
420
+ # Takes or initializes a new Sentry::Transaction and makes a sampling decision for it.
421
+ #
422
+ # @return [Transaction, nil]
423
+ def start_transaction(**options)
424
+ return unless initialized?
425
+ get_current_hub.start_transaction(**options)
426
+ end
427
+
428
+ # Records the block's execution as a child of the current span.
429
+ # If the current scope doesn't have a span, the block would still be executed but the yield param will be nil.
430
+ # @param attributes [Hash] attributes for the child span.
431
+ # @yieldparam child_span [Span, nil]
432
+ # @return yield result
433
+ #
434
+ # @example
435
+ # Sentry.with_child_span(op: "my operation") do |child_span|
436
+ # child_span.set_data(operation_data)
437
+ # child_span.set_description(operation_detail)
438
+ # # result will be returned
439
+ # end
440
+ #
441
+ def with_child_span(**attributes, &block)
442
+ if Sentry.initialized? && current_span = get_current_scope.get_span
443
+ result = nil
444
+
445
+ begin
446
+ current_span.with_child_span(**attributes) do |child_span|
447
+ get_current_scope.set_span(child_span)
448
+ result = yield(child_span)
449
+ end
450
+ ensure
451
+ get_current_scope.set_span(current_span)
452
+ end
453
+
454
+ result
455
+ else
456
+ yield(nil)
457
+ end
458
+ end
459
+
460
+ # Returns the id of the lastly reported Sentry::Event.
461
+ #
462
+ # @return [String, nil]
463
+ def last_event_id
464
+ return unless initialized?
465
+ get_current_hub.last_event_id
466
+ end
467
+
468
+ # Checks if the exception object has been captured by the SDK.
469
+ #
470
+ # @return [Boolean]
471
+ def exception_captured?(exc)
472
+ return false unless initialized?
473
+ !!exc.instance_variable_get(CAPTURED_SIGNATURE)
474
+ end
475
+
476
+ ##### Helpers #####
477
+
478
+ # @!visibility private
479
+ def sys_command(command)
480
+ result = `#{command} 2>&1` rescue nil
481
+ return if result.nil? || result.empty? || ($CHILD_STATUS && $CHILD_STATUS.exitstatus != 0)
482
+
483
+ result.strip
484
+ end
485
+
486
+ # @!visibility private
487
+ def logger
488
+ configuration.logger
489
+ end
490
+
491
+ # @!visibility private
492
+ def sdk_meta
493
+ META
494
+ end
495
+
496
+ # @!visibility private
497
+ def utc_now
498
+ Time.now.utc
499
+ end
500
+ end
501
+ end
502
+
503
+ # patches
504
+ require "sentry/net/http"
505
+ require "sentry/redis"
@@ -0,0 +1,23 @@
1
+ require_relative "lib/sentry/version"
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "sentry-ruby-core"
5
+ spec.version = Sentry::VERSION
6
+ spec.authors = ["Sentry Team"]
7
+ spec.description = spec.summary = "A gem that provides a client interface for the Sentry error logger"
8
+ spec.email = "accounts@sentry.io"
9
+ spec.license = 'MIT'
10
+ spec.homepage = "https://github.com/getsentry/sentry-ruby"
11
+
12
+ spec.platform = Gem::Platform::RUBY
13
+ spec.required_ruby_version = '>= 2.4'
14
+ spec.extra_rdoc_files = ["README.md", "LICENSE.txt"]
15
+ spec.files = `git ls-files | grep -Ev '^(spec|benchmarks|examples)'`.split("\n")
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = spec.homepage
19
+ spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/master/CHANGELOG.md"
20
+
21
+ spec.add_dependency "sentry-ruby", Sentry::VERSION
22
+ spec.add_dependency "concurrent-ruby"
23
+ end
@@ -0,0 +1,24 @@
1
+ require_relative "lib/sentry/version"
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "sentry-ruby"
5
+ spec.version = Sentry::VERSION
6
+ spec.authors = ["Sentry Team"]
7
+ spec.description = spec.summary = "A gem that provides a client interface for the Sentry error logger"
8
+ spec.email = "accounts@sentry.io"
9
+ spec.license = 'MIT'
10
+ spec.homepage = "https://github.com/getsentry/sentry-ruby"
11
+
12
+ spec.platform = Gem::Platform::RUBY
13
+ spec.required_ruby_version = '>= 2.4'
14
+ spec.extra_rdoc_files = ["README.md", "LICENSE.txt"]
15
+ spec.files = `git ls-files | grep -Ev '^(spec|benchmarks|examples)'`.split("\n")
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = spec.homepage
19
+ spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/master/CHANGELOG.md"
20
+
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_dependency "concurrent-ruby", '~> 1.0', '>= 1.0.2'
24
+ end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sentry-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 5.4.2
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-02-10 00:00:00.000000000 Z
11
+ date: 2022-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: sentry-ruby-core
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - '='
18
- - !ruby/object:Gem::Version
19
- version: 5.1.0
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - '='
25
- - !ruby/object:Gem::Version
26
- version: 5.1.0
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: concurrent-ruby
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -52,8 +38,70 @@ extra_rdoc_files:
52
38
  - README.md
53
39
  - LICENSE.txt
54
40
  files:
41
+ - ".gitignore"
42
+ - ".rspec"
43
+ - ".yardopts"
44
+ - CHANGELOG.md
45
+ - CODE_OF_CONDUCT.md
46
+ - Gemfile
55
47
  - LICENSE.txt
48
+ - Makefile
56
49
  - README.md
50
+ - Rakefile
51
+ - bin/console
52
+ - bin/setup
53
+ - lib/sentry-ruby.rb
54
+ - lib/sentry/background_worker.rb
55
+ - lib/sentry/backtrace.rb
56
+ - lib/sentry/breadcrumb.rb
57
+ - lib/sentry/breadcrumb/sentry_logger.rb
58
+ - lib/sentry/breadcrumb_buffer.rb
59
+ - lib/sentry/client.rb
60
+ - lib/sentry/configuration.rb
61
+ - lib/sentry/core_ext/object/deep_dup.rb
62
+ - lib/sentry/core_ext/object/duplicable.rb
63
+ - lib/sentry/dsn.rb
64
+ - lib/sentry/envelope.rb
65
+ - lib/sentry/error_event.rb
66
+ - lib/sentry/event.rb
67
+ - lib/sentry/exceptions.rb
68
+ - lib/sentry/hub.rb
69
+ - lib/sentry/integrable.rb
70
+ - lib/sentry/interface.rb
71
+ - lib/sentry/interfaces/exception.rb
72
+ - lib/sentry/interfaces/request.rb
73
+ - lib/sentry/interfaces/single_exception.rb
74
+ - lib/sentry/interfaces/stacktrace.rb
75
+ - lib/sentry/interfaces/stacktrace_builder.rb
76
+ - lib/sentry/interfaces/threads.rb
77
+ - lib/sentry/linecache.rb
78
+ - lib/sentry/logger.rb
79
+ - lib/sentry/net/http.rb
80
+ - lib/sentry/rack.rb
81
+ - lib/sentry/rack/capture_exceptions.rb
82
+ - lib/sentry/rake.rb
83
+ - lib/sentry/redis.rb
84
+ - lib/sentry/release_detector.rb
85
+ - lib/sentry/scope.rb
86
+ - lib/sentry/session.rb
87
+ - lib/sentry/session_flusher.rb
88
+ - lib/sentry/span.rb
89
+ - lib/sentry/test_helper.rb
90
+ - lib/sentry/transaction.rb
91
+ - lib/sentry/transaction_event.rb
92
+ - lib/sentry/transport.rb
93
+ - lib/sentry/transport/configuration.rb
94
+ - lib/sentry/transport/dummy_transport.rb
95
+ - lib/sentry/transport/http_transport.rb
96
+ - lib/sentry/utils/argument_checking_helper.rb
97
+ - lib/sentry/utils/custom_inspection.rb
98
+ - lib/sentry/utils/exception_cause_chain.rb
99
+ - lib/sentry/utils/logging_helper.rb
100
+ - lib/sentry/utils/real_ip.rb
101
+ - lib/sentry/utils/request_id.rb
102
+ - lib/sentry/version.rb
103
+ - sentry-ruby-core.gemspec
104
+ - sentry-ruby.gemspec
57
105
  homepage: https://github.com/getsentry/sentry-ruby
58
106
  licenses:
59
107
  - MIT