@@ -8,13 +8,14 @@ module Sentry
8
8
module Vernier
9
9
class Profiler
10
10
EMPTY_RESULT = { } . freeze
11
+ MUTEX = Mutex . new
11
12
12
- attr_reader :started , : event_id, :result
13
+ attr_reader :event_id , :result
13
14
14
15
def initialize ( configuration )
15
16
@event_id = SecureRandom . uuid . delete ( "-" )
16
17
17
- @started = false
18
+ @vernier_collector = nil
18
19
@sampled = nil
19
20
20
21
@profiling_enabled = defined? ( Vernier ) && configuration . profiling_enabled?
@@ -51,15 +52,28 @@ def set_initial_sample_decision(transaction_sampled)
51
52
log ( "Discarding profile due to sampling decision" ) unless @sampled
52
53
end
53
54
54
- def start
55
- return unless @sampled
56
- return if @started
55
+ def other_vernier_running?
56
+ MUTEX . synchronize do
57
+ @vernier_collector && vernier_collector_id != @vernier_collector . __id__
58
+ end
59
+ end
57
60
58
- @started = ::Vernier . start_profile
61
+ def this_vernier_running?
62
+ MUTEX . synchronize do
63
+ @vernier_collector && vernier_collector_id == @vernier_collector . __id__
64
+ end
65
+ end
59
66
60
- log ( "Started" )
67
+ def vernier_collector_id
68
+ Vernier . instance_variable_get ( :@collector ) . __id__ if Vernier . instance_variable_get ( :@collector )
69
+ end
61
70
62
- @started
71
+ def start
72
+ return if !@sampled || other_vernier_running?
73
+
74
+ @vernier_collector = ::Vernier . start_profile
75
+
76
+ log ( "Started with Vernier collector id: #{ vernier_collector_id } " )
63
77
rescue RuntimeError => e
64
78
# TODO: once Vernier raises something more dedicated, we should catch that instead
65
79
if e . message . include? ( "Profile already started" )
@@ -71,18 +85,18 @@ def start
71
85
72
86
def stop
73
87
return unless @sampled
74
- return unless @started
75
88
76
- @result = ::Vernier . stop_profile
77
- @started = false
89
+ @result = ::Vernier . stop_profile if this_vernier_running?
78
90
79
91
log ( "Stopped" )
80
- rescue RuntimeError => e
81
- if e . message . include? ( "Profile not started" )
82
- log ( "Not stopped since not started" )
83
- else
84
- log ( "Failed to stop Vernier: #{ e . message } " )
85
- end
92
+ # rescue RuntimeError => e
93
+ # if e.message.include?("Profile not started")
94
+ # log("Not stopped since not started")
95
+ # else
96
+ # log("Failed to stop Vernier: #{e.message}")
97
+ # end
98
+ ensure
99
+ @vernier_collector = nil
86
100
end
87
101
88
102
def active_thread_id
0 commit comments