Skip to content

Commit 287c115

Browse files
committed
fix: decouple entry/exit co span classes
1 parent bcdb1e4 commit 287c115

File tree

3 files changed

+27
-16
lines changed

3 files changed

+27
-16
lines changed

ddtrace/debugging/_origin/span.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -199,15 +199,15 @@ def __exit__(self, exc_type, exc_value, traceback):
199199
class SpanCodeOriginProcessorEntry:
200200
__uploader__ = LogsIntakeUploaderV1
201201

202-
_entry_instance: t.Optional["SpanCodeOriginProcessorEntry"] = None
202+
_instance: t.Optional["SpanCodeOriginProcessorEntry"] = None
203203
_handler: t.Optional[t.Callable] = None
204204

205205
@classmethod
206206
def enable(cls):
207-
if cls._entry_instance is not None:
207+
if cls._instance is not None:
208208
return
209209

210-
cls._entry_instance = cls()
210+
cls._instance = cls()
211211

212212
# Register code origin for span with the snapshot uploader
213213
cls.__uploader__.register(UploaderProduct.CODE_ORIGIN_SPAN)
@@ -218,7 +218,7 @@ def enable(cls):
218218

219219
@classmethod
220220
def disable(cls):
221-
if cls._entry_instance is None:
221+
if cls._instance is None:
222222
return
223223

224224
# Unregister the entrypoint wrapping for entry spans
@@ -227,11 +227,13 @@ def disable(cls):
227227
cls.__uploader__.unregister(UploaderProduct.CODE_ORIGIN_SPAN)
228228

229229
cls._handler = None
230-
cls._entry_instance = None
230+
cls._instance = None
231231

232232

233233
@dataclass
234-
class SpanCodeOriginProcessor(SpanCodeOriginProcessorEntry, SpanProcessor):
234+
class SpanCodeOriginProcessor(SpanProcessor):
235+
__uploader__ = LogsIntakeUploaderV1
236+
235237
_instance: t.Optional["SpanCodeOriginProcessor"] = None
236238

237239
def on_span_start(self, span: Span) -> None:
@@ -296,20 +298,19 @@ def enable(cls):
296298

297299
instance = cls._instance = cls()
298300

301+
# Register code origin for span with the snapshot uploader
302+
cls.__uploader__.register(UploaderProduct.CODE_ORIGIN_SPAN)
303+
299304
# Register the processor for exit spans
300305
instance.register()
301306

302-
# Enable entry spans. This is idempotent so multiple calls are safe if CO is enabled
303-
# after DI via remote configuration.
304-
super().enable()
305-
306307
@classmethod
307308
def disable(cls):
308309
if cls._instance is None:
309310
return
310311

311-
# Disable entry spans
312-
super().disable()
312+
# Unregister code origin for span with the snapshot uploader
313+
cls.__uploader__.unregister(UploaderProduct.CODE_ORIGIN_SPAN)
313314

314315
# Unregister the processor for exit spans
315316
cls._instance.unregister()

ddtrace/debugging/_products/code_origin/span.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ def post_preload():
1717
def start():
1818
if config.span.enabled:
1919
from ddtrace.debugging._origin.span import SpanCodeOriginProcessor
20+
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorEntry
2021

22+
SpanCodeOriginProcessorEntry.enable()
2123
SpanCodeOriginProcessor.enable()
2224
# If dynamic instrumentation is enabled, and code origin for spans is not explicitly disabled,
2325
# we'll enable entry spans only.
@@ -34,7 +36,9 @@ def restart(join=False):
3436
def stop(join=False):
3537
if config.span.enabled:
3638
from ddtrace.debugging._origin.span import SpanCodeOriginProcessor
39+
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorEntry
3740

41+
SpanCodeOriginProcessorEntry.disable()
3842
SpanCodeOriginProcessor.disable()
3943
elif product_manager.is_enabled(DI_PRODUCT_KEY):
4044
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorEntry

tests/debugging/origin/test_span.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,14 @@
1111
from tests.utils import TracerTestCase
1212

1313

14+
class MockSpanCodeOriginProcessorEntry(SpanCodeOriginProcessorEntry):
15+
__uploader__ = MockLogsIntakeUploaderV1
16+
17+
@classmethod
18+
def get_uploader(cls) -> MockLogsIntakeUploaderV1:
19+
return t.cast(MockLogsIntakeUploaderV1, cls.__uploader__._instance)
20+
21+
1422
class MockSpanCodeOriginProcessor(SpanCodeOriginProcessor):
1523
__uploader__ = MockLogsIntakeUploaderV1
1624

@@ -25,12 +33,14 @@ def setUp(self):
2533
self.backup_tracer = ddtrace.tracer
2634
ddtrace.tracer = self.tracer
2735

36+
MockSpanCodeOriginProcessorEntry.enable()
2837
MockSpanCodeOriginProcessor.enable()
2938

3039
def tearDown(self):
3140
ddtrace.tracer = self.backup_tracer
3241
super(SpanProbeTestCase, self).tearDown()
3342

43+
MockSpanCodeOriginProcessorEntry.disable()
3444
MockSpanCodeOriginProcessor.disable()
3545
core.reset_listeners(event_id="service_entrypoint.patch")
3646

@@ -108,14 +118,10 @@ def entry_call():
108118
def test_span_origin_entry(self):
109119
# Disable the processor to avoid interference with the test
110120
MockSpanCodeOriginProcessor.disable()
111-
core.reset_listeners(event_id="service_entrypoint.patch")
112121

113122
def entry_call():
114123
pass
115124

116-
# Enable entry spans directly
117-
SpanCodeOriginProcessorEntry.__uploader__ = MockLogsIntakeUploaderV1
118-
SpanCodeOriginProcessorEntry.enable()
119125
core.dispatch("service_entrypoint.patch", (entry_call,))
120126

121127
with self.tracer.trace("entry"):

0 commit comments

Comments
 (0)