Skip to content

Commit 48d593a

Browse files
committed
make imports lazy
1 parent 6acc2d8 commit 48d593a

File tree

3 files changed

+43
-23
lines changed

3 files changed

+43
-23
lines changed

ddtrace/debugging/_origin/span.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from dataclasses import dataclass
2-
from functools import partial
32
from itertools import count
43
import sys
54
from threading import current_thread
@@ -21,10 +20,8 @@
2120
from ddtrace.debugging._uploader import SignalUploader
2221
from ddtrace.debugging._uploader import UploaderProduct
2322
from ddtrace.ext import EXIT_SPAN_TYPES
24-
from ddtrace.internal import core
2523
from ddtrace.internal.compat import Path
2624
from ddtrace.internal.packages import is_user_code
27-
from ddtrace.internal.safety import _isinstance
2825
from ddtrace.internal.wrapping.context import WrappingContext
2926
from ddtrace.settings.code_origin import config as co_config
3027
from ddtrace.trace import Span
@@ -37,15 +34,6 @@ def frame_stack(frame: FrameType) -> t.Iterator[FrameType]:
3734
_frame = _frame.f_back
3835

3936

40-
def wrap_entrypoint(uploader: t.Type[SignalUploader], f: t.Callable) -> None:
41-
if not _isinstance(f, FunctionType):
42-
return
43-
44-
_f = t.cast(FunctionType, f)
45-
if not EntrySpanWrappingContext.is_wrapped(_f):
46-
EntrySpanWrappingContext(uploader, _f).wrap()
47-
48-
4937
@dataclass
5038
class EntrySpanProbe(LogFunctionProbe):
5139
__span_class__ = "entry"
@@ -212,13 +200,6 @@ class SpanCodeOriginProcessorEntry:
212200
__context_wrapper__ = EntrySpanWrappingContext
213201

214202
_instance: t.Optional["SpanCodeOriginProcessorEntry"] = None
215-
_handler: t.Optional[t.Callable] = None
216-
217-
@classmethod
218-
def init(cls) -> None:
219-
# Register the entrypoint wrapping for entry spans
220-
cls._handler = handler = partial(wrap_entrypoint, cls.__uploader__)
221-
core.on("service_entrypoint.patch", handler)
222203

223204
@classmethod
224205
def enable(cls):
@@ -244,7 +225,6 @@ def disable(cls):
244225
# Unregister code origin for span with the snapshot uploader
245226
cls.__uploader__.unregister(UploaderProduct.CODE_ORIGIN_SPAN_ENTRY)
246227

247-
cls._handler = None
248228
cls._instance = None
249229

250230

ddtrace/debugging/_products/code_origin/span.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import enum
2+
from functools import partial
3+
import typing as t
24

3-
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorEntry
5+
import ddtrace.internal.core as core
46
from ddtrace.internal.products import manager as product_manager
57
from ddtrace.settings._core import ValueSource
68
from ddtrace.settings.code_origin import config
79

810

11+
if t.TYPE_CHECKING:
12+
from types import FunctionType
13+
14+
915
CO_ENABLED = "DD_CODE_ORIGIN_FOR_SPANS_ENABLED"
1016
DI_PRODUCT_KEY = "dynamic-instrumentation"
1117

@@ -18,13 +24,26 @@ def post_preload():
1824

1925

2026
def _start():
27+
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorEntry
28+
2129
SpanCodeOriginProcessorEntry.enable()
2230

2331

2432
def start():
2533
# We need to instrument the entrypoints on boot because this is the only
2634
# time the tracer will notify us of entrypoints being registered.
27-
SpanCodeOriginProcessorEntry.init()
35+
@partial(core.on, "service_entrypoint.patch")
36+
def _(f: t.Callable) -> None:
37+
from ddtrace.debugging._origin.span import EntrySpanWrappingContext
38+
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorEntry
39+
from ddtrace.internal.safety import _isinstance
40+
41+
if not _isinstance(f, FunctionType):
42+
return
43+
44+
_f = t.cast(FunctionType, f)
45+
if not EntrySpanWrappingContext.is_wrapped(_f):
46+
EntrySpanWrappingContext(SpanCodeOriginProcessorEntry.__uploader__, _f).wrap()
2847

2948
if config.span.enabled:
3049
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorExit
@@ -43,16 +62,21 @@ def restart(join=False):
4362

4463

4564
def _stop():
65+
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorEntry
66+
4667
SpanCodeOriginProcessorEntry.disable()
4768

4869

4970
def stop(join=False):
5071
if config.span.enabled:
72+
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorEntry
5173
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorExit
5274

5375
SpanCodeOriginProcessorEntry.disable()
5476
SpanCodeOriginProcessorExit.disable()
5577
elif product_manager.is_enabled(DI_PRODUCT_KEY):
78+
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorEntry
79+
5680
SpanCodeOriginProcessorEntry.disable()
5781

5882

tests/debugging/origin/test_span.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,36 @@
1+
from functools import partial
12
from pathlib import Path
3+
from types import FunctionType
24
import typing as t
35

46
import ddtrace
7+
from ddtrace.debugging._origin.span import EntrySpanWrappingContext
58
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorEntry
69
from ddtrace.debugging._origin.span import SpanCodeOriginProcessorExit
710
from ddtrace.debugging._session import Session
811
from ddtrace.ext import SpanTypes
912
from ddtrace.internal import core
13+
from ddtrace.internal.safety import _isinstance
1014
from tests.debugging.mocking import MockSignalUploader
1115
from tests.utils import TracerTestCase
1216

1317

1418
class MockSpanCodeOriginProcessorEntry(SpanCodeOriginProcessorEntry):
1519
__uploader__ = MockSignalUploader
1620

21+
@classmethod
22+
def enable(cls):
23+
super().enable()
24+
25+
@partial(core.on, "service_entrypoint.patch")
26+
def _(f: t.Callable) -> None:
27+
if not _isinstance(f, FunctionType):
28+
return
29+
30+
_f = t.cast(FunctionType, f)
31+
if not EntrySpanWrappingContext.is_wrapped(_f):
32+
EntrySpanWrappingContext(MockSignalUploader, _f).wrap()
33+
1734
@classmethod
1835
def get_uploader(cls) -> MockSignalUploader:
1936
return t.cast(MockSignalUploader, cls.__uploader__._instance)
@@ -33,7 +50,6 @@ def setUp(self):
3350
self.backup_tracer = ddtrace.tracer
3451
ddtrace.tracer = self.tracer
3552

36-
MockSpanCodeOriginProcessorEntry.init()
3753
MockSpanCodeOriginProcessorEntry.enable()
3854
MockSpanCodeOriginProcessor.enable()
3955

0 commit comments

Comments
 (0)