Skip to content

Commit 0923d03

Browse files
authored
ref(profiling): Do not error if already setup (#1731)
We currently error if profiling is already setup which can be error prone depending on the end user's setup. This change ensures that we only setup profiling once and once setup, it's reused.
1 parent e6238d8 commit 0923d03

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

sentry_sdk/profiler.py

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from sentry_sdk.utils import (
3232
filename_for_module,
3333
handle_in_app_impl,
34+
logger,
3435
nanosecond_time,
3536
)
3637

@@ -92,7 +93,6 @@
9293
)
9394

9495

95-
_sample_buffer = None # type: Optional[SampleBuffer]
9696
_scheduler = None # type: Optional[Scheduler]
9797

9898

@@ -103,33 +103,33 @@ def setup_profiler(options):
103103
`buffer_secs` determines the max time a sample will be buffered for
104104
`frequency` determines the number of samples to take per second (Hz)
105105
"""
106-
buffer_secs = 30
107-
frequency = 101
108106

109-
if not PY33:
110-
from sentry_sdk.utils import logger
107+
global _scheduler
111108

112-
logger.warn("profiling is only supported on Python >= 3.3")
109+
if _scheduler is not None:
110+
logger.debug("profiling is already setup")
113111
return
114112

115-
global _sample_buffer
116-
global _scheduler
113+
if not PY33:
114+
logger.warn("profiling is only supported on Python >= 3.3")
115+
return
117116

118-
assert _sample_buffer is None and _scheduler is None
117+
buffer_secs = 30
118+
frequency = 101
119119

120120
# To buffer samples for `buffer_secs` at `frequency` Hz, we need
121121
# a capcity of `buffer_secs * frequency`.
122-
_sample_buffer = SampleBuffer(capacity=buffer_secs * frequency)
122+
buffer = SampleBuffer(capacity=buffer_secs * frequency)
123123

124124
profiler_mode = options["_experiments"].get("profiler_mode", SleepScheduler.mode)
125125
if profiler_mode == SigprofScheduler.mode:
126-
_scheduler = SigprofScheduler(sample_buffer=_sample_buffer, frequency=frequency)
126+
_scheduler = SigprofScheduler(sample_buffer=buffer, frequency=frequency)
127127
elif profiler_mode == SigalrmScheduler.mode:
128-
_scheduler = SigalrmScheduler(sample_buffer=_sample_buffer, frequency=frequency)
128+
_scheduler = SigalrmScheduler(sample_buffer=buffer, frequency=frequency)
129129
elif profiler_mode == SleepScheduler.mode:
130-
_scheduler = SleepScheduler(sample_buffer=_sample_buffer, frequency=frequency)
130+
_scheduler = SleepScheduler(sample_buffer=buffer, frequency=frequency)
131131
elif profiler_mode == EventScheduler.mode:
132-
_scheduler = EventScheduler(sample_buffer=_sample_buffer, frequency=frequency)
132+
_scheduler = EventScheduler(sample_buffer=buffer, frequency=frequency)
133133
else:
134134
raise ValueError("Unknown profiler mode: {}".format(profiler_mode))
135135
_scheduler.setup()
@@ -140,13 +140,11 @@ def setup_profiler(options):
140140
def teardown_profiler():
141141
# type: () -> None
142142

143-
global _sample_buffer
144143
global _scheduler
145144

146145
if _scheduler is not None:
147146
_scheduler.teardown()
148147

149-
_sample_buffer = None
150148
_scheduler = None
151149

152150

@@ -728,7 +726,7 @@ def _should_profile(transaction, hub):
728726
return False
729727

730728
# The profiler hasn't been properly initialized.
731-
if _sample_buffer is None or _scheduler is None:
729+
if _scheduler is None:
732730
return False
733731

734732
hub = hub or sentry_sdk.Hub.current

0 commit comments

Comments
 (0)