sentry-ruby 5.3.0 → 5.4.1

Sign up to get free protection for your applications and to get access to all the features.
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 +7 -6
  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.3.0
4
+ version: 5.4.1
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-04-27 00:00:00.000000000 Z
11
+ date: 2022-07-26 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.3.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.3.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