sentry-ruby 7.0.0 → 7.1.0

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/gemfiles/ruby-2.7_rack-2_redis-4.gemfile.lock +6 -6
  3. data/gemfiles/ruby-2.7_rack-3.1_redis-4.gemfile.lock +6 -6
  4. data/gemfiles/ruby-2.7_rack-3_redis-4.gemfile.lock +6 -6
  5. data/gemfiles/ruby-3.0_rack-2_redis-4.gemfile.lock +8 -8
  6. data/gemfiles/ruby-3.0_rack-3.1_redis-4.gemfile.lock +8 -8
  7. data/gemfiles/ruby-3.0_rack-3_redis-4.gemfile.lock +8 -8
  8. data/gemfiles/ruby-3.1_rack-2_redis-4.gemfile.lock +16 -16
  9. data/gemfiles/ruby-3.1_rack-3.1_redis-4.gemfile.lock +16 -16
  10. data/gemfiles/ruby-3.1_rack-3_redis-4.gemfile.lock +16 -16
  11. data/gemfiles/ruby-3.2_rack-0_redis-5.gemfile.lock +16 -16
  12. data/gemfiles/ruby-3.2_rack-2_redis-4.gemfile.lock +16 -16
  13. data/gemfiles/ruby-3.2_rack-2_redis-5.gemfile.lock +16 -16
  14. data/gemfiles/ruby-3.2_rack-3.1_redis-4.gemfile.lock +16 -16
  15. data/gemfiles/ruby-3.2_rack-3_redis-4.gemfile.lock +16 -16
  16. data/gemfiles/ruby-3.2_rack-3_redis-5.gemfile.lock +16 -16
  17. data/gemfiles/ruby-3.3_rack-2_redis-4.gemfile.lock +18 -18
  18. data/gemfiles/ruby-3.3_rack-3.1_redis-4.gemfile.lock +18 -18
  19. data/gemfiles/ruby-3.3_rack-3.1_redis-5.3.gemfile.lock +18 -18
  20. data/gemfiles/ruby-3.3_rack-3_redis-4.gemfile.lock +18 -18
  21. data/gemfiles/ruby-3.4_rack-2_redis-4.gemfile.lock +18 -18
  22. data/gemfiles/ruby-3.4_rack-3.1_redis-4.gemfile.lock +18 -18
  23. data/gemfiles/ruby-3.4_rack-3.1_redis-5.3.gemfile.lock +18 -18
  24. data/gemfiles/ruby-3.4_rack-3_redis-4.gemfile.lock +18 -18
  25. data/gemfiles/ruby-4.0_rack-2_redis-4.gemfile.lock +18 -18
  26. data/gemfiles/ruby-4.0_rack-3.1_redis-4.gemfile.lock +18 -18
  27. data/gemfiles/ruby-4.0_rack-3_redis-4.gemfile.lock +18 -18
  28. data/gemfiles/ruby-jruby-9.4.14.0_rack-2_redis-4.gemfile.lock +18 -18
  29. data/gemfiles/ruby-jruby-9.4.14.0_rack-3.1_redis-4.gemfile.lock +18 -18
  30. data/gemfiles/ruby-jruby-9.4.14.0_rack-3_redis-4.gemfile.lock +18 -18
  31. data/lib/sentry/backtrace.rb +10 -1
  32. data/lib/sentry/client.rb +19 -6
  33. data/lib/sentry/configuration.rb +1 -1
  34. data/lib/sentry/faraday.rb +4 -1
  35. data/lib/sentry/hub.rb +9 -2
  36. data/lib/sentry/integrable.rb +12 -0
  37. data/lib/sentry/log_event_buffer.rb +1 -1
  38. data/lib/sentry/metric_event.rb +4 -2
  39. data/lib/sentry/metric_event_buffer.rb +1 -1
  40. data/lib/sentry/metrics.rb +12 -6
  41. data/lib/sentry/scope.rb +7 -3
  42. data/lib/sentry/session_flusher.rb +7 -0
  43. data/lib/sentry/std_lib_logger.rb +8 -2
  44. data/lib/sentry/telemetry_event_buffer.rb +57 -31
  45. data/lib/sentry/test_helper.rb +4 -0
  46. data/lib/sentry/threaded_periodic_worker.rb +90 -13
  47. data/lib/sentry/transaction.rb +7 -1
  48. data/lib/sentry/utils/callback_helper.rb +27 -0
  49. data/lib/sentry/version.rb +1 -1
  50. data/lib/sentry-ruby.rb +3 -0
  51. metadata +7 -6
@@ -4,41 +4,118 @@ module Sentry
4
4
  class ThreadedPeriodicWorker
5
5
  include LoggingHelper
6
6
 
7
+ # @!visibility private
8
+ attr_reader :thread, :thread_mutex, :idle_condition
9
+
7
10
  def initialize(sdk_logger, interval)
11
+ @process_id = Process.pid
8
12
  @thread = nil
9
13
  @exited = false
10
14
  @interval = interval
11
15
  @sdk_logger = sdk_logger
16
+
17
+ @thread_mutex = Mutex.new
18
+ @wake_condition = ConditionVariable.new
19
+ @idle_condition = ConditionVariable.new
20
+
21
+ @woken = false
22
+ @running = false
12
23
  end
13
24
 
14
25
  def ensure_thread
15
- return false if @exited
16
- return true if @thread&.alive?
26
+ reset_if_forked
17
27
 
18
- @thread = Thread.new do
19
- loop do
20
- sleep(@interval)
21
- run
22
- end
23
- end
28
+ @thread_mutex.synchronize do
29
+ return false if @exited
30
+ return true if @thread&.alive?
24
31
 
25
- true
32
+ @thread = Thread.new { worker_loop }
33
+
34
+ true
35
+ end
26
36
  rescue ThreadError
37
+ @thread_mutex.synchronize { @exited = true }
27
38
  log_debug("[#{self.class.name}] thread creation failed")
28
- @exited = true
29
39
  false
30
40
  end
31
41
 
42
+ def wake
43
+ @thread_mutex.synchronize do
44
+ next false if @exited
45
+
46
+ @woken = true
47
+ @wake_condition.signal
48
+ true
49
+ end
50
+ end
51
+
52
+ def wait_until_idle(timeout = nil)
53
+ deadline = Process.clock_gettime(Process::CLOCK_MONOTONIC) + timeout if timeout
54
+
55
+ @thread_mutex.synchronize do
56
+ while !@exited && (@running || @woken)
57
+ remaining = deadline - Process.clock_gettime(Process::CLOCK_MONOTONIC) if deadline
58
+ return false if remaining && remaining <= 0
59
+
60
+ @idle_condition.wait(@thread_mutex, remaining)
61
+ end
62
+
63
+ true
64
+ end
65
+ end
66
+
32
67
  def kill
33
- @exited = true
68
+ thread = @thread_mutex.synchronize do
69
+ @exited = true
70
+ @woken = false
71
+ @idle_condition.broadcast
72
+ @thread
73
+ end
34
74
 
35
75
  # Only a started worker has a thread to kill (and to log about).
36
76
  # Guarding here keeps a never-started worker's teardown silent, so
37
77
  # killing one during test reset can't emit a stray debug line.
38
- return unless @thread
78
+ return unless thread
39
79
 
40
80
  log_debug("[#{self.class.name}] thread killed")
41
- @thread.kill
81
+ thread.kill
82
+ end
83
+
84
+ private
85
+
86
+ def reset_if_forked
87
+ return false if @process_id == Process.pid
88
+
89
+ @process_id = Process.pid
90
+ @thread = nil
91
+ @exited = false
92
+ @woken = false
93
+ @running = false
94
+ @thread_mutex = Mutex.new
95
+ @wake_condition = ConditionVariable.new
96
+ @idle_condition = ConditionVariable.new
97
+ true
98
+ end
99
+
100
+ def worker_loop
101
+ loop do
102
+ @thread_mutex.synchronize do
103
+ @wake_condition.wait(@thread_mutex, @interval) unless @woken
104
+ @woken = false
105
+ @running = true
106
+ end
107
+
108
+ begin
109
+ run
110
+ rescue Exception => e
111
+ log_error("[#{self.class.name}] run failed", e)
112
+ ensure
113
+ @thread_mutex.synchronize do
114
+ @running = false
115
+ @idle_condition.broadcast
116
+ end
117
+ end
118
+ end
42
119
  end
43
120
  end
44
121
  end
@@ -14,6 +14,7 @@ module Sentry
14
14
  SOURCES = %i[custom url route view component task]
15
15
 
16
16
  include LoggingHelper
17
+ include CallbackHelper
17
18
 
18
19
  # The name of the transaction.
19
20
  # @return [String]
@@ -142,7 +143,12 @@ module Sentry
142
143
 
143
144
  sample_rate =
144
145
  if configuration.traces_sampler.is_a?(Proc)
145
- configuration.traces_sampler.call(sampling_context)
146
+ safe_dispatch_callback(
147
+ "traces_sampler",
148
+ configuration.traces_sampler,
149
+ [sampling_context],
150
+ fallback: configuration.traces_sample_rate
151
+ )
146
152
  elsif !sampling_context[:parent_sampled].nil?
147
153
  sampling_context[:parent_sampled]
148
154
  else
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sentry
4
+ # @private
5
+ module CallbackHelper
6
+ # @!visibility private
7
+ def safe_dispatch_callback(callback_name, callback, args, fallback: nil)
8
+ callback.call(*args)
9
+ rescue => e
10
+ log_callback_error(callback_name, e)
11
+ fallback
12
+ end
13
+
14
+ private
15
+
16
+ def log_callback_error(callback_name, exception)
17
+ return unless Sentry.initialized?
18
+
19
+ message = "Error in #{callback_name} callback: #{exception.message}"
20
+ message += "\n#{exception.backtrace.join("\n")}" if Sentry.configuration.debug && exception.backtrace
21
+
22
+ Sentry.sdk_logger.error(LOGGER_PROGNAME) { message }
23
+ rescue StandardError
24
+ # Callback error reporting must not propagate to the application.
25
+ end
26
+ end
27
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sentry
4
- VERSION = "7.0.0"
4
+ VERSION = "7.1.0"
5
5
  end
data/lib/sentry-ruby.rb CHANGED
@@ -10,6 +10,7 @@ require "sentry/core_ext/object/deep_dup"
10
10
  require "sentry/utils/argument_checking_helper"
11
11
  require "sentry/utils/encoding_helper"
12
12
  require "sentry/utils/logging_helper"
13
+ require "sentry/utils/callback_helper"
13
14
  require "sentry/utils/sample_rand"
14
15
  require "sentry/configuration"
15
16
  require "sentry/structured_logger"
@@ -300,6 +301,8 @@ module Sentry
300
301
  if client = get_current_client
301
302
  client.configuration.run_after_close_callbacks
302
303
  client.flush
304
+ client.log_event_buffer.kill
305
+ client.metric_event_buffer.kill
303
306
 
304
307
  if client.configuration.data_collection.collect_stack_frame_variables?
305
308
  exception_locals_tp.disable
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sentry-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.0
4
+ version: 7.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sentry Team
@@ -185,6 +185,7 @@ files:
185
185
  - lib/sentry/transport/http_transport.rb
186
186
  - lib/sentry/transport/spotlight_transport.rb
187
187
  - lib/sentry/utils/argument_checking_helper.rb
188
+ - lib/sentry/utils/callback_helper.rb
188
189
  - lib/sentry/utils/custom_inspection.rb
189
190
  - lib/sentry/utils/encoding_helper.rb
190
191
  - lib/sentry/utils/env_helper.rb
@@ -202,15 +203,15 @@ files:
202
203
  - lib/sentry/version.rb
203
204
  - sentry-ruby-core.gemspec
204
205
  - sentry-ruby.gemspec
205
- homepage: https://github.com/getsentry/sentry-ruby/tree/7.0.0/sentry-ruby
206
+ homepage: https://github.com/getsentry/sentry-ruby/tree/7.1.0/sentry-ruby
206
207
  licenses:
207
208
  - MIT
208
209
  metadata:
209
- homepage_uri: https://github.com/getsentry/sentry-ruby/tree/7.0.0/sentry-ruby
210
- source_code_uri: https://github.com/getsentry/sentry-ruby/tree/7.0.0/sentry-ruby
211
- changelog_uri: https://github.com/getsentry/sentry-ruby/blob/7.0.0/CHANGELOG.md
210
+ homepage_uri: https://github.com/getsentry/sentry-ruby/tree/7.1.0/sentry-ruby
211
+ source_code_uri: https://github.com/getsentry/sentry-ruby/tree/7.1.0/sentry-ruby
212
+ changelog_uri: https://github.com/getsentry/sentry-ruby/blob/7.1.0/CHANGELOG.md
212
213
  bug_tracker_uri: https://github.com/getsentry/sentry-ruby/issues
213
- documentation_uri: http://www.rubydoc.info/gems/sentry-ruby/7.0.0
214
+ documentation_uri: http://www.rubydoc.info/gems/sentry-ruby/7.1.0
214
215
  rdoc_options: []
215
216
  require_paths:
216
217
  - lib