diff --git a/.riot/requirements/16c3b9f.txt b/.riot/requirements/16c3b9f.txt
deleted file mode 100644
index ac3ccd42fa3..00000000000
--- a/.riot/requirements/16c3b9f.txt
+++ /dev/null
@@ -1,84 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.10
-# by the following command:
-#
-# pip-compile --allow-unsafe --no-annotate .riot/requirements/16c3b9f.in
-#
-ai21==3.0.1
-ai21-tokenizer==0.12.0
-aiohappyeyeballs==2.4.4
-aiohttp==3.11.10
-aiosignal==1.3.1
-anyio==4.7.0
-async-timeout==4.0.3
-attrs==24.2.0
-backoff==2.2.1
-certifi==2024.8.30
-charset-normalizer==3.4.0
-cohere==4.57
-coverage[toml]==7.6.9
-dataclasses-json==0.5.14
-dnspython==2.7.0
-exceptiongroup==1.2.2
-fastavro==1.9.7
-filelock==3.16.1
-frozenlist==1.5.0
-fsspec==2024.10.0
-greenlet==3.0.3
-h11==0.14.0
-httpcore==1.0.7
-httpx==0.27.2
-huggingface-hub==0.26.5
-hypothesis==6.45.0
-idna==3.10
-importlib-metadata==6.11.0
-iniconfig==2.0.0
-jsonpatch==1.33
-jsonpointer==3.0.0
-langchain==0.0.192
-langchain-community==0.0.14
-langchain-core==0.1.23
-langchainplus-sdk==0.0.4
-langsmith==0.0.87
-loguru==0.7.3
-marshmallow==3.23.1
-mock==5.1.0
-multidict==6.1.0
-mypy-extensions==1.0.0
-numexpr==2.8.5
-numpy==1.26.4
-openai==0.27.8
-openapi-schema-pydantic==1.2.4
-opentracing==2.4.0
-packaging==23.2
-pinecone-client==2.2.4
-pluggy==1.5.0
-propcache==0.2.1
-psutil==6.1.0
-pydantic==1.10.19
-pytest==8.3.4
-pytest-asyncio==0.23.7
-pytest-cov==6.0.0
-pytest-mock==3.14.0
-pytest-randomly==3.10.1
-python-dateutil==2.9.0.post0
-pyyaml==6.0.2
-regex==2024.11.6
-requests==2.32.3
-sentencepiece==0.2.0
-six==1.17.0
-sniffio==1.3.1
-sortedcontainers==2.4.0
-sqlalchemy==2.0.36
-tenacity==8.5.0
-tiktoken==0.8.0
-tokenizers==0.21.0
-tomli==2.2.1
-tqdm==4.67.1
-typing-extensions==4.12.2
-typing-inspect==0.9.0
-urllib3==2.2.3
-vcrpy==6.0.1
-wrapt==1.17.0
-yarl==1.18.3
-zipp==3.21.0
diff --git a/.riot/requirements/585e779.txt b/.riot/requirements/585e779.txt
deleted file mode 100644
index 3e328720bd3..00000000000
--- a/.riot/requirements/585e779.txt
+++ /dev/null
@@ -1,82 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-# pip-compile --allow-unsafe --no-annotate .riot/requirements/585e779.in
-#
-ai21==3.0.1
-ai21-tokenizer==0.12.0
-aiohappyeyeballs==2.4.4
-aiohttp==3.11.10
-aiosignal==1.3.1
-anyio==4.7.0
-attrs==24.2.0
-backoff==2.2.1
-certifi==2024.8.30
-charset-normalizer==3.4.0
-cohere==4.57
-coverage[toml]==7.6.9
-dataclasses-json==0.5.14
-dnspython==2.7.0
-exceptiongroup==1.2.2
-fastavro==1.9.7
-filelock==3.16.1
-frozenlist==1.5.0
-fsspec==2024.10.0
-greenlet==3.0.3
-h11==0.14.0
-httpcore==1.0.7
-httpx==0.27.2
-huggingface-hub==0.26.5
-hypothesis==6.45.0
-idna==3.10
-importlib-metadata==6.11.0
-iniconfig==2.0.0
-jsonpatch==1.33
-jsonpointer==3.0.0
-langchain==0.0.192
-langchain-community==0.0.14
-langchain-core==0.1.23
-langchainplus-sdk==0.0.4
-langsmith==0.0.87
-loguru==0.7.3
-marshmallow==3.23.1
-mock==5.1.0
-multidict==6.1.0
-mypy-extensions==1.0.0
-numexpr==2.8.5
-numpy==1.26.4
-openai==0.27.8
-openapi-schema-pydantic==1.2.4
-opentracing==2.4.0
-packaging==23.2
-pinecone-client==2.2.4
-pluggy==1.5.0
-propcache==0.2.1
-psutil==6.1.0
-pydantic==1.10.19
-pytest==8.3.4
-pytest-asyncio==0.23.7
-pytest-cov==6.0.0
-pytest-mock==3.14.0
-pytest-randomly==3.10.1
-python-dateutil==2.9.0.post0
-pyyaml==6.0.2
-regex==2024.11.6
-requests==2.32.3
-sentencepiece==0.2.0
-six==1.17.0
-sniffio==1.3.1
-sortedcontainers==2.4.0
-sqlalchemy==2.0.36
-tenacity==8.5.0
-tiktoken==0.8.0
-tokenizers==0.21.0
-tqdm==4.67.1
-typing-extensions==4.12.2
-typing-inspect==0.9.0
-urllib3==2.2.3
-vcrpy==6.0.1
-wrapt==1.17.0
-yarl==1.18.3
-zipp==3.21.0
diff --git a/.riot/requirements/d39d3de.txt b/.riot/requirements/d39d3de.txt
deleted file mode 100644
index 53ccfd3b257..00000000000
--- a/.riot/requirements/d39d3de.txt
+++ /dev/null
@@ -1,84 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.9
-# by the following command:
-#
-# pip-compile --allow-unsafe --no-annotate .riot/requirements/d39d3de.in
-#
-ai21==3.0.1
-ai21-tokenizer==0.12.0
-aiohappyeyeballs==2.4.4
-aiohttp==3.11.10
-aiosignal==1.3.1
-anyio==4.7.0
-async-timeout==4.0.3
-attrs==24.2.0
-backoff==2.2.1
-certifi==2024.8.30
-charset-normalizer==3.4.0
-cohere==4.57
-coverage[toml]==7.6.9
-dataclasses-json==0.5.14
-dnspython==2.7.0
-exceptiongroup==1.2.2
-fastavro==1.9.7
-filelock==3.16.1
-frozenlist==1.5.0
-fsspec==2024.10.0
-greenlet==3.0.3
-h11==0.14.0
-httpcore==1.0.7
-httpx==0.27.2
-huggingface-hub==0.26.5
-hypothesis==6.45.0
-idna==3.10
-importlib-metadata==6.11.0
-iniconfig==2.0.0
-jsonpatch==1.33
-jsonpointer==3.0.0
-langchain==0.0.192
-langchain-community==0.0.14
-langchain-core==0.1.23
-langchainplus-sdk==0.0.4
-langsmith==0.0.87
-loguru==0.7.3
-marshmallow==3.23.1
-mock==5.1.0
-multidict==6.1.0
-mypy-extensions==1.0.0
-numexpr==2.8.5
-numpy==1.26.4
-openai==0.27.8
-openapi-schema-pydantic==1.2.4
-opentracing==2.4.0
-packaging==23.2
-pinecone-client==2.2.4
-pluggy==1.5.0
-propcache==0.2.1
-psutil==6.1.0
-pydantic==1.10.19
-pytest==8.3.4
-pytest-asyncio==0.23.7
-pytest-cov==6.0.0
-pytest-mock==3.14.0
-pytest-randomly==3.10.1
-python-dateutil==2.9.0.post0
-pyyaml==6.0.2
-regex==2024.11.6
-requests==2.32.3
-sentencepiece==0.2.0
-six==1.17.0
-sniffio==1.3.1
-sortedcontainers==2.4.0
-sqlalchemy==2.0.36
-tenacity==8.5.0
-tiktoken==0.8.0
-tokenizers==0.21.0
-tomli==2.2.1
-tqdm==4.67.1
-typing-extensions==4.12.2
-typing-inspect==0.9.0
-urllib3==1.26.20
-vcrpy==6.0.1
-wrapt==1.17.0
-yarl==1.18.3
-zipp==3.21.0
diff --git a/benchmarks/ddtrace_run/scenario.py b/benchmarks/ddtrace_run/scenario.py
index 72173b4773f..3318158c194 100644
--- a/benchmarks/ddtrace_run/scenario.py
+++ b/benchmarks/ddtrace_run/scenario.py
@@ -32,7 +32,7 @@ def run(self):
env["DD_TRACE_API_VERSION"] = "v0.4"
code += """
import httpretty
-from ddtrace import tracer
+from ddtrace.trace import tracer
from ddtrace.internal.telemetry import telemetry_writer
httpretty.enable(allow_net_connect=False)
diff --git a/benchmarks/otel_span/scenario.py b/benchmarks/otel_span/scenario.py
index 8d0c9171cc1..7f1b544ee64 100644
--- a/benchmarks/otel_span/scenario.py
+++ b/benchmarks/otel_span/scenario.py
@@ -6,8 +6,8 @@
from opentelemetry.trace import set_tracer_provider
from ddtrace import config
-from ddtrace import tracer
from ddtrace.opentelemetry import TracerProvider # Requires ``ddtrace>=1.11``
+from ddtrace.trace import tracer
set_tracer_provider(TracerProvider())
diff --git a/benchmarks/span/scenario.py b/benchmarks/span/scenario.py
index 8b0c18dd612..c0e02de7ad6 100644
--- a/benchmarks/span/scenario.py
+++ b/benchmarks/span/scenario.py
@@ -2,7 +2,7 @@
import bm.utils as utils
from ddtrace import config
-from ddtrace import tracer
+from ddtrace.trace import tracer
class Span(Scenario):
diff --git a/benchmarks/threading/scenario.py b/benchmarks/threading/scenario.py
index 8b66cf21127..0b4adfead07 100644
--- a/benchmarks/threading/scenario.py
+++ b/benchmarks/threading/scenario.py
@@ -39,7 +39,7 @@ def create_trace(self, tracer: Tracer) -> None:
random.random()
def run(self) -> Generator[Callable[[int], None], None, None]:
- from ddtrace import tracer
+ from ddtrace.trace import tracer
# configure global tracer to drop traces rather
tracer.configure(writer=NoopWriter())
diff --git a/benchmarks/tracer/scenario.py b/benchmarks/tracer/scenario.py
index ea1ae093637..704f08ba9b7 100644
--- a/benchmarks/tracer/scenario.py
+++ b/benchmarks/tracer/scenario.py
@@ -8,7 +8,7 @@ class Tracer(bm.Scenario):
def run(self):
# configure global tracer to drop traces rather than encoded and sent to
# an agent
- from ddtrace import tracer
+ from ddtrace.trace import tracer
utils.drop_traces(tracer)
utils.drop_telemetry_events()
diff --git a/ddtrace/_trace/_span_link.py b/ddtrace/_trace/_span_link.py
index f635af38207..83087ec56c3 100644
--- a/ddtrace/_trace/_span_link.py
+++ b/ddtrace/_trace/_span_link.py
@@ -15,7 +15,7 @@
SpanLinks can be set using :meth:`ddtrace.Span.link_span(...)` Ex::
- from ddtrace import tracer
+ from ddtrace.trace import tracer
s1 = tracer.trace("s1")
s2 = tracer.trace("s2")
diff --git a/ddtrace/_trace/pin.py b/ddtrace/_trace/pin.py
index 7dd83474749..dd41a1040a1 100644
--- a/ddtrace/_trace/pin.py
+++ b/ddtrace/_trace/pin.py
@@ -44,7 +44,7 @@ def __init__(
# type: (...) -> None
if tracer is not None and tracer is not ddtrace.tracer:
deprecate(
- "Initializing ddtrace.Pin with `tracer` argument is deprecated",
+ "Initializing ddtrace.trace.Pin with `tracer` argument is deprecated",
message="All Pin instances should use the global tracer instance",
removal_version="3.0.0",
)
@@ -79,15 +79,15 @@ def __repr__(self):
def _find(*objs):
# type: (Any) -> Optional[Pin]
"""
- Return the first :class:`ddtrace.pin.Pin` found on any of the provided objects or `None` if none were found
+ Return the first :class:`ddtrace.trace.Pin` found on any of the provided objects or `None` if none were found
>>> pin = Pin._find(wrapper, instance, conn)
- :param objs: The objects to search for a :class:`ddtrace.pin.Pin` on
+ :param objs: The objects to search for a :class:`ddtrace.trace.Pin` on
:type objs: List of objects
- :rtype: :class:`ddtrace.pin.Pin`, None
- :returns: The first found :class:`ddtrace.pin.Pin` or `None` is none was found
+ :rtype: :class:`ddtrace.trace.Pin`, None
+ :returns: The first found :class:`ddtrace.trace.Pin` or `None` is none was found
"""
for obj in objs:
pin = Pin.get_from(obj)
@@ -105,10 +105,10 @@ def get_from(obj):
>>> pin = Pin.get_from(conn)
- :param obj: The object to look for a :class:`ddtrace.pin.Pin` on
+ :param obj: The object to look for a :class:`ddtrace.trace.Pin` on
:type obj: object
- :rtype: :class:`ddtrace.pin.Pin`, None
- :returns: :class:`ddtrace.pin.Pin` associated with the object, or None if none was found
+ :rtype: :class:`ddtrace.trace.Pin`, None
+ :returns: :class:`ddtrace.trace.Pin` associated with the object, or None if none was found
"""
if hasattr(obj, "__getddpin__"):
return obj.__getddpin__()
@@ -141,7 +141,7 @@ def override(
"""
if tracer is not None:
deprecate(
- "Calling ddtrace.Pin.override(...) with the `tracer` argument is deprecated",
+ "Calling ddtrace.trace.Pin.override(...) with the `tracer` argument is deprecated",
message="All Pin instances should use the global tracer instance",
removal_version="3.0.0",
)
@@ -208,7 +208,7 @@ def clone(
if tracer is not None:
deprecate(
- "Initializing ddtrace.Pin with `tracer` argument is deprecated",
+ "Initializing ddtrace.trace.Pin with `tracer` argument is deprecated",
message="All Pin instances should use the global tracer instance",
removal_version="3.0.0",
)
diff --git a/ddtrace/_trace/sampler.py b/ddtrace/_trace/sampler.py
index 96d61b9adcf..4bf3d1891c1 100644
--- a/ddtrace/_trace/sampler.py
+++ b/ddtrace/_trace/sampler.py
@@ -261,7 +261,9 @@ def __init__(
if isinstance(rule, SamplingRule):
self.rules.append(rule)
elif config._raise:
- raise TypeError("Rule {!r} must be a sub-class of type ddtrace.sampler.SamplingRules".format(rule))
+ raise TypeError(
+ "Rule {!r} must be a sub-class of type ddtrace._trace.sampler.SamplingRules".format(rule)
+ )
# DEV: sampling rule must come last
if effective_sample_rate is not None:
diff --git a/ddtrace/_trace/trace_handlers.py b/ddtrace/_trace/trace_handlers.py
index dab3f743146..89e31fa4e97 100644
--- a/ddtrace/_trace/trace_handlers.py
+++ b/ddtrace/_trace/trace_handlers.py
@@ -39,7 +39,7 @@
if TYPE_CHECKING:
- from ddtrace import Span
+ from ddtrace._trace.span import Span
log = get_logger(__name__)
diff --git a/ddtrace/_trace/tracer.py b/ddtrace/_trace/tracer.py
index 6e595bbe7c1..87f312bb18c 100644
--- a/ddtrace/_trace/tracer.py
+++ b/ddtrace/_trace/tracer.py
@@ -189,7 +189,7 @@ class Tracer(object):
If you're running an application that will serve a single trace per thread,
you can use the global tracer instance::
- from ddtrace import tracer
+ from ddtrace.trace import tracer
trace = tracer.trace('app.request', 'web-server').finish()
"""
diff --git a/ddtrace/_trace/utils_botocore/aws_payload_tagging.py b/ddtrace/_trace/utils_botocore/aws_payload_tagging.py
index dadb6749a12..6886b66db73 100644
--- a/ddtrace/_trace/utils_botocore/aws_payload_tagging.py
+++ b/ddtrace/_trace/utils_botocore/aws_payload_tagging.py
@@ -5,8 +5,8 @@
from typing import Dict
from typing import Optional
-from ddtrace import Span
from ddtrace import config
+from ddtrace._trace.span import Span
from ddtrace.vendor.jsonpath_ng import parse
diff --git a/ddtrace/_trace/utils_botocore/span_tags.py b/ddtrace/_trace/utils_botocore/span_tags.py
index f90cbd60a51..fb69b147b95 100644
--- a/ddtrace/_trace/utils_botocore/span_tags.py
+++ b/ddtrace/_trace/utils_botocore/span_tags.py
@@ -3,8 +3,8 @@
from typing import Dict
from typing import Optional
-from ddtrace import Span
from ddtrace import config
+from ddtrace._trace.span import Span
from ddtrace._trace.utils_botocore.aws_payload_tagging import AWSPayloadTagging
from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY
from ddtrace.constants import _SPAN_MEASURED_KEY
diff --git a/ddtrace/appsec/_asm_request_context.py b/ddtrace/appsec/_asm_request_context.py
index ff398d56b14..950015b3f80 100644
--- a/ddtrace/appsec/_asm_request_context.py
+++ b/ddtrace/appsec/_asm_request_context.py
@@ -12,7 +12,6 @@
from typing import Union
from urllib import parse
-from ddtrace._trace.span import Span
from ddtrace.appsec._constants import APPSEC
from ddtrace.appsec._constants import EXPLOIT_PREVENTION
from ddtrace.appsec._constants import SPAN_DATA_NAMES
@@ -27,6 +26,7 @@
from ddtrace.internal.constants import REQUEST_PATH_PARAMS
from ddtrace.internal.logger import get_logger
from ddtrace.settings.asm import config as asm_config
+from ddtrace.trace import Span
if TYPE_CHECKING:
@@ -63,7 +63,7 @@ class ASM_Environment:
"""
def __init__(self, span: Optional[Span] = None):
- from ddtrace import tracer
+ from ddtrace.trace import tracer
self.root = not in_asm_context()
if self.root:
@@ -178,7 +178,7 @@ def update_span_metrics(span: Span, name: str, value: Union[float, int]) -> None
def flush_waf_triggers(env: ASM_Environment) -> None:
# Make sure we find a root span to attach the triggers to
if env.span is None:
- from ddtrace import tracer
+ from ddtrace.trace import tracer
current_span = tracer.current_span()
if current_span is None:
diff --git a/ddtrace/appsec/_capabilities.py b/ddtrace/appsec/_capabilities.py
index c999b61cb97..a080d739dfb 100644
--- a/ddtrace/appsec/_capabilities.py
+++ b/ddtrace/appsec/_capabilities.py
@@ -59,7 +59,7 @@ def _asm_feature_is_required() -> bool:
return (_FEATURE_REQUIRED & flags) != 0
-def _rc_capabilities(test_tracer: Optional[ddtrace.Tracer] = None) -> Flags:
+def _rc_capabilities(test_tracer: Optional[ddtrace.trace.Tracer] = None) -> Flags:
tracer = ddtrace.tracer if test_tracer is None else test_tracer
value = Flags(0)
if ddtrace.config._remote_config_enabled:
@@ -74,7 +74,7 @@ def _rc_capabilities(test_tracer: Optional[ddtrace.Tracer] = None) -> Flags:
return value
-def _appsec_rc_capabilities(test_tracer: Optional[ddtrace.Tracer] = None) -> str:
+def _appsec_rc_capabilities(test_tracer: Optional[ddtrace.trace.Tracer] = None) -> str:
r"""return the bit representation of the composed capabilities in base64
bit 0: Reserved
bit 1: ASM 1-click Activation
diff --git a/ddtrace/appsec/_exploit_prevention/stack_traces.py b/ddtrace/appsec/_exploit_prevention/stack_traces.py
index 6c8db41f578..776ccad7f01 100644
--- a/ddtrace/appsec/_exploit_prevention/stack_traces.py
+++ b/ddtrace/appsec/_exploit_prevention/stack_traces.py
@@ -5,9 +5,9 @@
from typing import Iterable
from typing import Optional
-from ddtrace._trace.span import Span
from ddtrace.appsec._constants import STACK_TRACE
from ddtrace.settings.asm import config as asm_config
+from ddtrace.trace import Span
def report_stack(
@@ -33,7 +33,7 @@ def report_stack(
return False
if span is None:
- from ddtrace import tracer
+ from ddtrace.trace import tracer
span = tracer.current_span()
diff --git a/ddtrace/appsec/_iast/_iast_request_context.py b/ddtrace/appsec/_iast/_iast_request_context.py
index e9c985d0b3d..176dceea4de 100644
--- a/ddtrace/appsec/_iast/_iast_request_context.py
+++ b/ddtrace/appsec/_iast/_iast_request_context.py
@@ -3,7 +3,6 @@
from typing import Dict
from typing import Optional
-from ddtrace._trace.span import Span
from ddtrace.appsec._constants import APPSEC
from ddtrace.appsec._constants import IAST
from ddtrace.appsec._iast import _is_iast_enabled
@@ -18,6 +17,7 @@
from ddtrace.internal import core
from ddtrace.internal.logger import get_logger
from ddtrace.internal.utils.formats import asbool
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/appsec/_iast/processor.py b/ddtrace/appsec/_iast/processor.py
index 9a5e906faae..a3bf70b031e 100644
--- a/ddtrace/appsec/_iast/processor.py
+++ b/ddtrace/appsec/_iast/processor.py
@@ -1,9 +1,9 @@
from dataclasses import dataclass
from ddtrace._trace.processor import SpanProcessor
-from ddtrace._trace.span import Span
from ddtrace.ext import SpanTypes
from ddtrace.internal.logger import get_logger
+from ddtrace.trace import Span
from ._iast_request_context import _iast_end_request
from ._iast_request_context import _iast_start_request
diff --git a/ddtrace/appsec/_iast/taint_sinks/_base.py b/ddtrace/appsec/_iast/taint_sinks/_base.py
index a934c8c5788..93c5fdfc371 100644
--- a/ddtrace/appsec/_iast/taint_sinks/_base.py
+++ b/ddtrace/appsec/_iast/taint_sinks/_base.py
@@ -4,11 +4,11 @@
from typing import Optional
from typing import Text
-from ddtrace import tracer
from ddtrace.appsec._deduplications import deduplication
from ddtrace.appsec._trace_utils import _asm_manual_keep
from ddtrace.internal.logger import get_logger
from ddtrace.settings.asm import config as asm_config
+from ddtrace.trace import tracer
from .._iast_request_context import get_iast_reporter
from .._iast_request_context import is_iast_request_enabled
diff --git a/ddtrace/appsec/_processor.py b/ddtrace/appsec/_processor.py
index 6102ba1ded2..f144eba6458 100644
--- a/ddtrace/appsec/_processor.py
+++ b/ddtrace/appsec/_processor.py
@@ -14,7 +14,6 @@
import weakref
from ddtrace._trace.processor import SpanProcessor
-from ddtrace._trace.span import Span
from ddtrace.appsec import _asm_request_context
from ddtrace.appsec._constants import APPSEC
from ddtrace.appsec._constants import DEFAULT
@@ -35,6 +34,7 @@
from ddtrace.internal.logger import get_logger
from ddtrace.internal.rate_limiter import RateLimiter
from ddtrace.settings.asm import config as asm_config
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/appsec/_remoteconfiguration.py b/ddtrace/appsec/_remoteconfiguration.py
index 723710d7cc3..7f70f0aee33 100644
--- a/ddtrace/appsec/_remoteconfiguration.py
+++ b/ddtrace/appsec/_remoteconfiguration.py
@@ -5,7 +5,6 @@
from typing import Mapping
from typing import Optional
-from ddtrace import Tracer
from ddtrace.appsec._capabilities import _asm_feature_is_required
from ddtrace.appsec._constants import PRODUCTS
from ddtrace.internal.logger import get_logger
@@ -17,6 +16,7 @@
from ddtrace.internal.telemetry import telemetry_writer
from ddtrace.internal.telemetry.constants import TELEMETRY_APM_PRODUCT
from ddtrace.settings.asm import config as asm_config
+from ddtrace.trace import Tracer
log = get_logger(__name__)
@@ -109,7 +109,7 @@ def _appsec_rules_data(features: Mapping[str, Any], test_tracer: Optional[Tracer
# Tracer is a parameter for testing propose
# Import tracer here to avoid a circular import
if test_tracer is None:
- from ddtrace import tracer
+ from ddtrace.trace import tracer
else:
tracer = test_tracer
@@ -198,7 +198,7 @@ def _appsec_1click_activation(features: Mapping[str, Any], test_tracer: Optional
# Tracer is a parameter for testing propose
# Import tracer here to avoid a circular import
if test_tracer is None:
- from ddtrace import tracer
+ from ddtrace.trace import tracer
else:
tracer = test_tracer
diff --git a/ddtrace/appsec/_trace_utils.py b/ddtrace/appsec/_trace_utils.py
index 56f34d81f99..87400183607 100644
--- a/ddtrace/appsec/_trace_utils.py
+++ b/ddtrace/appsec/_trace_utils.py
@@ -1,8 +1,6 @@
from typing import Optional
-from ddtrace import Tracer
from ddtrace import constants
-from ddtrace._trace.span import Span
from ddtrace.appsec import _asm_request_context
from ddtrace.appsec._asm_request_context import call_waf_callback
from ddtrace.appsec._asm_request_context import get_blocked
@@ -18,6 +16,8 @@
from ddtrace.internal._exceptions import BlockingException
from ddtrace.internal.logger import get_logger
from ddtrace.settings.asm import config as asm_config
+from ddtrace.trace import Span
+from ddtrace.trace import Tracer
log = get_logger(__name__)
diff --git a/ddtrace/bootstrap/preload.py b/ddtrace/bootstrap/preload.py
index 95dc8f4cd55..7980b9bf746 100644
--- a/ddtrace/bootstrap/preload.py
+++ b/ddtrace/bootstrap/preload.py
@@ -15,7 +15,7 @@
from ddtrace.internal.utils.formats import asbool # noqa:F401
from ddtrace.internal.utils.formats import parse_tags_str # noqa:F401
from ddtrace.settings.crashtracker import config as crashtracker_config
-from ddtrace import tracer
+from ddtrace.trace import tracer
import typing as t
diff --git a/ddtrace/context.py b/ddtrace/context.py
index 72640327d92..843ef510c38 100644
--- a/ddtrace/context.py
+++ b/ddtrace/context.py
@@ -1,5 +1,5 @@
-from ddtrace._trace.context import Context # noqa: F401
from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning
+from ddtrace.trace import Context # noqa: F401
from ddtrace.vendor.debtcollector import deprecate
diff --git a/ddtrace/contrib/_logging.py b/ddtrace/contrib/_logging.py
index 781c52410ea..f2997f362f7 100644
--- a/ddtrace/contrib/_logging.py
+++ b/ddtrace/contrib/_logging.py
@@ -33,7 +33,7 @@
Make sure that your log format exactly matches the following::
import logging
- from ddtrace import tracer
+ from ddtrace.trace import tracer
FORMAT = ('%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] '
'[dd.service=%(dd.service)s dd.env=%(dd.env)s '
diff --git a/ddtrace/contrib/aiohttp.py b/ddtrace/contrib/aiohttp.py
index 8678f047aa4..dbb5def90d1 100644
--- a/ddtrace/contrib/aiohttp.py
+++ b/ddtrace/contrib/aiohttp.py
@@ -47,7 +47,7 @@
the provided ``trace_app`` function must be used::
from aiohttp import web
- from ddtrace import tracer, patch
+ from ddtrace.trace import tracer, patch
from ddtrace.contrib.aiohttp import trace_app
# create your application
diff --git a/ddtrace/contrib/cherrypy.py b/ddtrace/contrib/cherrypy.py
index b2c146a6883..b217d16b440 100644
--- a/ddtrace/contrib/cherrypy.py
+++ b/ddtrace/contrib/cherrypy.py
@@ -7,7 +7,7 @@
~~~~~
To install the middleware, add::
- from ddtrace import tracer
+ from ddtrace.trace import tracer
from ddtrace.contrib.cherrypy import TraceMiddleware
and create a `TraceMiddleware` object::
@@ -40,7 +40,7 @@
import cherrypy
- from ddtrace import tracer, Pin
+ from ddtrace.trace import tracer, Pin
from ddtrace.contrib.cherrypy import TraceMiddleware
TraceMiddleware(cherrypy, tracer, service="my-cherrypy-app")
diff --git a/ddtrace/contrib/falcon.py b/ddtrace/contrib/falcon.py
index 6bb080cbc76..a80d298d09b 100644
--- a/ddtrace/contrib/falcon.py
+++ b/ddtrace/contrib/falcon.py
@@ -2,7 +2,7 @@
To trace the falcon web framework, install the trace middleware::
import falcon
- from ddtrace import tracer
+ from ddtrace.trace import tracer
from ddtrace.contrib.falcon import TraceMiddleware
mw = TraceMiddleware(tracer, 'my-falcon-app')
@@ -11,7 +11,7 @@
You can also use the autopatching functionality::
import falcon
- from ddtrace import tracer, patch
+ from ddtrace.trace import tracer, patch
patch(falcon=True)
diff --git a/ddtrace/contrib/flask_cache.py b/ddtrace/contrib/flask_cache.py
index 538f4e4d0fb..35cae2fb164 100644
--- a/ddtrace/contrib/flask_cache.py
+++ b/ddtrace/contrib/flask_cache.py
@@ -5,9 +5,9 @@
The tracer supports both `Flask-Cache `_
and `Flask-Caching `_.
-To install the tracer, ``from ddtrace import tracer`` needs to be added::
+To install the tracer, ``from ddtrace.trace import tracer`` needs to be added::
- from ddtrace import tracer
+ from ddtrace.trace import tracer
from ddtrace.contrib.flask_cache import get_traced_cache
and the tracer needs to be initialized::
@@ -18,7 +18,7 @@
from flask import Flask
- from ddtrace import tracer
+ from ddtrace.trace import tracer
from ddtrace.contrib.flask_cache import get_traced_cache
app = Flask(__name__)
@@ -35,7 +35,7 @@ def counter():
Use a specific ``Cache`` implementation with::
- from ddtrace import tracer
+ from ddtrace.trace import tracer
from ddtrace.contrib.flask_cache import get_traced_cache
from flask_caching import Cache
diff --git a/ddtrace/contrib/internal/asgi/middleware.py b/ddtrace/contrib/internal/asgi/middleware.py
index 2b3e23eb78b..7da2b11b929 100644
--- a/ddtrace/contrib/internal/asgi/middleware.py
+++ b/ddtrace/contrib/internal/asgi/middleware.py
@@ -7,7 +7,6 @@
import ddtrace
from ddtrace import config
-from ddtrace._trace.span import Span
from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY
from ddtrace.constants import SPAN_KIND
from ddtrace.contrib import trace_utils
@@ -24,6 +23,7 @@
from ddtrace.internal.schema.span_attribute_schema import SpanDirection
from ddtrace.internal.utils import get_blocked
from ddtrace.internal.utils import set_blocked
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/contrib/internal/asyncio/provider.py b/ddtrace/contrib/internal/asyncio/provider.py
index 6c16a178cd0..fac41470740 100644
--- a/ddtrace/contrib/internal/asyncio/provider.py
+++ b/ddtrace/contrib/internal/asyncio/provider.py
@@ -2,7 +2,7 @@
from ddtrace._trace.provider import BaseContextProvider
from ddtrace._trace.provider import DatadogContextMixin
-from ddtrace._trace.span import Span
+from ddtrace.trace import Span
from ddtrace.vendor.debtcollector import deprecate
diff --git a/ddtrace/contrib/internal/avro/schema_iterator.py b/ddtrace/contrib/internal/avro/schema_iterator.py
index a4339d05420..3bd9ef3492e 100644
--- a/ddtrace/contrib/internal/avro/schema_iterator.py
+++ b/ddtrace/contrib/internal/avro/schema_iterator.py
@@ -1,11 +1,11 @@
import avro
from avro.schema import Schema as AvroSchema
-from ddtrace._trace.span import Span
from ddtrace.ext import schema as SCHEMA_TAGS
from ddtrace.internal.datastreams import data_streams_processor
from ddtrace.internal.datastreams.schemas.schema_builder import SchemaBuilder
from ddtrace.internal.datastreams.schemas.schema_iterator import SchemaIterator
+from ddtrace.trace import Span
class SchemaExtractor(SchemaIterator):
diff --git a/ddtrace/contrib/internal/aws_lambda/patch.py b/ddtrace/contrib/internal/aws_lambda/patch.py
index e331cf8ead4..49ef1e5dd60 100644
--- a/ddtrace/contrib/internal/aws_lambda/patch.py
+++ b/ddtrace/contrib/internal/aws_lambda/patch.py
@@ -2,7 +2,6 @@
import os
import signal
-from ddtrace import tracer
from ddtrace.constants import ERROR_MSG
from ddtrace.constants import ERROR_TYPE
from ddtrace.contrib.internal.aws_lambda._cold_start import is_cold_start
@@ -12,6 +11,7 @@
from ddtrace.internal.utils import get_argument_value
from ddtrace.internal.wrapping import unwrap
from ddtrace.internal.wrapping import wrap
+from ddtrace.trace import tracer
def get_version():
diff --git a/ddtrace/contrib/internal/cassandra/session.py b/ddtrace/contrib/internal/cassandra/session.py
index 3ccd44bb616..2cab838e2f2 100644
--- a/ddtrace/contrib/internal/cassandra/session.py
+++ b/ddtrace/contrib/internal/cassandra/session.py
@@ -20,7 +20,6 @@
from cassandra.query import SimpleStatement
import wrapt
-from ddtrace import Span
from ddtrace import config
from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY
from ddtrace.constants import _SPAN_MEASURED_KEY
@@ -40,6 +39,7 @@
from ddtrace.internal.utils import get_argument_value
from ddtrace.internal.utils.formats import deep_getattr
from ddtrace.trace import Pin
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/contrib/internal/celery/utils.py b/ddtrace/contrib/internal/celery/utils.py
index 5c7a4c077e8..1bf2f56af93 100644
--- a/ddtrace/contrib/internal/celery/utils.py
+++ b/ddtrace/contrib/internal/celery/utils.py
@@ -2,9 +2,9 @@
from typing import Dict
from weakref import WeakValueDictionary
-from ddtrace._trace.span import Span
from ddtrace.contrib.internal.trace_utils import set_flattened_tags
from ddtrace.propagation.http import HTTPPropagator
+from ddtrace.trace import Span
from .constants import CTX_KEY
from .constants import SPAN_KEY
diff --git a/ddtrace/contrib/internal/django/utils.py b/ddtrace/contrib/internal/django/utils.py
index a8d4c469e66..999d1530326 100644
--- a/ddtrace/contrib/internal/django/utils.py
+++ b/ddtrace/contrib/internal/django/utils.py
@@ -13,7 +13,6 @@
import xmltodict
from ddtrace import config
-from ddtrace._trace.span import Span
from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY
from ddtrace.constants import _SPAN_MEASURED_KEY
from ddtrace.contrib import trace_utils
@@ -29,6 +28,7 @@
from ddtrace.internal.utils.http import parse_form_params
from ddtrace.internal.utils.importlib import func_name
from ddtrace.propagation._utils import from_wsgi_header
+from ddtrace.trace import Span
try:
diff --git a/ddtrace/contrib/internal/dramatiq/patch.py b/ddtrace/contrib/internal/dramatiq/patch.py
index a6ecbbfd5d4..c55d20a63a3 100644
--- a/ddtrace/contrib/internal/dramatiq/patch.py
+++ b/ddtrace/contrib/internal/dramatiq/patch.py
@@ -6,12 +6,12 @@
import dramatiq
from ddtrace import config
-from ddtrace import tracer
from ddtrace.constants import SPAN_KIND
from ddtrace.contrib import trace_utils
from ddtrace.ext import SpanKind
from ddtrace.ext import SpanTypes
from ddtrace.settings._config import Config
+from ddtrace.trace import tracer
def get_version() -> str:
diff --git a/ddtrace/contrib/internal/falcon/patch.py b/ddtrace/contrib/internal/falcon/patch.py
index 6cf6e47e7c7..568eb025312 100644
--- a/ddtrace/contrib/internal/falcon/patch.py
+++ b/ddtrace/contrib/internal/falcon/patch.py
@@ -4,9 +4,9 @@
import wrapt
from ddtrace import config
-from ddtrace import tracer
from ddtrace.internal.utils.formats import asbool
from ddtrace.internal.utils.version import parse_version
+from ddtrace.trace import tracer
from .middleware import TraceMiddleware
diff --git a/ddtrace/contrib/internal/flask_cache/patch.py b/ddtrace/contrib/internal/flask_cache/patch.py
index 9170bd4bd45..8ce907b21ff 100644
--- a/ddtrace/contrib/internal/flask_cache/patch.py
+++ b/ddtrace/contrib/internal/flask_cache/patch.py
@@ -20,7 +20,7 @@
if typing.TYPE_CHECKING: # pragma: no cover
- from ddtrace import Span # noqa:F401
+ from ddtrace.trace import Span # noqa:F401
log = logging.Logger(__name__)
diff --git a/ddtrace/contrib/internal/futures/threading.py b/ddtrace/contrib/internal/futures/threading.py
index deea68e2c17..6e96a263a9a 100644
--- a/ddtrace/contrib/internal/futures/threading.py
+++ b/ddtrace/contrib/internal/futures/threading.py
@@ -1,7 +1,7 @@
from typing import Optional
import ddtrace
-from ddtrace._trace.context import Context
+from ddtrace.trace import Context
def _wrap_submit(func, args, kwargs):
diff --git a/ddtrace/contrib/internal/gevent/provider.py b/ddtrace/contrib/internal/gevent/provider.py
index be18498b8a4..c07b0512d6d 100644
--- a/ddtrace/contrib/internal/gevent/provider.py
+++ b/ddtrace/contrib/internal/gevent/provider.py
@@ -2,7 +2,7 @@
from ddtrace._trace.provider import BaseContextProvider
from ddtrace._trace.provider import DatadogContextMixin
-from ddtrace._trace.span import Span
+from ddtrace.trace import Span
from ddtrace.vendor.debtcollector import deprecate
diff --git a/ddtrace/contrib/internal/graphql/patch.py b/ddtrace/contrib/internal/graphql/patch.py
index 589bef80d4b..fe538303a52 100644
--- a/ddtrace/contrib/internal/graphql/patch.py
+++ b/ddtrace/contrib/internal/graphql/patch.py
@@ -4,8 +4,8 @@
from typing import TYPE_CHECKING
from typing import List
-from ddtrace._trace.span import Span
from ddtrace.internal.schema.span_attribute_schema import SpanDirection
+from ddtrace.trace import Span
if TYPE_CHECKING: # pragma: no cover
diff --git a/ddtrace/contrib/internal/grpc/aio_client_interceptor.py b/ddtrace/contrib/internal/grpc/aio_client_interceptor.py
index 76455b1627f..dec03c203f4 100644
--- a/ddtrace/contrib/internal/grpc/aio_client_interceptor.py
+++ b/ddtrace/contrib/internal/grpc/aio_client_interceptor.py
@@ -11,7 +11,6 @@
from grpc.aio._typing import ResponseIterableType
from grpc.aio._typing import ResponseType
-from ddtrace import Span
from ddtrace import config
from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY
from ddtrace.constants import _SPAN_MEASURED_KEY
@@ -30,6 +29,7 @@
from ddtrace.internal.schema.span_attribute_schema import SpanDirection
from ddtrace.propagation.http import HTTPPropagator
from ddtrace.trace import Pin
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/contrib/internal/grpc/aio_server_interceptor.py b/ddtrace/contrib/internal/grpc/aio_server_interceptor.py
index d2e7efb0e00..54030a90e6d 100644
--- a/ddtrace/contrib/internal/grpc/aio_server_interceptor.py
+++ b/ddtrace/contrib/internal/grpc/aio_server_interceptor.py
@@ -13,7 +13,6 @@
from grpc.aio._typing import ResponseType
import wrapt
-from ddtrace import Span # noqa:F401
from ddtrace import config
from ddtrace.constants import _ANALYTICS_SAMPLE_RATE_KEY
from ddtrace.constants import _SPAN_MEASURED_KEY
@@ -30,6 +29,7 @@
from ddtrace.internal.schema import schematize_url_operation
from ddtrace.internal.schema.span_attribute_schema import SpanDirection
from ddtrace.trace import Pin # noqa:F401
+from ddtrace.trace import Span # noqa:F401
Continuation = Callable[[grpc.HandlerCallDetails], Awaitable[grpc.RpcMethodHandler]]
diff --git a/ddtrace/contrib/internal/langchain/patch.py b/ddtrace/contrib/internal/langchain/patch.py
index 430700e2782..75b88c3fbab 100644
--- a/ddtrace/contrib/internal/langchain/patch.py
+++ b/ddtrace/contrib/internal/langchain/patch.py
@@ -39,7 +39,6 @@
import wrapt
-from ddtrace import Span
from ddtrace import config
from ddtrace.contrib.internal.langchain.constants import API_KEY
from ddtrace.contrib.internal.langchain.constants import COMPLETION_TOKENS
@@ -63,6 +62,7 @@
from ddtrace.llmobs._integrations import LangChainIntegration
from ddtrace.llmobs._utils import safe_json
from ddtrace.trace import Pin
+from ddtrace.trace import Span
log = get_logger(__name__)
@@ -73,12 +73,6 @@ def get_version():
return getattr(langchain, "__version__", "")
-# After 0.1.0, implementation split into langchain, langchain_community, and langchain_core.
-# We need to check the version to determine which module to wrap, to avoid deprecation warnings
-# ref: https://github.com/DataDog/dd-trace-py/issues/8212
-PATCH_LANGCHAIN_V0 = parse_version(get_version()) < (0, 1, 0)
-
-
config._add(
"langchain",
{
@@ -160,11 +154,11 @@ def _is_openai_llm_instance(instance):
langchain_community does not automatically import submodules which may result in AttributeErrors.
"""
try:
- if not PATCH_LANGCHAIN_V0 and langchain_openai:
+ if langchain_openai:
return isinstance(instance, langchain_openai.OpenAI)
- if not PATCH_LANGCHAIN_V0 and langchain_community:
+ if langchain_community:
return isinstance(instance, langchain_community.llms.OpenAI)
- return isinstance(instance, langchain.llms.OpenAI)
+ return False
except (AttributeError, ModuleNotFoundError, ImportError):
return False
@@ -174,11 +168,11 @@ def _is_openai_chat_instance(instance):
langchain_community does not automatically import submodules which may result in AttributeErrors.
"""
try:
- if not PATCH_LANGCHAIN_V0 and langchain_openai:
+ if langchain_openai:
return isinstance(instance, langchain_openai.ChatOpenAI)
- if not PATCH_LANGCHAIN_V0 and langchain_community:
+ if langchain_community:
return isinstance(instance, langchain_community.chat_models.ChatOpenAI)
- return isinstance(instance, langchain.chat_models.ChatOpenAI)
+ return False
except (AttributeError, ModuleNotFoundError, ImportError):
return False
@@ -188,11 +182,11 @@ def _is_pinecone_vectorstore_instance(instance):
langchain_community does not automatically import submodules which may result in AttributeErrors.
"""
try:
- if not PATCH_LANGCHAIN_V0 and langchain_pinecone:
+ if langchain_pinecone:
return isinstance(instance, langchain_pinecone.PineconeVectorStore)
- if not PATCH_LANGCHAIN_V0 and langchain_community:
+ if langchain_community:
return isinstance(instance, langchain_community.vectorstores.Pinecone)
- return isinstance(instance, langchain.vectorstores.Pinecone)
+ return False
except (AttributeError, ModuleNotFoundError, ImportError):
return False
@@ -661,10 +655,7 @@ def traced_chain_call(langchain, pin, func, instance, args, kwargs):
inputs = None
final_outputs = {}
try:
- if PATCH_LANGCHAIN_V0:
- inputs = get_argument_value(args, kwargs, 0, "inputs")
- else:
- inputs = get_argument_value(args, kwargs, 0, "input")
+ inputs = get_argument_value(args, kwargs, 0, "input")
if not isinstance(inputs, dict):
inputs = {instance.input_keys[0]: inputs}
if integration.is_pc_sampled_span(span):
@@ -719,10 +710,7 @@ async def traced_chain_acall(langchain, pin, func, instance, args, kwargs):
inputs = None
final_outputs = {}
try:
- if PATCH_LANGCHAIN_V0:
- inputs = get_argument_value(args, kwargs, 0, "inputs")
- else:
- inputs = get_argument_value(args, kwargs, 0, "input")
+ inputs = get_argument_value(args, kwargs, 0, "input")
if not isinstance(inputs, dict):
inputs = {instance.input_keys[0]: inputs}
if integration.is_pc_sampled_span(span):
@@ -1197,44 +1185,42 @@ def _patch_embeddings_and_vectorstores():
Text embedding models override two abstract base methods instead of super calls,
so we need to wrap each langchain-provided text embedding and vectorstore model.
"""
- base_langchain_module = langchain
- if not PATCH_LANGCHAIN_V0 and langchain_community:
- from langchain_community import embeddings # noqa:F401
- from langchain_community import vectorstores # noqa:F401
-
- base_langchain_module = langchain_community
- if not PATCH_LANGCHAIN_V0 and langchain_community is None:
+ if langchain_community is None:
return
+
+ from langchain_community import embeddings # noqa:F401
+ from langchain_community import vectorstores # noqa:F401
+
for text_embedding_model in text_embedding_models:
- if hasattr(base_langchain_module.embeddings, text_embedding_model):
+ if hasattr(langchain_community.embeddings, text_embedding_model):
# Ensure not double patched, as some Embeddings interfaces are pointers to other Embeddings.
if not isinstance(
- deep_getattr(base_langchain_module.embeddings, "%s.embed_query" % text_embedding_model),
+ deep_getattr(langchain_community.embeddings, "%s.embed_query" % text_embedding_model),
wrapt.ObjectProxy,
):
wrap(
- base_langchain_module.__name__,
+ langchain_community.__name__,
"embeddings.%s.embed_query" % text_embedding_model,
traced_embedding(langchain),
)
if not isinstance(
- deep_getattr(base_langchain_module.embeddings, "%s.embed_documents" % text_embedding_model),
+ deep_getattr(langchain_community.embeddings, "%s.embed_documents" % text_embedding_model),
wrapt.ObjectProxy,
):
wrap(
- base_langchain_module.__name__,
+ langchain_community.__name__,
"embeddings.%s.embed_documents" % text_embedding_model,
traced_embedding(langchain),
)
for vectorstore in vectorstore_classes:
- if hasattr(base_langchain_module.vectorstores, vectorstore):
+ if hasattr(langchain_community.vectorstores, vectorstore):
# Ensure not double patched, as some Embeddings interfaces are pointers to other Embeddings.
if not isinstance(
- deep_getattr(base_langchain_module.vectorstores, "%s.similarity_search" % vectorstore),
+ deep_getattr(langchain_community.vectorstores, "%s.similarity_search" % vectorstore),
wrapt.ObjectProxy,
):
wrap(
- base_langchain_module.__name__,
+ langchain_community.__name__,
"vectorstores.%s.similarity_search" % vectorstore,
traced_similarity_search(langchain),
)
@@ -1245,34 +1231,39 @@ def _unpatch_embeddings_and_vectorstores():
Text embedding models override two abstract base methods instead of super calls,
so we need to unwrap each langchain-provided text embedding and vectorstore model.
"""
- base_langchain_module = langchain if PATCH_LANGCHAIN_V0 else langchain_community
- if not PATCH_LANGCHAIN_V0 and langchain_community is None:
+ if langchain_community is None:
return
+
for text_embedding_model in text_embedding_models:
- if hasattr(base_langchain_module.embeddings, text_embedding_model):
+ if hasattr(langchain_community.embeddings, text_embedding_model):
if isinstance(
- deep_getattr(base_langchain_module.embeddings, "%s.embed_query" % text_embedding_model),
+ deep_getattr(langchain_community.embeddings, "%s.embed_query" % text_embedding_model),
wrapt.ObjectProxy,
):
- unwrap(getattr(base_langchain_module.embeddings, text_embedding_model), "embed_query")
+ unwrap(getattr(langchain_community.embeddings, text_embedding_model), "embed_query")
if isinstance(
- deep_getattr(base_langchain_module.embeddings, "%s.embed_documents" % text_embedding_model),
+ deep_getattr(langchain_community.embeddings, "%s.embed_documents" % text_embedding_model),
wrapt.ObjectProxy,
):
- unwrap(getattr(base_langchain_module.embeddings, text_embedding_model), "embed_documents")
+ unwrap(getattr(langchain_community.embeddings, text_embedding_model), "embed_documents")
for vectorstore in vectorstore_classes:
- if hasattr(base_langchain_module.vectorstores, vectorstore):
+ if hasattr(langchain_community.vectorstores, vectorstore):
if isinstance(
- deep_getattr(base_langchain_module.vectorstores, "%s.similarity_search" % vectorstore),
+ deep_getattr(langchain_community.vectorstores, "%s.similarity_search" % vectorstore),
wrapt.ObjectProxy,
):
- unwrap(getattr(base_langchain_module.vectorstores, vectorstore), "similarity_search")
+ unwrap(getattr(langchain_community.vectorstores, vectorstore), "similarity_search")
def patch():
if getattr(langchain, "_datadog_patch", False):
return
+ version = parse_version(get_version())
+ if parse_version(get_version()) < (0, 1, 0):
+ log.warning("langchain version %s is not supported, please upgrade to langchain version 0.1 or later", version)
+ return
+
langchain._datadog_patch = True
Pin().onto(langchain)
@@ -1281,68 +1272,50 @@ def patch():
# Langchain doesn't allow wrapping directly from root, so we have to import the base classes first before wrapping.
# ref: https://github.com/DataDog/dd-trace-py/issues/7123
- if PATCH_LANGCHAIN_V0:
- from langchain import embeddings # noqa:F401
- from langchain import vectorstores # noqa:F401
- from langchain.chains.base import Chain # noqa:F401
- from langchain.chat_models.base import BaseChatModel # noqa:F401
- from langchain.llms.base import BaseLLM # noqa:F401
-
- wrap("langchain", "llms.base.BaseLLM.generate", traced_llm_generate(langchain))
- wrap("langchain", "llms.base.BaseLLM.agenerate", traced_llm_agenerate(langchain))
- wrap("langchain", "chat_models.base.BaseChatModel.generate", traced_chat_model_generate(langchain))
- wrap("langchain", "chat_models.base.BaseChatModel.agenerate", traced_chat_model_agenerate(langchain))
- wrap("langchain", "chains.base.Chain.__call__", traced_chain_call(langchain))
- wrap("langchain", "chains.base.Chain.acall", traced_chain_acall(langchain))
- wrap("langchain", "embeddings.OpenAIEmbeddings.embed_query", traced_embedding(langchain))
- wrap("langchain", "embeddings.OpenAIEmbeddings.embed_documents", traced_embedding(langchain))
- else:
- from langchain.chains.base import Chain # noqa:F401
- from langchain_core.tools import BaseTool # noqa:F401
-
- wrap("langchain_core", "language_models.llms.BaseLLM.generate", traced_llm_generate(langchain))
- wrap("langchain_core", "language_models.llms.BaseLLM.agenerate", traced_llm_agenerate(langchain))
- wrap(
- "langchain_core",
- "language_models.chat_models.BaseChatModel.generate",
- traced_chat_model_generate(langchain),
- )
- wrap(
- "langchain_core",
- "language_models.chat_models.BaseChatModel.agenerate",
- traced_chat_model_agenerate(langchain),
- )
- wrap("langchain", "chains.base.Chain.invoke", traced_chain_call(langchain))
- wrap("langchain", "chains.base.Chain.ainvoke", traced_chain_acall(langchain))
- wrap("langchain_core", "runnables.base.RunnableSequence.invoke", traced_lcel_runnable_sequence(langchain))
- wrap(
- "langchain_core", "runnables.base.RunnableSequence.ainvoke", traced_lcel_runnable_sequence_async(langchain)
- )
- wrap("langchain_core", "runnables.base.RunnableSequence.batch", traced_lcel_runnable_sequence(langchain))
- wrap("langchain_core", "runnables.base.RunnableSequence.abatch", traced_lcel_runnable_sequence_async(langchain))
- wrap("langchain_core", "runnables.base.RunnableSequence.stream", traced_chain_stream(langchain))
- wrap("langchain_core", "runnables.base.RunnableSequence.astream", traced_chain_stream(langchain))
- wrap(
- "langchain_core",
- "language_models.chat_models.BaseChatModel.stream",
- traced_chat_stream(langchain),
- )
- wrap(
- "langchain_core",
- "language_models.chat_models.BaseChatModel.astream",
- traced_chat_stream(langchain),
- )
- wrap("langchain_core", "language_models.llms.BaseLLM.stream", traced_llm_stream(langchain))
- wrap("langchain_core", "language_models.llms.BaseLLM.astream", traced_llm_stream(langchain))
-
- wrap("langchain_core", "tools.BaseTool.invoke", traced_base_tool_invoke(langchain))
- wrap("langchain_core", "tools.BaseTool.ainvoke", traced_base_tool_ainvoke(langchain))
- if langchain_openai:
- wrap("langchain_openai", "OpenAIEmbeddings.embed_documents", traced_embedding(langchain))
- if langchain_pinecone:
- wrap("langchain_pinecone", "PineconeVectorStore.similarity_search", traced_similarity_search(langchain))
+ from langchain.chains.base import Chain # noqa:F401
+ from langchain_core.tools import BaseTool # noqa:F401
+
+ wrap("langchain_core", "language_models.llms.BaseLLM.generate", traced_llm_generate(langchain))
+ wrap("langchain_core", "language_models.llms.BaseLLM.agenerate", traced_llm_agenerate(langchain))
+ wrap(
+ "langchain_core",
+ "language_models.chat_models.BaseChatModel.generate",
+ traced_chat_model_generate(langchain),
+ )
+ wrap(
+ "langchain_core",
+ "language_models.chat_models.BaseChatModel.agenerate",
+ traced_chat_model_agenerate(langchain),
+ )
+ wrap("langchain", "chains.base.Chain.invoke", traced_chain_call(langchain))
+ wrap("langchain", "chains.base.Chain.ainvoke", traced_chain_acall(langchain))
+ wrap("langchain_core", "runnables.base.RunnableSequence.invoke", traced_lcel_runnable_sequence(langchain))
+ wrap("langchain_core", "runnables.base.RunnableSequence.ainvoke", traced_lcel_runnable_sequence_async(langchain))
+ wrap("langchain_core", "runnables.base.RunnableSequence.batch", traced_lcel_runnable_sequence(langchain))
+ wrap("langchain_core", "runnables.base.RunnableSequence.abatch", traced_lcel_runnable_sequence_async(langchain))
+ wrap("langchain_core", "runnables.base.RunnableSequence.stream", traced_chain_stream(langchain))
+ wrap("langchain_core", "runnables.base.RunnableSequence.astream", traced_chain_stream(langchain))
+ wrap(
+ "langchain_core",
+ "language_models.chat_models.BaseChatModel.stream",
+ traced_chat_stream(langchain),
+ )
+ wrap(
+ "langchain_core",
+ "language_models.chat_models.BaseChatModel.astream",
+ traced_chat_stream(langchain),
+ )
+ wrap("langchain_core", "language_models.llms.BaseLLM.stream", traced_llm_stream(langchain))
+ wrap("langchain_core", "language_models.llms.BaseLLM.astream", traced_llm_stream(langchain))
- if PATCH_LANGCHAIN_V0 or langchain_community:
+ wrap("langchain_core", "tools.BaseTool.invoke", traced_base_tool_invoke(langchain))
+ wrap("langchain_core", "tools.BaseTool.ainvoke", traced_base_tool_ainvoke(langchain))
+ if langchain_openai:
+ wrap("langchain_openai", "OpenAIEmbeddings.embed_documents", traced_embedding(langchain))
+ if langchain_pinecone:
+ wrap("langchain_pinecone", "PineconeVectorStore.similarity_search", traced_similarity_search(langchain))
+
+ if langchain_community:
_patch_embeddings_and_vectorstores()
if _is_iast_enabled():
@@ -1365,40 +1338,30 @@ def unpatch():
langchain._datadog_patch = False
- if PATCH_LANGCHAIN_V0:
- unwrap(langchain.llms.base.BaseLLM, "generate")
- unwrap(langchain.llms.base.BaseLLM, "agenerate")
- unwrap(langchain.chat_models.base.BaseChatModel, "generate")
- unwrap(langchain.chat_models.base.BaseChatModel, "agenerate")
- unwrap(langchain.chains.base.Chain, "__call__")
- unwrap(langchain.chains.base.Chain, "acall")
- unwrap(langchain.embeddings.OpenAIEmbeddings, "embed_query")
- unwrap(langchain.embeddings.OpenAIEmbeddings, "embed_documents")
- else:
- unwrap(langchain_core.language_models.llms.BaseLLM, "generate")
- unwrap(langchain_core.language_models.llms.BaseLLM, "agenerate")
- unwrap(langchain_core.language_models.chat_models.BaseChatModel, "generate")
- unwrap(langchain_core.language_models.chat_models.BaseChatModel, "agenerate")
- unwrap(langchain.chains.base.Chain, "invoke")
- unwrap(langchain.chains.base.Chain, "ainvoke")
- unwrap(langchain_core.runnables.base.RunnableSequence, "invoke")
- unwrap(langchain_core.runnables.base.RunnableSequence, "ainvoke")
- unwrap(langchain_core.runnables.base.RunnableSequence, "batch")
- unwrap(langchain_core.runnables.base.RunnableSequence, "abatch")
- unwrap(langchain_core.runnables.base.RunnableSequence, "stream")
- unwrap(langchain_core.runnables.base.RunnableSequence, "astream")
- unwrap(langchain_core.language_models.chat_models.BaseChatModel, "stream")
- unwrap(langchain_core.language_models.chat_models.BaseChatModel, "astream")
- unwrap(langchain_core.language_models.llms.BaseLLM, "stream")
- unwrap(langchain_core.language_models.llms.BaseLLM, "astream")
- unwrap(langchain_core.tools.BaseTool, "invoke")
- unwrap(langchain_core.tools.BaseTool, "ainvoke")
- if langchain_openai:
- unwrap(langchain_openai.OpenAIEmbeddings, "embed_documents")
- if langchain_pinecone:
- unwrap(langchain_pinecone.PineconeVectorStore, "similarity_search")
-
- if PATCH_LANGCHAIN_V0 or langchain_community:
+ unwrap(langchain_core.language_models.llms.BaseLLM, "generate")
+ unwrap(langchain_core.language_models.llms.BaseLLM, "agenerate")
+ unwrap(langchain_core.language_models.chat_models.BaseChatModel, "generate")
+ unwrap(langchain_core.language_models.chat_models.BaseChatModel, "agenerate")
+ unwrap(langchain.chains.base.Chain, "invoke")
+ unwrap(langchain.chains.base.Chain, "ainvoke")
+ unwrap(langchain_core.runnables.base.RunnableSequence, "invoke")
+ unwrap(langchain_core.runnables.base.RunnableSequence, "ainvoke")
+ unwrap(langchain_core.runnables.base.RunnableSequence, "batch")
+ unwrap(langchain_core.runnables.base.RunnableSequence, "abatch")
+ unwrap(langchain_core.runnables.base.RunnableSequence, "stream")
+ unwrap(langchain_core.runnables.base.RunnableSequence, "astream")
+ unwrap(langchain_core.language_models.chat_models.BaseChatModel, "stream")
+ unwrap(langchain_core.language_models.chat_models.BaseChatModel, "astream")
+ unwrap(langchain_core.language_models.llms.BaseLLM, "stream")
+ unwrap(langchain_core.language_models.llms.BaseLLM, "astream")
+ unwrap(langchain_core.tools.BaseTool, "invoke")
+ unwrap(langchain_core.tools.BaseTool, "ainvoke")
+ if langchain_openai:
+ unwrap(langchain_openai.OpenAIEmbeddings, "embed_documents")
+ if langchain_pinecone:
+ unwrap(langchain_pinecone.PineconeVectorStore, "similarity_search")
+
+ if langchain_community:
_unpatch_embeddings_and_vectorstores()
delattr(langchain, "_datadog_integration")
diff --git a/ddtrace/contrib/internal/langgraph/patch.py b/ddtrace/contrib/internal/langgraph/patch.py
index 1da216be9a3..2df7159161a 100644
--- a/ddtrace/contrib/internal/langgraph/patch.py
+++ b/ddtrace/contrib/internal/langgraph/patch.py
@@ -9,7 +9,7 @@
from ddtrace.contrib.trace_utils import wrap
from ddtrace.internal.utils import get_argument_value
from ddtrace.llmobs._integrations.langgraph import LangGraphIntegration
-from ddtrace.pin import Pin
+from ddtrace.trace import Pin
def get_version():
diff --git a/ddtrace/contrib/internal/logging/patch.py b/ddtrace/contrib/internal/logging/patch.py
index 11edd5d938f..fd356597bc0 100644
--- a/ddtrace/contrib/internal/logging/patch.py
+++ b/ddtrace/contrib/internal/logging/patch.py
@@ -80,7 +80,7 @@ def _w_makeRecord(func, instance, args, kwargs):
# logs from internal logger may explicitly pass the current span to
# avoid deadlocks in getting the current span while already in locked code.
span_from_log = getattr(record, _LOG_SPAN_KEY, None)
- if isinstance(span_from_log, ddtrace.Span):
+ if isinstance(span_from_log, ddtrace.trace.Span):
span = span_from_log
if tracer:
diff --git a/ddtrace/contrib/internal/mongoengine/trace.py b/ddtrace/contrib/internal/mongoengine/trace.py
index 93868e096ce..5539cf1d2e4 100644
--- a/ddtrace/contrib/internal/mongoengine/trace.py
+++ b/ddtrace/contrib/internal/mongoengine/trace.py
@@ -29,7 +29,7 @@ def __call__(self, *args, **kwargs):
client = self.__wrapped__(*args, **kwargs)
pin = ddtrace.trace.Pin.get_from(self)
if pin:
- # Calling ddtrace.pin.Pin(...) with the `tracer` argument generates a deprecation warning.
+ # Calling ddtrace.trace.Pin(...) with the `tracer` argument generates a deprecation warning.
# Remove this if statement when the `tracer` argument is removed
if pin.tracer is ddtrace.tracer:
ddtrace.trace.Pin(service=pin.service).onto(client)
diff --git a/ddtrace/contrib/internal/protobuf/schema_iterator.py b/ddtrace/contrib/internal/protobuf/schema_iterator.py
index c783be51312..3c9d2bd4664 100644
--- a/ddtrace/contrib/internal/protobuf/schema_iterator.py
+++ b/ddtrace/contrib/internal/protobuf/schema_iterator.py
@@ -1,12 +1,13 @@
from google.protobuf.descriptor import FieldDescriptor
-# from google._upb._message import Descriptor
-from ddtrace._trace.span import Span
from ddtrace.ext import schema as SCHEMA_TAGS
from ddtrace.internal.datastreams import data_streams_processor
from ddtrace.internal.datastreams.schemas.schema_builder import SchemaBuilder
from ddtrace.internal.datastreams.schemas.schema_iterator import SchemaIterator
+# from google._upb._message import Descriptor
+from ddtrace.trace import Span
+
class SchemaExtractor(SchemaIterator):
SERIALIZATION = "serialization"
diff --git a/ddtrace/contrib/internal/pylibmc/client.py b/ddtrace/contrib/internal/pylibmc/client.py
index 5321b533293..5c48e8465f8 100644
--- a/ddtrace/contrib/internal/pylibmc/client.py
+++ b/ddtrace/contrib/internal/pylibmc/client.py
@@ -51,7 +51,7 @@ def __init__(self, client=None, service=memcached.SERVICE, tracer=None, *args, *
super(TracedClient, self).__init__(client)
schematized_service = schematize_service_name(service)
- # Calling ddtrace.pin.Pin(...) with the `tracer` argument generates a deprecation warning.
+ # Calling ddtrace.trace.Pin(...) with the `tracer` argument generates a deprecation warning.
# Remove this if statement when the `tracer` argument is removed
if tracer is ddtrace.tracer:
pin = ddtrace.trace.Pin(service=schematized_service)
diff --git a/ddtrace/contrib/internal/pymemcache/patch.py b/ddtrace/contrib/internal/pymemcache/patch.py
index dd3687cd248..0a8521836e9 100644
--- a/ddtrace/contrib/internal/pymemcache/patch.py
+++ b/ddtrace/contrib/internal/pymemcache/patch.py
@@ -3,9 +3,9 @@
from ddtrace._trace.pin import _DD_PIN_NAME
from ddtrace._trace.pin import _DD_PIN_PROXY_NAME
-from ddtrace._trace.pin import Pin
from ddtrace.ext import memcached as memcachedx
from ddtrace.internal.schema import schematize_service_name
+from ddtrace.trace import Pin
from .client import WrappedClient
from .client import WrappedHashClient
diff --git a/ddtrace/contrib/internal/pytest/plugin.py b/ddtrace/contrib/internal/pytest/plugin.py
index 52cf54a6f9c..6ca4ad91afe 100644
--- a/ddtrace/contrib/internal/pytest/plugin.py
+++ b/ddtrace/contrib/internal/pytest/plugin.py
@@ -145,7 +145,7 @@ def pytest_addhooks(pluginmanager):
@pytest.fixture(scope="function")
def ddspan(request):
- """Return the :class:`ddtrace._trace.span.Span` instance associated with the
+ """Return the :class:`ddtrace.trace.Span` instance associated with the
current test when Datadog CI Visibility is enabled.
"""
from ddtrace.internal.ci_visibility import CIVisibility as _CIVisibility
diff --git a/ddtrace/contrib/internal/selenium/patch.py b/ddtrace/contrib/internal/selenium/patch.py
index 5e8d2ed87bc..fc229011fd2 100644
--- a/ddtrace/contrib/internal/selenium/patch.py
+++ b/ddtrace/contrib/internal/selenium/patch.py
@@ -7,7 +7,7 @@
from ddtrace import config
from ddtrace.internal.logger import get_logger
from ddtrace.internal.wrapping.context import WrappingContext
-import ddtrace.tracer
+from ddtrace.trace import tracer
if t.TYPE_CHECKING:
@@ -87,7 +87,7 @@ def __return__(self, value: T) -> T:
class SeleniumGetWrappingContext(SeleniumWrappingContextBase):
def _handle_return(self) -> None:
- root_span = ddtrace.tracer.current_root_span()
+ root_span = tracer.current_root_span()
test_trace_id = root_span.trace_id
if root_span is None or root_span.get_tag("type") != "test":
@@ -127,7 +127,7 @@ def _handle_return(self) -> None:
class SeleniumQuitWrappingContext(SeleniumWrappingContextBase):
def _handle_enter(self) -> None:
- root_span = ddtrace.tracer.current_root_span()
+ root_span = tracer.current_root_span()
if root_span is None or root_span.get_tag("type") != "test":
return
diff --git a/ddtrace/contrib/internal/sqlalchemy/engine.py b/ddtrace/contrib/internal/sqlalchemy/engine.py
index 6e123c97db8..a3dcb324700 100644
--- a/ddtrace/contrib/internal/sqlalchemy/engine.py
+++ b/ddtrace/contrib/internal/sqlalchemy/engine.py
@@ -2,7 +2,7 @@
To trace sqlalchemy queries, add instrumentation to the engine class or
instance you are using::
- from ddtrace import tracer
+ from ddtrace.trace import tracer
from ddtrace.contrib.sqlalchemy import trace_engine
from sqlalchemy import create_engine
@@ -37,7 +37,7 @@ def trace_engine(engine, tracer=None, service=None):
Add tracing instrumentation to the given sqlalchemy engine or instance.
:param sqlalchemy.Engine engine: a SQLAlchemy engine class or instance
- :param ddtrace.Tracer tracer: a tracer instance. will default to the global
+ :param ddtrace.trace.Tracer tracer: a tracer instance. will default to the global
:param str service: the name of the service to trace.
"""
tracer = tracer or ddtrace.tracer # by default use global
@@ -67,7 +67,7 @@ def __init__(self, tracer, service, engine):
self.name = schematize_database_operation("%s.query" % self.vendor, database_provider=self.vendor)
# attach the PIN
- # Calling ddtrace.pin.Pin(...) with the `tracer` argument generates a deprecation warning.
+ # Calling ddtrace.trace.Pin(...) with the `tracer` argument generates a deprecation warning.
# Remove this if statement when the `tracer` argument is removed
if self.tracer is ddtrace.tracer:
Pin(service=self.service).onto(engine)
diff --git a/ddtrace/contrib/internal/starlette/patch.py b/ddtrace/contrib/internal/starlette/patch.py
index e2ea8f9f4dc..02d47f8d47c 100644
--- a/ddtrace/contrib/internal/starlette/patch.py
+++ b/ddtrace/contrib/internal/starlette/patch.py
@@ -13,7 +13,6 @@
from wrapt import wrap_function_wrapper as _w
from ddtrace import config
-from ddtrace._trace.span import Span # noqa:F401
from ddtrace.appsec._iast import _is_iast_enabled
from ddtrace.contrib import trace_utils
from ddtrace.contrib.asgi import TraceMiddleware
@@ -28,6 +27,7 @@
from ddtrace.internal.utils import set_argument_value
from ddtrace.internal.utils.wrappers import unwrap as _u
from ddtrace.trace import Pin
+from ddtrace.trace import Span # noqa:F401
from ddtrace.vendor.packaging.version import parse as parse_version
diff --git a/ddtrace/contrib/internal/tornado/application.py b/ddtrace/contrib/internal/tornado/application.py
index 993a6d27c46..f36857b81b1 100644
--- a/ddtrace/contrib/internal/tornado/application.py
+++ b/ddtrace/contrib/internal/tornado/application.py
@@ -56,7 +56,7 @@ def tracer_config(__init__, app, args, kwargs):
# configure the PIN object for template rendering
# Required for backwards compatibility. Remove the else clause when
- # the `ddtrace.Pin` object no longer accepts the Pin argument.
+ # the `ddtrace.trace.Pin` object no longer accepts the Pin argument.
if tracer is ddtrace.tracer:
ddtrace.trace.Pin(service=service).onto(template)
else:
diff --git a/ddtrace/contrib/internal/tornado/stack_context.py b/ddtrace/contrib/internal/tornado/stack_context.py
index 7f0910eedeb..a6978c7f25c 100644
--- a/ddtrace/contrib/internal/tornado/stack_context.py
+++ b/ddtrace/contrib/internal/tornado/stack_context.py
@@ -3,7 +3,7 @@
from ddtrace._trace.provider import BaseContextProvider
from ddtrace._trace.provider import DefaultContextProvider
-from ddtrace.span import Span
+from ddtrace.trace import Span
# tornado.stack_context deprecated in Tornado 5 removed in Tornado 6
diff --git a/ddtrace/contrib/internal/trace_utils.py b/ddtrace/contrib/internal/trace_utils.py
index 5781c3f30df..e89dc39f1d7 100644
--- a/ddtrace/contrib/internal/trace_utils.py
+++ b/ddtrace/contrib/internal/trace_utils.py
@@ -40,9 +40,9 @@
if TYPE_CHECKING: # pragma: no cover
- from ddtrace import Span # noqa:F401
- from ddtrace import Tracer # noqa:F401
from ddtrace.settings import IntegrationConfig # noqa:F401
+ from ddtrace.trace import Span # noqa:F401
+ from ddtrace.trace import Tracer # noqa:F401
log = get_logger(__name__)
@@ -130,7 +130,7 @@ def _store_headers(headers, span, integration_config, request_or_response):
:param headers: A dict of http headers to be stored in the span
:type headers: dict or list
:param span: The Span instance where tags will be stored
- :type span: ddtrace._trace.span.Span
+ :type span: ddtrace.trace.Span
:param integration_config: An integration specific config object.
:type integration_config: ddtrace.settings.IntegrationConfig
"""
@@ -257,7 +257,7 @@ def _store_request_headers(headers, span, integration_config):
:param headers: All the request's http headers, will be filtered through the whitelist
:type headers: dict or list
:param span: The Span instance where tags will be stored
- :type span: ddtrace.Span
+ :type span: ddtrace.trace.Span
:param integration_config: An integration specific config object.
:type integration_config: ddtrace.settings.IntegrationConfig
"""
@@ -271,7 +271,7 @@ def _store_response_headers(headers, span, integration_config):
:param headers: All the response's http headers, will be filtered through the whitelist
:type headers: dict or list
:param span: The Span instance where tags will be stored
- :type span: ddtrace.Span
+ :type span: ddtrace.trace.Span
:param integration_config: An integration specific config object.
:type integration_config: ddtrace.settings.IntegrationConfig
"""
diff --git a/ddtrace/contrib/internal/unittest/patch.py b/ddtrace/contrib/internal/unittest/patch.py
index 74ce8d1d6a0..3f808090f55 100644
--- a/ddtrace/contrib/internal/unittest/patch.py
+++ b/ddtrace/contrib/internal/unittest/patch.py
@@ -129,7 +129,7 @@ def _is_marked_as_unskippable(test_object) -> bool:
)
-def _update_skipped_elements_and_set_tags(test_module_span: ddtrace.Span, test_session_span: ddtrace.Span):
+def _update_skipped_elements_and_set_tags(test_module_span: ddtrace.trace.Span, test_session_span: ddtrace.trace.Span):
global _global_skipped_elements
_global_skipped_elements += 1
@@ -141,7 +141,7 @@ def _update_skipped_elements_and_set_tags(test_module_span: ddtrace.Span, test_s
test_session_span.set_tag_str(test.ITR_DD_CI_ITR_TESTS_SKIPPED, "true")
-def _store_test_span(item, span: ddtrace.Span):
+def _store_test_span(item, span: ddtrace.trace.Span):
"""Store datadog span at `unittest` test instance."""
item._datadog_span = span
@@ -172,7 +172,7 @@ def _is_test(item) -> bool:
return True
-def _extract_span(item) -> Union[ddtrace.Span, None]:
+def _extract_span(item) -> Union[ddtrace.trace.Span, None]:
return getattr(item, "_datadog_span", None)
@@ -187,23 +187,23 @@ def _extract_test_method_name(test_object) -> str:
return getattr(test_object, "_testMethodName", "")
-def _extract_session_span() -> Union[ddtrace.Span, None]:
+def _extract_session_span() -> Union[ddtrace.trace.Span, None]:
return getattr(_CIVisibility, "_datadog_session_span", None)
-def _extract_module_span(module_identifier: str) -> Union[ddtrace.Span, None]:
+def _extract_module_span(module_identifier: str) -> Union[ddtrace.trace.Span, None]:
if hasattr(_CIVisibility, "_unittest_data") and module_identifier in _CIVisibility._unittest_data["modules"]:
return _CIVisibility._unittest_data["modules"][module_identifier].get("module_span")
return None
-def _extract_suite_span(suite_identifier: str) -> Union[ddtrace.Span, None]:
+def _extract_suite_span(suite_identifier: str) -> Union[ddtrace.trace.Span, None]:
if hasattr(_CIVisibility, "_unittest_data") and suite_identifier in _CIVisibility._unittest_data["suites"]:
return _CIVisibility._unittest_data["suites"][suite_identifier].get("suite_span")
return None
-def _update_status_item(item: ddtrace.Span, status: str):
+def _update_status_item(item: ddtrace.trace.Span, status: str):
"""
Sets the status for each Span implementing the test FAIL logic override.
"""
@@ -266,7 +266,7 @@ def _generate_session_resource(test_command: str) -> str:
return "{}".format(test_command)
-def _set_test_skipping_tags_to_span(span: ddtrace.Span):
+def _set_test_skipping_tags_to_span(span: ddtrace.trace.Span):
span.set_tag_str(test.ITR_TEST_SKIPPING_ENABLED, "true")
span.set_tag_str(test.ITR_TEST_SKIPPING_TYPE, TEST)
span.set_tag_str(test.ITR_TEST_SKIPPING_TESTS_SKIPPED, "false")
@@ -368,7 +368,10 @@ def _finish_remaining_suites_and_modules(seen_suites: dict, seen_modules: dict):
def _update_remaining_suites_and_modules(
- test_module_suite_path: str, test_module_path: str, test_module_span: ddtrace.Span, test_suite_span: ddtrace.Span
+ test_module_suite_path: str,
+ test_module_path: str,
+ test_module_span: ddtrace.trace.Span,
+ test_suite_span: ddtrace.trace.Span,
):
"""
Updates the remaining test suite and test counter and finishes spans when these have finished their execution.
@@ -384,7 +387,7 @@ def _update_remaining_suites_and_modules(
_finish_span(test_module_span)
-def _update_test_skipping_count_span(span: ddtrace.Span):
+def _update_test_skipping_count_span(span: ddtrace.trace.Span):
if _CIVisibility.test_skipping_enabled():
span.set_metric(test.ITR_TEST_SKIPPING_COUNT, _global_skipped_elements)
@@ -622,7 +625,7 @@ def collect_text_test_runner_session(func, instance: unittest.TestSuite, args: t
return result
-def _start_test_session_span(instance) -> ddtrace.Span:
+def _start_test_session_span(instance) -> ddtrace.trace.Span:
"""
Starts a test session span and sets the required tags for a `unittest` session instance.
"""
@@ -663,7 +666,7 @@ def _start_test_session_span(instance) -> ddtrace.Span:
return test_session_span
-def _start_test_module_span(instance) -> ddtrace.Span:
+def _start_test_module_span(instance) -> ddtrace.trace.Span:
"""
Starts a test module span and sets the required tags for a `unittest` module instance.
"""
@@ -706,7 +709,7 @@ def _start_test_module_span(instance) -> ddtrace.Span:
return test_module_span
-def _start_test_suite_span(instance) -> ddtrace.Span:
+def _start_test_suite_span(instance) -> ddtrace.trace.Span:
"""
Starts a test suite span and sets the required tags for a `unittest` suite instance.
"""
@@ -742,7 +745,7 @@ def _start_test_suite_span(instance) -> ddtrace.Span:
return test_suite_span
-def _start_test_span(instance, test_suite_span: ddtrace.Span) -> ddtrace.Span:
+def _start_test_span(instance, test_suite_span: ddtrace.trace.Span) -> ddtrace.trace.Span:
"""
Starts a test span and sets the required tags for a `unittest` test instance.
"""
@@ -787,7 +790,7 @@ def _start_test_span(instance, test_suite_span: ddtrace.Span) -> ddtrace.Span:
return span
-def _finish_span(current_span: ddtrace.Span):
+def _finish_span(current_span: ddtrace.trace.Span):
"""
Finishes active span and populates span status upwards
"""
diff --git a/ddtrace/contrib/internal/wsgi/wsgi.py b/ddtrace/contrib/internal/wsgi/wsgi.py
index 44e1646f5f9..f5558792061 100644
--- a/ddtrace/contrib/internal/wsgi/wsgi.py
+++ b/ddtrace/contrib/internal/wsgi/wsgi.py
@@ -11,10 +11,10 @@
from typing import Mapping # noqa:F401
from typing import Optional # noqa:F401
- from ddtrace import Span # noqa:F401
- from ddtrace import Tracer # noqa:F401
from ddtrace.settings import Config # noqa:F401
from ddtrace.trace import Pin # noqa:F401
+ from ddtrace.trace import Span # noqa:F401
+ from ddtrace.trace import Tracer # noqa:F401
from urllib.parse import quote
diff --git a/ddtrace/contrib/tornado.py b/ddtrace/contrib/tornado.py
index 1ef28d06330..8c7b8138305 100644
--- a/ddtrace/contrib/tornado.py
+++ b/ddtrace/contrib/tornado.py
@@ -8,7 +8,7 @@
The following is an example::
# patch before importing tornado and concurrent.futures
- from ddtrace import tracer, patch
+ from ddtrace.trace import tracer, patch
patch(tornado=True)
import tornado.web
diff --git a/ddtrace/debugging/_debugger.py b/ddtrace/debugging/_debugger.py
index c36bb94fdfb..bbfa19ac2c2 100644
--- a/ddtrace/debugging/_debugger.py
+++ b/ddtrace/debugging/_debugger.py
@@ -23,7 +23,6 @@
import ddtrace
from ddtrace import config as ddconfig
-from ddtrace._trace.tracer import Tracer
from ddtrace.debugging._config import di_config
from ddtrace.debugging._function.discovery import FunctionDiscovery
from ddtrace.debugging._function.store import FullyNamedContextWrappedFunction
@@ -55,6 +54,7 @@
from ddtrace.internal.remoteconfig.worker import remoteconfig_poller
from ddtrace.internal.service import Service
from ddtrace.internal.wrapping.context import WrappingContext
+from ddtrace.trace import Tracer
log = get_logger(__name__)
diff --git a/ddtrace/debugging/_exception/replay.py b/ddtrace/debugging/_exception/replay.py
index c9da69bb5b2..424bdcbd147 100644
--- a/ddtrace/debugging/_exception/replay.py
+++ b/ddtrace/debugging/_exception/replay.py
@@ -8,7 +8,6 @@
import typing as t
import uuid
-from ddtrace._trace.span import Span
from ddtrace.debugging._probe.model import LiteralTemplateSegment
from ddtrace.debugging._probe.model import LogLineProbe
from ddtrace.debugging._signal.snapshot import DEFAULT_CAPTURE_LIMITS
@@ -22,6 +21,7 @@
from ddtrace.internal.rate_limiter import RateLimitExceeded
from ddtrace.internal.utils.time import HourGlass
from ddtrace.settings.exception_replay import config
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/debugging/_origin/span.py b/ddtrace/debugging/_origin/span.py
index e7831c38ffb..9044797d252 100644
--- a/ddtrace/debugging/_origin/span.py
+++ b/ddtrace/debugging/_origin/span.py
@@ -31,7 +31,7 @@
from ddtrace.internal.utils.inspection import functions_for_code
from ddtrace.internal.wrapping.context import WrappingContext
from ddtrace.settings.code_origin import config as co_config
-from ddtrace.span import Span
+from ddtrace.trace import Span
def frame_stack(frame: FrameType) -> t.Iterator[FrameType]:
diff --git a/ddtrace/debugging/_signal/model.py b/ddtrace/debugging/_signal/model.py
index 9c9448677c0..5d41c64f2ff 100644
--- a/ddtrace/debugging/_signal/model.py
+++ b/ddtrace/debugging/_signal/model.py
@@ -18,8 +18,6 @@
from typing import cast
from uuid import uuid4
-from ddtrace._trace.context import Context
-from ddtrace._trace.span import Span
from ddtrace.debugging._expressions import DDExpressionEvaluationError
from ddtrace.debugging._probe.model import Probe
from ddtrace.debugging._probe.model import ProbeConditionMixin
@@ -31,6 +29,8 @@
from ddtrace.internal.metrics import Metrics
from ddtrace.internal.rate_limiter import BudgetRateLimiterWithJitter as RateLimiter
from ddtrace.internal.rate_limiter import RateLimitExceeded
+from ddtrace.trace import Context
+from ddtrace.trace import Span
@dataclass
diff --git a/ddtrace/debugging/_signal/tracing.py b/ddtrace/debugging/_signal/tracing.py
index d509e336d52..37d90c918c1 100644
--- a/ddtrace/debugging/_signal/tracing.py
+++ b/ddtrace/debugging/_signal/tracing.py
@@ -3,7 +3,6 @@
import typing as t
import ddtrace
-from ddtrace._trace.span import Span
from ddtrace.constants import _ORIGIN_KEY
from ddtrace.debugging._expressions import DDExpressionEvaluationError
from ddtrace.debugging._probe.model import Probe
@@ -20,6 +19,7 @@
from ddtrace.internal.compat import ExcInfoType
from ddtrace.internal.logger import get_logger
from ddtrace.internal.safety import _isinstance
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/ext/aws.py b/ddtrace/ext/aws.py
index 4c4bc8c0dea..acc0a6425e9 100644
--- a/ddtrace/ext/aws.py
+++ b/ddtrace/ext/aws.py
@@ -4,7 +4,7 @@
if TYPE_CHECKING: # pragma: no cover
- from ddtrace._trace.span import Span # noqa:F401
+ from ddtrace.trace import Span # noqa:F401
def truncate_arg_value(value, max_len=1024):
diff --git a/ddtrace/ext/test_visibility/api.py b/ddtrace/ext/test_visibility/api.py
index cdcbb7a672c..c6e96406e88 100644
--- a/ddtrace/ext/test_visibility/api.py
+++ b/ddtrace/ext/test_visibility/api.py
@@ -40,11 +40,13 @@
from ddtrace.ext.test_visibility._utils import _set_item_tags
from ddtrace.internal import core
from ddtrace.internal.logger import get_logger as _get_logger
-import ddtrace.tracing # noqa: F401 -- this triggers the registration of trace handlers
log = _get_logger(__name__)
+# this triggers the registration of trace handlers after civis startup
+import ddtrace._trace.trace_handlers # noqa: F401, E402
+
class TestStatus(Enum):
__test__ = False
diff --git a/ddtrace/internal/ci_visibility/api/_base.py b/ddtrace/internal/ci_visibility/api/_base.py
index 1e56d6b00b6..d31c79faffe 100644
--- a/ddtrace/internal/ci_visibility/api/_base.py
+++ b/ddtrace/internal/ci_visibility/api/_base.py
@@ -13,8 +13,6 @@
from typing import TypeVar
from typing import Union
-from ddtrace import Span
-from ddtrace import Tracer
from ddtrace.constants import SPAN_KIND
from ddtrace.ext import SpanTypes
from ddtrace.ext import test
@@ -40,6 +38,8 @@
from ddtrace.internal.logger import get_logger
from ddtrace.internal.test_visibility._atr_mixins import AutoTestRetriesSettings
from ddtrace.internal.test_visibility.coverage_lines import CoverageLines
+from ddtrace.trace import Span
+from ddtrace.trace import Tracer
if typing.TYPE_CHECKING:
@@ -76,7 +76,7 @@ class TestVisibilitySessionSettings:
def __post_init__(self):
if not isinstance(self.tracer, Tracer):
- raise TypeError("tracer must be a ddtrace.Tracer")
+ raise TypeError("tracer must be a ddtrace.trace.Tracer")
if not isinstance(self.workspace_path, Path):
raise TypeError("root_dir must be a pathlib.Path")
if not self.workspace_path.is_absolute():
diff --git a/ddtrace/internal/ci_visibility/coverage.py b/ddtrace/internal/ci_visibility/coverage.py
index 3d561a4f7ae..7dde0d3b009 100644
--- a/ddtrace/internal/ci_visibility/coverage.py
+++ b/ddtrace/internal/ci_visibility/coverage.py
@@ -131,7 +131,7 @@ def _switch_coverage_context(
def _report_coverage_to_span(
- coverage_data: Coverage, span: ddtrace.Span, root_dir: str, framework: Optional[TEST_FRAMEWORKS] = None
+ coverage_data: Coverage, span: ddtrace.trace.Span, root_dir: str, framework: Optional[TEST_FRAMEWORKS] = None
):
# Experimental feature to use internal coverage collection
if USE_DD_COVERAGE:
diff --git a/ddtrace/internal/ci_visibility/filters.py b/ddtrace/internal/ci_visibility/filters.py
index f1b22d97e13..a1a95c2cb27 100644
--- a/ddtrace/internal/ci_visibility/filters.py
+++ b/ddtrace/internal/ci_visibility/filters.py
@@ -12,7 +12,7 @@
if TYPE_CHECKING:
- from ddtrace import Span # noqa:F401
+ from ddtrace.trace import Span # noqa:F401
class TraceCiVisibilityFilter(TraceFilter):
diff --git a/ddtrace/internal/ci_visibility/git_client.py b/ddtrace/internal/ci_visibility/git_client.py
index 6152fa12679..469268f5171 100644
--- a/ddtrace/internal/ci_visibility/git_client.py
+++ b/ddtrace/internal/ci_visibility/git_client.py
@@ -11,7 +11,6 @@
from typing import Tuple # noqa:F401
from urllib.parse import urljoin
-from ddtrace import Tracer # noqa: F401
from ddtrace.ext import ci
from ddtrace.ext.git import _build_git_packfiles_with_details
from ddtrace.ext.git import _extract_clone_defaultremotename_with_details
@@ -29,6 +28,7 @@
from ddtrace.internal.compat import JSONDecodeError
from ddtrace.internal.logger import get_logger
from ddtrace.internal.utils.retry import fibonacci_backoff_with_jitter
+from ddtrace.trace import Tracer # noqa: F401
from .. import compat
from .. import telemetry
diff --git a/ddtrace/internal/ci_visibility/recorder.py b/ddtrace/internal/ci_visibility/recorder.py
index 34cc543f11d..a8474ca0fd9 100644
--- a/ddtrace/internal/ci_visibility/recorder.py
+++ b/ddtrace/internal/ci_visibility/recorder.py
@@ -12,7 +12,6 @@
from typing import Union # noqa:F401
import ddtrace
-from ddtrace import Tracer
from ddtrace import config as ddconfig
from ddtrace.contrib import trace_utils
from ddtrace.ext import ci
@@ -85,6 +84,7 @@
from ddtrace.internal.utils.formats import asbool
from ddtrace.internal.utils.http import verify_url
from ddtrace.internal.writer.writer import Response
+from ddtrace.trace import Tracer
if TYPE_CHECKING: # pragma: no cover
diff --git a/ddtrace/internal/ci_visibility/utils.py b/ddtrace/internal/ci_visibility/utils.py
index d111305e317..770c574e98d 100644
--- a/ddtrace/internal/ci_visibility/utils.py
+++ b/ddtrace/internal/ci_visibility/utils.py
@@ -50,7 +50,7 @@ def get_source_lines_for_test_method(
def _add_start_end_source_file_path_data_to_span(
- span: ddtrace.Span, test_method_object, test_name: str, repo_directory: str
+ span: ddtrace.trace.Span, test_method_object, test_name: str, repo_directory: str
):
if not test_method_object:
log.debug(
@@ -75,7 +75,7 @@ def _add_start_end_source_file_path_data_to_span(
span.set_tag(test.SOURCE_END, end_line)
-def _add_pct_covered_to_span(coverage_data: dict, span: ddtrace.Span):
+def _add_pct_covered_to_span(coverage_data: dict, span: ddtrace.trace.Span):
if not coverage_data or PCT_COVERED_KEY not in coverage_data:
log.warning("Tried to add total covered percentage to session span but no data was found")
return
diff --git a/ddtrace/internal/core/__init__.py b/ddtrace/internal/core/__init__.py
index 3c2169d4cb1..0235925dcde 100644
--- a/ddtrace/internal/core/__init__.py
+++ b/ddtrace/internal/core/__init__.py
@@ -276,7 +276,7 @@ def span(self) -> "Span":
if self._inner_span is None:
log.warning("No span found in ExecutionContext %s", self.identifier)
# failsafe
- from ddtrace import tracer
+ from ddtrace.trace import tracer
self._inner_span = tracer.current_span() or tracer.trace("default")
return self._inner_span
diff --git a/ddtrace/internal/debug.py b/ddtrace/internal/debug.py
index ec4048b59d0..2a285423e4c 100644
--- a/ddtrace/internal/debug.py
+++ b/ddtrace/internal/debug.py
@@ -22,7 +22,7 @@
if TYPE_CHECKING: # pragma: no cover
- from ddtrace import Tracer # noqa:F401
+ from ddtrace.trace import Tracer # noqa:F401
logger = get_logger(__name__)
diff --git a/ddtrace/internal/opentelemetry/context.py b/ddtrace/internal/opentelemetry/context.py
index d0f7294eed5..63aacdc1c3b 100644
--- a/ddtrace/internal/opentelemetry/context.py
+++ b/ddtrace/internal/opentelemetry/context.py
@@ -1,9 +1,9 @@
-from ddtrace import tracer as ddtracer
from ddtrace._trace.context import Context as DDContext
from ddtrace._trace.provider import BaseContextProvider as DDBaseContextProvider # noqa:F401
from ddtrace._trace.span import Span as DDSpan
from ddtrace.internal.logger import get_logger
from ddtrace.propagation.http import _TraceContext
+from ddtrace.trace import tracer as ddtracer
log = get_logger(__name__)
diff --git a/ddtrace/internal/opentelemetry/span.py b/ddtrace/internal/opentelemetry/span.py
index acb5e066311..321368d0d81 100644
--- a/ddtrace/internal/opentelemetry/span.py
+++ b/ddtrace/internal/opentelemetry/span.py
@@ -11,7 +11,6 @@
from opentelemetry.trace.span import TraceState
from ddtrace import config
-from ddtrace import tracer as ddtracer
from ddtrace.constants import ERROR_MSG
from ddtrace.constants import ERROR_STACK
from ddtrace.constants import ERROR_TYPE
@@ -20,6 +19,7 @@
from ddtrace.internal.utils.formats import flatten_key_value
from ddtrace.internal.utils.formats import is_sequence
from ddtrace.internal.utils.http import w3c_tracestate_add_p
+from ddtrace.trace import tracer as ddtracer
if TYPE_CHECKING:
diff --git a/ddtrace/internal/opentelemetry/trace.py b/ddtrace/internal/opentelemetry/trace.py
index 21d9be57266..20a9e86f6e0 100644
--- a/ddtrace/internal/opentelemetry/trace.py
+++ b/ddtrace/internal/opentelemetry/trace.py
@@ -30,8 +30,8 @@
from opentelemetry.trace import Link as OtelLink # noqa:F401
from opentelemetry.util.types import AttributeValue as OtelAttributeValue # noqa:F401
- from ddtrace import Tracer as DDTracer # noqa:F401
from ddtrace._trace.span import _MetaDictType # noqa:F401
+ from ddtrace.trace import Tracer as DDTracer # noqa:F401
log = get_logger(__name__)
@@ -103,7 +103,7 @@ def start_span(
curr_otel_span = get_current_span(context)
if curr_otel_span is INVALID_SPAN:
# There is no active datadog/otel span
- dd_active = None # type: Optional[Union[ddtrace.trace.Context, ddtrace.Span]]
+ dd_active = None # type: Optional[Union[ddtrace.trace.Context, ddtrace.trace.Span]]
elif isinstance(curr_otel_span, Span):
# Get underlying ddtrace span from the active otel span
dd_active = curr_otel_span._ddspan
diff --git a/ddtrace/internal/processor/stats.py b/ddtrace/internal/processor/stats.py
index 295a6e289a2..3addd561c79 100644
--- a/ddtrace/internal/processor/stats.py
+++ b/ddtrace/internal/processor/stats.py
@@ -29,7 +29,7 @@
from typing import Optional # noqa:F401
from typing import Union # noqa:F401
- from ddtrace import Span # noqa:F401
+ from ddtrace.trace import Span # noqa:F401
log = get_logger(__name__)
diff --git a/ddtrace/internal/remoteconfig/_pubsub.py b/ddtrace/internal/remoteconfig/_pubsub.py
index f6b366fa792..6db1690e4d0 100644
--- a/ddtrace/internal/remoteconfig/_pubsub.py
+++ b/ddtrace/internal/remoteconfig/_pubsub.py
@@ -73,8 +73,8 @@ def __init__(self, _preprocess_results, callback, name="Default"):
from typing import Any # noqa:F401
from typing import Optional # noqa:F401
- from ddtrace import Tracer # noqa:F401
from ddtrace.internal.remoteconfig._connectors import PublisherSubscriberConnector # noqa:F401
+ from ddtrace.trace import Tracer # noqa:F401
log = get_logger(__name__)
diff --git a/ddtrace/internal/remoteconfig/_subscribers.py b/ddtrace/internal/remoteconfig/_subscribers.py
index 6a112f54d66..c5a5aa7eb61 100644
--- a/ddtrace/internal/remoteconfig/_subscribers.py
+++ b/ddtrace/internal/remoteconfig/_subscribers.py
@@ -10,9 +10,9 @@
from typing import Callable # noqa:F401
from typing import Optional # noqa:F401
- from ddtrace import Tracer # noqa:F401
from ddtrace.internal.remoteconfig._connectors import PublisherSubscriberConnector # noqa:F401
from ddtrace.internal.remoteconfig._connectors import SharedDataType # noqa:F401
+ from ddtrace.trace import Tracer # noqa:F401
log = get_logger(__name__)
diff --git a/ddtrace/internal/runtime/runtime_metrics.py b/ddtrace/internal/runtime/runtime_metrics.py
index 4f214b54645..a71cd2cb805 100644
--- a/ddtrace/internal/runtime/runtime_metrics.py
+++ b/ddtrace/internal/runtime/runtime_metrics.py
@@ -78,7 +78,7 @@ def __init__(self, interval=_get_interval_or_default(), tracer=ddtrace.tracer, d
self._dogstatsd_client: DogStatsd = get_dogstatsd_client(
self.dogstatsd_url or ddtrace.internal.agent.get_stats_url()
)
- self.tracer: Optional[ddtrace.Tracer] = tracer
+ self.tracer: Optional[ddtrace.trace.Tracer] = tracer
self._runtime_metrics: RuntimeMetrics = RuntimeMetrics()
self._services: Set[str] = set()
@@ -114,7 +114,7 @@ def _restart(cls):
@classmethod
def enable(cls, flush_interval=None, tracer=None, dogstatsd_url=None):
- # type: (Optional[float], Optional[ddtrace.Tracer], Optional[str]) -> None
+ # type: (Optional[float], Optional[ddtrace.trace.Tracer], Optional[str]) -> None
with cls._lock:
if cls._instance is not None:
return
diff --git a/ddtrace/internal/test_visibility/_utils.py b/ddtrace/internal/test_visibility/_utils.py
index 14cbd946aeb..0e22a15dc94 100644
--- a/ddtrace/internal/test_visibility/_utils.py
+++ b/ddtrace/internal/test_visibility/_utils.py
@@ -1,7 +1,7 @@
-from ddtrace import Span
from ddtrace.ext.test_visibility._test_visibility_base import TestVisibilityItemId
from ddtrace.internal import core
from ddtrace.internal.logger import get_logger
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/internal/test_visibility/api.py b/ddtrace/internal/test_visibility/api.py
index 4c11135b76d..041f929e3a9 100644
--- a/ddtrace/internal/test_visibility/api.py
+++ b/ddtrace/internal/test_visibility/api.py
@@ -2,8 +2,6 @@
import typing as t
from typing import NamedTuple
-from ddtrace import Span
-from ddtrace import Tracer
from ddtrace.ext.test_visibility import api as ext_api
from ddtrace.ext.test_visibility._test_visibility_base import TestSessionId
from ddtrace.ext.test_visibility._utils import _catch_and_log_exceptions
@@ -21,6 +19,8 @@
from ddtrace.internal.test_visibility._internal_item_ids import InternalTestId
from ddtrace.internal.test_visibility._itr_mixins import ITRMixin
from ddtrace.internal.test_visibility._utils import _get_item_span
+from ddtrace.trace import Span
+from ddtrace.trace import Tracer
log = get_logger(__name__)
diff --git a/ddtrace/internal/tracemethods.py b/ddtrace/internal/tracemethods.py
index cdf16c3b785..5328797c09f 100644
--- a/ddtrace/internal/tracemethods.py
+++ b/ddtrace/internal/tracemethods.py
@@ -172,7 +172,7 @@ def _(m):
def trace_wrapper(wrapped, instance, args, kwargs):
- from ddtrace import tracer
+ from ddtrace.trace import tracer
resource = wrapped.__name__
if hasattr(instance, "__class__") and instance.__class__ is not type(None): # noqa: E721
diff --git a/ddtrace/internal/writer/writer.py b/ddtrace/internal/writer/writer.py
index 357fcf3917f..da3f09a99b1 100644
--- a/ddtrace/internal/writer/writer.py
+++ b/ddtrace/internal/writer/writer.py
@@ -43,7 +43,7 @@
from typing import Any # noqa:F401
from typing import Tuple # noqa:F401
- from ddtrace import Span # noqa:F401
+ from ddtrace.trace import Span # noqa:F401
from .agent import ConnectionType # noqa:F401
diff --git a/ddtrace/llmobs/_evaluators/runner.py b/ddtrace/llmobs/_evaluators/runner.py
index 056a80000e4..3d800fe67a6 100644
--- a/ddtrace/llmobs/_evaluators/runner.py
+++ b/ddtrace/llmobs/_evaluators/runner.py
@@ -2,7 +2,6 @@
import os
from typing import Dict
-from ddtrace import Span
from ddtrace.internal import forksafe
from ddtrace.internal.logger import get_logger
from ddtrace.internal.periodic import PeriodicService
@@ -12,6 +11,7 @@
from ddtrace.llmobs._evaluators.ragas.context_precision import RagasContextPrecisionEvaluator
from ddtrace.llmobs._evaluators.ragas.faithfulness import RagasFaithfulnessEvaluator
from ddtrace.llmobs._evaluators.sampler import EvaluatorRunnerSampler
+from ddtrace.trace import Span
logger = get_logger(__name__)
diff --git a/ddtrace/llmobs/_integrations/anthropic.py b/ddtrace/llmobs/_integrations/anthropic.py
index dfb39c0f7e9..a3224a083cd 100644
--- a/ddtrace/llmobs/_integrations/anthropic.py
+++ b/ddtrace/llmobs/_integrations/anthropic.py
@@ -5,7 +5,6 @@
from typing import List
from typing import Optional
-from ddtrace._trace.span import Span
from ddtrace.internal.logger import get_logger
from ddtrace.llmobs._constants import INPUT_MESSAGES
from ddtrace.llmobs._constants import INPUT_TOKENS_METRIC_KEY
@@ -19,6 +18,7 @@
from ddtrace.llmobs._constants import TOTAL_TOKENS_METRIC_KEY
from ddtrace.llmobs._integrations.base import BaseLLMIntegration
from ddtrace.llmobs._utils import _get_attr
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/llmobs/_integrations/base.py b/ddtrace/llmobs/_integrations/base.py
index 6b205202efd..a098c899014 100644
--- a/ddtrace/llmobs/_integrations/base.py
+++ b/ddtrace/llmobs/_integrations/base.py
@@ -8,7 +8,6 @@
from ddtrace import config
from ddtrace._trace.sampler import RateSampler
-from ddtrace._trace.span import Span
from ddtrace.constants import _SPAN_MEASURED_KEY
from ddtrace.contrib.internal.trace_utils import int_service
from ddtrace.ext import SpanTypes
@@ -26,6 +25,7 @@
from ddtrace.llmobs._utils import _get_llmobs_parent_id
from ddtrace.settings import IntegrationConfig
from ddtrace.trace import Pin
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/llmobs/_integrations/bedrock.py b/ddtrace/llmobs/_integrations/bedrock.py
index d2d57b50ed3..ac6092cbe1a 100644
--- a/ddtrace/llmobs/_integrations/bedrock.py
+++ b/ddtrace/llmobs/_integrations/bedrock.py
@@ -3,7 +3,6 @@
from typing import List
from typing import Optional
-from ddtrace._trace.span import Span
from ddtrace.internal.logger import get_logger
from ddtrace.llmobs._constants import INPUT_MESSAGES
from ddtrace.llmobs._constants import INPUT_TOKENS_METRIC_KEY
@@ -19,6 +18,7 @@
from ddtrace.llmobs._constants import TOTAL_TOKENS_METRIC_KEY
from ddtrace.llmobs._integrations import BaseLLMIntegration
from ddtrace.llmobs._utils import _get_llmobs_parent_id
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/llmobs/_integrations/gemini.py b/ddtrace/llmobs/_integrations/gemini.py
index 491187475f0..ecec71e0645 100644
--- a/ddtrace/llmobs/_integrations/gemini.py
+++ b/ddtrace/llmobs/_integrations/gemini.py
@@ -4,7 +4,6 @@
from typing import List
from typing import Optional
-from ddtrace import Span
from ddtrace.internal.utils import get_argument_value
from ddtrace.llmobs._constants import INPUT_MESSAGES
from ddtrace.llmobs._constants import METADATA
@@ -19,6 +18,7 @@
from ddtrace.llmobs._integrations.utils import get_system_instructions_from_google_model
from ddtrace.llmobs._integrations.utils import llmobs_get_metadata_google
from ddtrace.llmobs._utils import _get_attr
+from ddtrace.trace import Span
class GeminiIntegration(BaseLLMIntegration):
diff --git a/ddtrace/llmobs/_integrations/langchain.py b/ddtrace/llmobs/_integrations/langchain.py
index 6b09038bd90..c6a77fad3bc 100644
--- a/ddtrace/llmobs/_integrations/langchain.py
+++ b/ddtrace/llmobs/_integrations/langchain.py
@@ -7,7 +7,6 @@
from typing import Union
from ddtrace import config
-from ddtrace._trace.span import Span
from ddtrace.constants import ERROR_TYPE
from ddtrace.internal.logger import get_logger
from ddtrace.internal.utils import ArgumentError
@@ -30,6 +29,7 @@
from ddtrace.llmobs._integrations.base import BaseLLMIntegration
from ddtrace.llmobs._integrations.utils import format_langchain_io
from ddtrace.llmobs.utils import Document
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/llmobs/_integrations/langgraph.py b/ddtrace/llmobs/_integrations/langgraph.py
index a45e822e0a2..08f3943e57e 100644
--- a/ddtrace/llmobs/_integrations/langgraph.py
+++ b/ddtrace/llmobs/_integrations/langgraph.py
@@ -3,7 +3,6 @@
from typing import List
from typing import Optional
-from ddtrace import tracer
from ddtrace.ext import SpanTypes
from ddtrace.internal.utils import get_argument_value
from ddtrace.llmobs._constants import INPUT_VALUE
@@ -16,7 +15,8 @@
from ddtrace.llmobs._utils import _get_attr
from ddtrace.llmobs._utils import _get_llmobs_parent_id
from ddtrace.llmobs._utils import _get_nearest_llmobs_ancestor
-from ddtrace.span import Span
+from ddtrace.trace import Span
+from ddtrace.trace import tracer
class LangGraphIntegration(BaseLLMIntegration):
diff --git a/ddtrace/llmobs/_integrations/openai.py b/ddtrace/llmobs/_integrations/openai.py
index ea660f53f68..7ed3aace08a 100644
--- a/ddtrace/llmobs/_integrations/openai.py
+++ b/ddtrace/llmobs/_integrations/openai.py
@@ -6,7 +6,6 @@
from typing import Tuple
from ddtrace import config
-from ddtrace._trace.span import Span
from ddtrace.internal.constants import COMPONENT
from ddtrace.internal.utils.version import parse_version
from ddtrace.llmobs._constants import INPUT_DOCUMENTS
@@ -25,6 +24,7 @@
from ddtrace.llmobs._utils import _get_attr
from ddtrace.llmobs.utils import Document
from ddtrace.trace import Pin
+from ddtrace.trace import Span
class OpenAIIntegration(BaseLLMIntegration):
diff --git a/ddtrace/llmobs/_integrations/vertexai.py b/ddtrace/llmobs/_integrations/vertexai.py
index 933cd685a1f..88d38f1975e 100644
--- a/ddtrace/llmobs/_integrations/vertexai.py
+++ b/ddtrace/llmobs/_integrations/vertexai.py
@@ -4,7 +4,6 @@
from typing import List
from typing import Optional
-from ddtrace import Span
from ddtrace.internal.utils import ArgumentError
from ddtrace.internal.utils import get_argument_value
from ddtrace.llmobs._constants import INPUT_MESSAGES
@@ -20,6 +19,7 @@
from ddtrace.llmobs._integrations.utils import get_system_instructions_from_google_model
from ddtrace.llmobs._integrations.utils import llmobs_get_metadata_google
from ddtrace.llmobs._utils import _get_attr
+from ddtrace.trace import Span
class VertexAIIntegration(BaseLLMIntegration):
diff --git a/ddtrace/llmobs/_llmobs.py b/ddtrace/llmobs/_llmobs.py
index acb214b019d..79c1a494b04 100644
--- a/ddtrace/llmobs/_llmobs.py
+++ b/ddtrace/llmobs/_llmobs.py
@@ -8,10 +8,8 @@
from typing import Union
import ddtrace
-from ddtrace import Span
from ddtrace import config
from ddtrace import patch
-from ddtrace._trace.context import Context
from ddtrace.constants import ERROR_MSG
from ddtrace.constants import ERROR_STACK
from ddtrace.constants import ERROR_TYPE
@@ -68,6 +66,8 @@
from ddtrace.llmobs.utils import ExportedLLMObsSpan
from ddtrace.llmobs.utils import Messages
from ddtrace.propagation.http import HTTPPropagator
+from ddtrace.trace import Context
+from ddtrace.trace import Span
log = get_logger(__name__)
@@ -295,7 +295,7 @@ def enable(
api_key: Optional[str] = None,
env: Optional[str] = None,
service: Optional[str] = None,
- _tracer: Optional[ddtrace.Tracer] = None,
+ _tracer: Optional[ddtrace.trace.Tracer] = None,
) -> None:
"""
Enable LLM Observability tracing.
diff --git a/ddtrace/llmobs/_utils.py b/ddtrace/llmobs/_utils.py
index c2f44689a05..8861820002c 100644
--- a/ddtrace/llmobs/_utils.py
+++ b/ddtrace/llmobs/_utils.py
@@ -5,7 +5,6 @@
from typing import Union
import ddtrace
-from ddtrace import Span
from ddtrace import config
from ddtrace.ext import SpanTypes
from ddtrace.internal.logger import get_logger
@@ -21,6 +20,7 @@
from ddtrace.llmobs._constants import PROPAGATED_PARENT_ID_KEY
from ddtrace.llmobs._constants import SESSION_ID
from ddtrace.llmobs._constants import VERTEXAI_APM_SPAN_NAME
+from ddtrace.trace import Span
log = get_logger(__name__)
diff --git a/ddtrace/opentracer/span.py b/ddtrace/opentracer/span.py
index 8be50b9cd4b..75bb522d06f 100644
--- a/ddtrace/opentracer/span.py
+++ b/ddtrace/opentracer/span.py
@@ -9,20 +9,20 @@
from opentracing import Span as OpenTracingSpan
from opentracing.ext import tags as OTTags
-from ddtrace._trace.context import Context as DatadogContext # noqa:F401
-from ddtrace._trace.span import Span as DatadogSpan
from ddtrace.constants import ERROR_MSG
from ddtrace.constants import ERROR_STACK
from ddtrace.constants import ERROR_TYPE
from ddtrace.internal.compat import NumericType # noqa:F401
from ddtrace.internal.constants import SPAN_API_OPENTRACING
+from ddtrace.trace import Context as DatadogContext # noqa:F401
+from ddtrace.trace import Span as DatadogSpan
from .span_context import SpanContext
from .tags import Tags
if TYPE_CHECKING: # pragma: no cover
- from ddtrace._trace.tracer import Tracer # noqa:F401
+ from ddtrace.trace import Tracer # noqa:F401
_TagNameType = Union[Text, bytes]
diff --git a/ddtrace/opentracer/span_context.py b/ddtrace/opentracer/span_context.py
index 63cee94f4d3..171142d18a8 100644
--- a/ddtrace/opentracer/span_context.py
+++ b/ddtrace/opentracer/span_context.py
@@ -4,8 +4,8 @@
from opentracing import SpanContext as OpenTracingSpanContext
-from ddtrace._trace.context import Context as DatadogContext
from ddtrace.internal.compat import NumericType # noqa:F401
+from ddtrace.trace import Context as DatadogContext
class SpanContext(OpenTracingSpanContext):
diff --git a/ddtrace/opentracer/tracer.py b/ddtrace/opentracer/tracer.py
index 2c8ac4a5d65..ca10cb8125a 100644
--- a/ddtrace/opentracer/tracer.py
+++ b/ddtrace/opentracer/tracer.py
@@ -11,13 +11,13 @@
from opentracing.scope_managers import ThreadLocalScopeManager
import ddtrace
-from ddtrace import Tracer as DatadogTracer
from ddtrace import config as ddconfig
-from ddtrace._trace.context import Context as DatadogContext # noqa:F401
-from ddtrace._trace.span import Span as DatadogSpan
from ddtrace.internal.constants import SPAN_API_OPENTRACING
from ddtrace.internal.utils.config import get_application_name
from ddtrace.settings import ConfigException
+from ddtrace.trace import Context as DatadogContext # noqa:F401
+from ddtrace.trace import Span as DatadogSpan
+from ddtrace.trace import Tracer as DatadogTracer
from ddtrace.vendor.debtcollector import deprecate
from ..internal.logger import get_logger
diff --git a/ddtrace/profiling/collector/_lock.py b/ddtrace/profiling/collector/_lock.py
index ec0c438b2b9..3d9e974734a 100644
--- a/ddtrace/profiling/collector/_lock.py
+++ b/ddtrace/profiling/collector/_lock.py
@@ -10,7 +10,6 @@
import wrapt
-from ddtrace._trace.tracer import Tracer
from ddtrace.internal.datadog.profiling import ddup
from ddtrace.internal.logger import get_logger
from ddtrace.profiling import _threading
@@ -20,6 +19,7 @@
from ddtrace.profiling.collector import _traceback
from ddtrace.profiling.recorder import Recorder
from ddtrace.settings.profiling import config
+from ddtrace.trace import Tracer
LOG = get_logger(__name__)
diff --git a/ddtrace/profiling/collector/pytorch.py b/ddtrace/profiling/collector/pytorch.py
index 3d9e636871d..8d2bee1e965 100644
--- a/ddtrace/profiling/collector/pytorch.py
+++ b/ddtrace/profiling/collector/pytorch.py
@@ -7,12 +7,12 @@
import wrapt
-from ddtrace._trace.tracer import Tracer
from ddtrace.internal.datadog.profiling import ddup
from ddtrace.profiling import _threading
from ddtrace.profiling import collector
from ddtrace.profiling.recorder import Recorder
from ddtrace.settings.profiling import config
+from ddtrace.trace import Tracer
LOG = logging.getLogger(__name__)
diff --git a/ddtrace/profiling/collector/stack.pyi b/ddtrace/profiling/collector/stack.pyi
index e1181c96b05..237744eb9d4 100644
--- a/ddtrace/profiling/collector/stack.pyi
+++ b/ddtrace/profiling/collector/stack.pyi
@@ -4,4 +4,4 @@ import ddtrace
from ddtrace.profiling import collector
class StackCollector(collector.PeriodicCollector):
- tracer: typing.Optional[ddtrace.Tracer]
+ tracer: typing.Optional[ddtrace.trace.Tracer]
diff --git a/ddtrace/profiling/collector/stack.pyx b/ddtrace/profiling/collector/stack.pyx
index 46b24e39c33..ba44257197c 100644
--- a/ddtrace/profiling/collector/stack.pyx
+++ b/ddtrace/profiling/collector/stack.pyx
@@ -10,7 +10,7 @@ import typing
from ddtrace.internal._unpatched import _threading as ddtrace_threading
from ddtrace._trace import context
from ddtrace._trace import span as ddspan
-from ddtrace._trace.tracer import Tracer
+from ddtrace.trace import Tracer
from ddtrace.internal._threads import periodic_threads
from ddtrace.internal.datadog.profiling import ddup
from ddtrace.internal.datadog.profiling import stack_v2
diff --git a/ddtrace/profiling/exporter/http.py b/ddtrace/profiling/exporter/http.py
index b4ec6994d72..7ba1ef42eb0 100644
--- a/ddtrace/profiling/exporter/http.py
+++ b/ddtrace/profiling/exporter/http.py
@@ -40,7 +40,7 @@ class PprofHTTPExporter(pprof.PprofExporter):
def __init__(
self,
- tracer: ddtrace.Tracer = ddtrace.tracer,
+ tracer: ddtrace.trace.Tracer = ddtrace.tracer,
enable_code_provenance: bool = True,
api_key: typing.Optional[str] = None,
timeout: float = config.api_timeout,
diff --git a/ddtrace/profiling/scheduler.py b/ddtrace/profiling/scheduler.py
index 98ab424c42b..aa3db25e049 100644
--- a/ddtrace/profiling/scheduler.py
+++ b/ddtrace/profiling/scheduler.py
@@ -9,12 +9,12 @@
from typing import Sequence # noqa F401
import ddtrace
-from ddtrace._trace.tracer import Tracer
from ddtrace.internal import periodic
from ddtrace.internal.datadog.profiling import ddup
from ddtrace.profiling import _traceback
from ddtrace.profiling import exporter
from ddtrace.settings.profiling import config
+from ddtrace.trace import Tracer
from .exporter import Exporter
from .recorder import EventsType
diff --git a/ddtrace/propagation/_database_monitoring.py b/ddtrace/propagation/_database_monitoring.py
index 817d23c4ebf..ae03aa5c4fe 100644
--- a/ddtrace/propagation/_database_monitoring.py
+++ b/ddtrace/propagation/_database_monitoring.py
@@ -17,7 +17,7 @@
if TYPE_CHECKING:
from typing import Optional # noqa:F401
- from ddtrace import Span # noqa:F401
+ from ddtrace.trace import Span # noqa:F401
import sys
diff --git a/ddtrace/propagation/http.py b/ddtrace/propagation/http.py
index fdaf97410ad..3179e1980bb 100644
--- a/ddtrace/propagation/http.py
+++ b/ddtrace/propagation/http.py
@@ -12,7 +12,7 @@
import urllib.parse
import ddtrace
-from ddtrace._trace.span import Span # noqa:F401
+from ddtrace.trace import Span # noqa:F401
if sys.version_info >= (3, 8):
@@ -23,12 +23,12 @@
from ddtrace import config
from ddtrace._trace._span_link import SpanLink
-from ddtrace._trace.context import Context
from ddtrace._trace.span import _get_64_highest_order_bits_as_hex
from ddtrace._trace.span import _get_64_lowest_order_bits_as_int
from ddtrace._trace.span import _MetaDictType
from ddtrace.appsec._constants import APPSEC
from ddtrace.settings.asm import config as asm_config
+from ddtrace.trace import Context
from ..constants import AUTO_KEEP
from ..constants import AUTO_REJECT
diff --git a/ddtrace/runtime/__init__.py b/ddtrace/runtime/__init__.py
index dc6a3ae745c..1ae6fc97191 100644
--- a/ddtrace/runtime/__init__.py
+++ b/ddtrace/runtime/__init__.py
@@ -26,7 +26,7 @@ class RuntimeMetrics(metaclass=_RuntimeMetricsStatus):
@staticmethod
def enable(tracer=None, dogstatsd_url=None, flush_interval=None):
- # type: (Optional[ddtrace.Tracer], Optional[str], Optional[float]) -> None
+ # type: (Optional[ddtrace.trace.Tracer], Optional[str], Optional[float]) -> None
"""
Enable the runtime metrics collection service.
diff --git a/ddtrace/span.py b/ddtrace/span.py
index bf1832d1fa0..48f1835262c 100644
--- a/ddtrace/span.py
+++ b/ddtrace/span.py
@@ -1,5 +1,5 @@
-from ddtrace._trace.span import Span # noqa: F401
from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning
+from ddtrace.trace import Span # noqa: F401
from ddtrace.vendor.debtcollector import deprecate
diff --git a/ddtrace/trace/__init__.py b/ddtrace/trace/__init__.py
index f709310d589..3d50f66ec5a 100644
--- a/ddtrace/trace/__init__.py
+++ b/ddtrace/trace/__init__.py
@@ -1,6 +1,7 @@
from ddtrace._trace.context import Context
from ddtrace._trace.filters import TraceFilter
from ddtrace._trace.pin import Pin
+from ddtrace._trace.provider import BaseContextProvider
from ddtrace._trace.span import Span
from ddtrace._trace.tracer import Tracer
@@ -9,6 +10,7 @@
tracer = Tracer()
__all__ = [
+ "BaseContextProvider",
"Context",
"Pin",
"TraceFilter",
diff --git a/docs/advanced_usage.rst b/docs/advanced_usage.rst
index 0331d7b8a4f..11c1a1f6beb 100644
--- a/docs/advanced_usage.rst
+++ b/docs/advanced_usage.rst
@@ -10,7 +10,7 @@ If the Datadog Agent is on a separate host from your application, you can modify
the default ``ddtrace.tracer`` object to utilize another hostname and port. Here
is a small example showcasing this::
- from ddtrace import tracer
+ from ddtrace.trace import tracer
tracer.configure(hostname=, port=, https=)
@@ -18,7 +18,7 @@ By default, these will be set to ``localhost``, ``8126``, and ``False`` respecti
You can also use a Unix Domain Socket to connect to the agent::
- from ddtrace import tracer
+ from ddtrace.trace import tracer
tracer.configure(uds_path="/path/to/socket")
@@ -29,7 +29,7 @@ You can also use a Unix Domain Socket to connect to the agent::
Context
-------
-The :class:`ddtrace.context.Context` object is used to represent the state of
+The :class:`ddtrace.trace.Context` object is used to represent the state of
a trace at a point in time. This state includes the trace id, active span id,
distributed sampling decision and more. It is used to propagate the trace
across execution boundaries like processes
@@ -46,7 +46,7 @@ Tracing Context Management
--------------------------
In ``ddtrace`` "context management" is the management of which
-:class:`ddtrace.Span` or :class:`ddtrace.context.Context` is active in an
+:class:`ddtrace.trace.Span` or :class:`ddtrace.trace.Context` is active in an
execution (thread, task, etc). There can only be one active span or context
per execution at a time.
@@ -97,7 +97,7 @@ To continue a trace across threads the context needs to be passed between
threads::
import threading, time
- from ddtrace import tracer
+ from ddtrace.trace import tracer
def _target(trace_ctx):
tracer.context_provider.activate(trace_ctx)
@@ -116,7 +116,7 @@ When the :ref:`futures` integration is enabled, the context is automatically pro
to :class:`~concurrent.futures.ThreadPoolExecutor` tasks::
from concurrent.futures import ThreadPoolExecutor
- from ddtrace import tracer
+ from ddtrace.trace import tracer
@tracer.wrap()
def eat(dessert): # each task will get its own span, child of the eat_all_the_things span
@@ -140,7 +140,7 @@ span has to be propagated as a context::
from multiprocessing import Process
import time
- from ddtrace import tracer
+ from ddtrace.trace import tracer
def _target(ctx):
tracer.context_provider.activate(ctx)
@@ -159,8 +159,8 @@ span has to be propagated as a context::
.. important::
- A :class:`ddtrace.Span` should only be accessed or modified in the process
- that it was created in. Using a :class:`ddtrace.Span` from within a child process
+ A :class:`ddtrace.trace.Span` should only be accessed or modified in the process
+ that it was created in. Using a :class:`ddtrace.trace.Span` from within a child process
could result in a deadlock or unexpected behavior.
@@ -173,7 +173,7 @@ to contexts to avoid memory leaks.
Here's an example of tracing some work done in a child process::
import os, sys, time
- from ddtrace import tracer
+ from ddtrace.trace import tracer
span = tracer.trace("work")
@@ -208,7 +208,7 @@ Manual Management
Parenting can be managed manually by using ``tracer.start_span()`` which by
default does not activate spans when they are created. See the documentation
-for :meth:`ddtrace.Tracer.start_span`.
+for :meth:`ddtrace.trace.Tracer.start_span`.
Context Providers
@@ -221,7 +221,7 @@ context management.
If there is a case where the default is insufficient then a custom context
provider can be used. It must implement the
-:class:`ddtrace.provider.BaseContextProvider` interface and can be configured
+:class:`ddtrace.trace.BaseContextProvider` interface and can be configured
with::
tracer.configure(context_provider=MyContextProvider)
@@ -331,7 +331,7 @@ It is possible to filter or modify traces before they are sent to the Agent by
configuring the tracer with a filters list. For instance, to filter out
all traces of incoming requests to a specific url::
- from ddtrace import tracer
+ from ddtrace.trace import tracer
from ddtrace.trace import TraceFilter
class FilterbyName(TraceFilter):
@@ -350,11 +350,11 @@ and the resulting trace will either be sent to the Agent or discarded.
**Writing a custom filter**
Create a filter by implementing a class with a ``process_trace`` method and
-providing it to the filters parameter of :meth:`ddtrace.Tracer.configure()`.
+providing it to the filters parameter of :meth:`ddtrace.trace.Tracer.configure()`.
``process_trace`` should either return a trace to be fed to the next step of
the pipeline or ``None`` if the trace should be discarded::
- from ddtrace import Span, tracer
+ from ddtrace.trace import Span, tracer
from ddtrace.trace import TraceFilter
class FilterExample(TraceFilter):
diff --git a/docs/api.rst b/docs/api.rst
index d4b4e80674a..259629e711b 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -13,10 +13,10 @@ Tracing
.. autofunction:: ddtrace.patch
-.. autoclass:: ddtrace.Tracer
+.. autoclass:: ddtrace.trace.Tracer
:members:
-.. autoclass:: ddtrace.Span
+.. autoclass:: ddtrace.trace.Span
:members:
.. autoclass:: ddtrace.trace.Pin
@@ -26,10 +26,10 @@ Tracing
:members:
:undoc-members:
-.. autoclass:: ddtrace.sampler.DatadogSampler
+.. autoclass:: ddtrace._trace.sampler.DatadogSampler
:members:
-.. autoclass:: ddtrace.sampler.SamplingRule
+.. autoclass:: ddtrace._trace.sampler.SamplingRule
:members:
.. autoclass:: ddtrace.propagation.http.HTTPPropagator
diff --git a/docs/basic_usage.rst b/docs/basic_usage.rst
index 7f8f6cbb9cb..bc50ddef6b0 100644
--- a/docs/basic_usage.rst
+++ b/docs/basic_usage.rst
@@ -35,13 +35,13 @@ in your application::
# ...
# ...
-API documentation can be found here :py:meth:`ddtrace.Tracer.wrap`.
+API documentation can be found here :py:meth:`ddtrace.trace.Tracer.wrap`.
Context Manager
---------------
-To trace an arbitrary block of code, you can use :py:meth:`ddtrace.Tracer.trace`
-that returns a :py:mod:`ddtrace.Span` which can be used as a context manager::
+To trace an arbitrary block of code, you can use :py:meth:`ddtrace.trace.Tracer.trace`
+that returns a :py:mod:`ddtrace.trace.Span` which can be used as a context manager::
# trace some interesting operation
with tracer.trace('interesting.operations'):
@@ -49,7 +49,7 @@ that returns a :py:mod:`ddtrace.Span` which can be used as a context manager::
# ...
# ...
-API documentation can be found here :py:meth:`ddtrace.Tracer`.
+API documentation can be found here :py:meth:`ddtrace.trace.Tracer`.
Using the API
-------------
@@ -67,8 +67,8 @@ manual API to provide complete control over starting and stopping spans is avail
API details for creating and finishing spans can be found here:
-- :py:meth:`ddtrace.Tracer.trace`
-- :py:meth:`ddtrace.Span.finish`.
+- :py:meth:`ddtrace.trace.Tracer.trace`
+- :py:meth:`ddtrace.trace.Span.finish`.
Profiling
diff --git a/docs/index.rst b/docs/index.rst
index 7517008b6da..f51c8df1af1 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -112,7 +112,7 @@ contacting support.
+--------------------------------------------------+---------------+----------------+
| :ref:`kombu` | >= 4.2 | No |
+--------------------------------------------------+---------------+----------------+
-| :ref:`langchain` | >= 0.0.192 | Yes |
+| :ref:`langchain` | >= 0.1 | Yes |
+--------------------------------------------------+---------------+----------------+
| :ref:`logbook` | >= 1.0.0 | No |
+--------------------------------------------------+---------------+----------------+
diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst
index f471b6433b5..0dac5702140 100644
--- a/docs/troubleshooting.rst
+++ b/docs/troubleshooting.rst
@@ -66,7 +66,7 @@ This can be a problem for users who want to see error details from a child span
While this is default behavior for integrations, users can add a trace filter to propagate the error details up to the root span::
- from ddtrace import Span, tracer
+ from ddtrace.trace import Span, tracer
from ddtrace.trace import TraceFilter
diff --git a/releasenotes/notes/avoid-using-deprecated-apis-internally-fd9c9ce9c52905af.yaml b/releasenotes/notes/avoid-using-deprecated-apis-internally-fd9c9ce9c52905af.yaml
new file mode 100644
index 00000000000..66e0ccb0ee5
--- /dev/null
+++ b/releasenotes/notes/avoid-using-deprecated-apis-internally-fd9c9ce9c52905af.yaml
@@ -0,0 +1,5 @@
+---
+other:
+ - |
+ tracing: Ensures the ddtrace library does not use deprecated APIs internally.
+ Deprecation warnings should only be logged when the user's code is using deprecated APIs.
diff --git a/releasenotes/notes/langchain-drop-v0.0-support-745a0572da799e4e.yaml b/releasenotes/notes/langchain-drop-v0.0-support-745a0572da799e4e.yaml
new file mode 100644
index 00000000000..28ca4ab6526
--- /dev/null
+++ b/releasenotes/notes/langchain-drop-v0.0-support-745a0572da799e4e.yaml
@@ -0,0 +1,4 @@
+---
+upgrade:
+ - |
+ langchain: Drops tracing and LLM Observability support for Langchain v0.0.x versions.
\ No newline at end of file
diff --git a/riotfile.py b/riotfile.py
index e266d2a09a6..90452bca332 100644
--- a/riotfile.py
+++ b/riotfile.py
@@ -2698,17 +2698,6 @@ def select_pys(min_version: str = MIN_PYTHON_VERSION, max_version: str = MAX_PYT
"greenlet": "==3.0.3",
},
venvs=[
- Venv(
- pkgs={
- "vcrpy": "==6.0.1",
- "langchain": "==0.0.192",
- "langchain-community": "==0.0.14",
- "openai": "==0.27.8",
- "pinecone-client": "==2.2.4",
- "cohere": "==4.57",
- },
- pys=select_pys(min_version="3.9", max_version="3.11"),
- ),
Venv(
pkgs={
"vcrpy": "==5.1.0",
diff --git a/scripts/profiles/flask-simple/app/app.py b/scripts/profiles/flask-simple/app/app.py
index de49491c96f..74402af5c85 100644
--- a/scripts/profiles/flask-simple/app/app.py
+++ b/scripts/profiles/flask-simple/app/app.py
@@ -11,14 +11,14 @@
@app.route("/")
def entry_point():
if environ.get("DUPLICATE_TAGS_SCENARIO", None):
- from ddtrace import tracer
+ from ddtrace.trace import tracer
span = tracer.current_span()
if span:
for _ in range(100):
span.set_tag(_, "a" * 100)
elif environ.get("UNIQUE_TAGS_SCENARIO", None):
- from ddtrace import tracer
+ from ddtrace.trace import tracer
span = tracer.current_span()
if span:
diff --git a/templates/integration/__init__.py b/templates/integration/__init__.py
index ef19d262e58..8eaf8b9c136 100644
--- a/templates/integration/__init__.py
+++ b/templates/integration/__init__.py
@@ -35,7 +35,7 @@
``Pin`` API::
import foo
- from ddtrace import Pin
+ from ddtrace.trace import Pin
myfoo = foo.Foo()
Pin.override(myfoo, service="myfoo")
diff --git a/tests/appsec/appsec/test_appsec_trace_utils.py b/tests/appsec/appsec/test_appsec_trace_utils.py
index b4dbf97c8e2..3c70b4267ed 100644
--- a/tests/appsec/appsec/test_appsec_trace_utils.py
+++ b/tests/appsec/appsec/test_appsec_trace_utils.py
@@ -238,7 +238,7 @@ def test_set_user_blocked(self):
assert is_blocked(span)
def test_no_span_doesnt_raise(self):
- from ddtrace import tracer
+ from ddtrace.trace import tracer
with self._caplog.at_level(logging.DEBUG):
try:
diff --git a/tests/appsec/appsec/test_processor.py b/tests/appsec/appsec/test_processor.py
index 117a55175f9..fbfb11af75c 100644
--- a/tests/appsec/appsec/test_processor.py
+++ b/tests/appsec/appsec/test_processor.py
@@ -706,7 +706,7 @@ def test_required_addresses():
@pytest.mark.parametrize("ephemeral", ["LFI_ADDRESS", "PROCESSOR_SETTINGS"])
@mock.patch("ddtrace.appsec._ddwaf.DDWaf.run")
def test_ephemeral_addresses(mock_run, persistent, ephemeral):
- from ddtrace import tracer
+ from ddtrace.trace import tracer
processor = AppSecSpanProcessor()
processor._update_rules(CUSTOM_RULE_METHOD)
diff --git a/tests/appsec/appsec/test_telemetry.py b/tests/appsec/appsec/test_telemetry.py
index 10c8a0c0307..5ac21ceaa2e 100644
--- a/tests/appsec/appsec/test_telemetry.py
+++ b/tests/appsec/appsec/test_telemetry.py
@@ -4,7 +4,6 @@
import mock
import pytest
-from ddtrace import tracer
import ddtrace.appsec._asm_request_context as asm_request_context
from ddtrace.appsec._ddwaf import version
import ddtrace.appsec._ddwaf.ddwaf_types
@@ -15,6 +14,7 @@
from ddtrace.internal.telemetry.constants import TELEMETRY_NAMESPACE
from ddtrace.internal.telemetry.constants import TELEMETRY_TYPE_DISTRIBUTION
from ddtrace.internal.telemetry.constants import TELEMETRY_TYPE_GENERATE_METRICS
+from ddtrace.trace import tracer
import tests.appsec.rules as rules
from tests.appsec.utils import asm_context
from tests.utils import override_global_config
diff --git a/tests/appsec/contrib_appsec/django_app/settings.py b/tests/appsec/contrib_appsec/django_app/settings.py
index 859201f840a..ce134a597f0 100644
--- a/tests/appsec/contrib_appsec/django_app/settings.py
+++ b/tests/appsec/contrib_appsec/django_app/settings.py
@@ -2,7 +2,7 @@
import django
-from ddtrace import tracer
+from ddtrace.trace import tracer
from tests.webclient import PingFilter
diff --git a/tests/appsec/contrib_appsec/django_app/urls.py b/tests/appsec/contrib_appsec/django_app/urls.py
index 1b691d43a53..3ca8557c550 100644
--- a/tests/appsec/contrib_appsec/django_app/urls.py
+++ b/tests/appsec/contrib_appsec/django_app/urls.py
@@ -11,8 +11,8 @@
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
-from ddtrace import tracer
import ddtrace.constants
+from ddtrace.trace import tracer
# django.conf.urls.url was deprecated in django 3 and removed in django 4
diff --git a/tests/appsec/contrib_appsec/fastapi_app/app.py b/tests/appsec/contrib_appsec/fastapi_app/app.py
index 3403df6f844..c636e65b7c3 100644
--- a/tests/appsec/contrib_appsec/fastapi_app/app.py
+++ b/tests/appsec/contrib_appsec/fastapi_app/app.py
@@ -11,8 +11,8 @@
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
-from ddtrace import tracer
import ddtrace.constants
+from ddtrace.trace import tracer
fake_secret_token = "DataDog"
diff --git a/tests/appsec/contrib_appsec/flask_app/app.py b/tests/appsec/contrib_appsec/flask_app/app.py
index 83fb1ce9721..32228375f37 100644
--- a/tests/appsec/contrib_appsec/flask_app/app.py
+++ b/tests/appsec/contrib_appsec/flask_app/app.py
@@ -6,10 +6,9 @@
from flask import Flask
from flask import request
-from ddtrace import tracer
-
# from ddtrace.appsec.iast import ddtrace_iast_flask_patch
import ddtrace.constants
+from ddtrace.trace import tracer
from tests.webclient import PingFilter
diff --git a/tests/appsec/iast/fixtures/integration/main_configure.py b/tests/appsec/iast/fixtures/integration/main_configure.py
index aa7de99e22c..bc9933a7679 100644
--- a/tests/appsec/iast/fixtures/integration/main_configure.py
+++ b/tests/appsec/iast/fixtures/integration/main_configure.py
@@ -4,9 +4,9 @@
import os
import sys
-from ddtrace import tracer
from ddtrace.appsec._iast._utils import _is_iast_enabled
from ddtrace.ext import SpanTypes
+from ddtrace.trace import tracer
logger = logging.getLogger(__name__)
diff --git a/tests/appsec/iast/fixtures/integration/main_configure_right.py b/tests/appsec/iast/fixtures/integration/main_configure_right.py
index b1789deef97..c7fa96cc2fd 100644
--- a/tests/appsec/iast/fixtures/integration/main_configure_right.py
+++ b/tests/appsec/iast/fixtures/integration/main_configure_right.py
@@ -4,8 +4,8 @@
import os
import sys
-from ddtrace import tracer
from ddtrace.ext import SpanTypes
+from ddtrace.trace import tracer
logger = logging.getLogger(__name__)
diff --git a/tests/appsec/iast/fixtures/integration/main_configure_wrong.py b/tests/appsec/iast/fixtures/integration/main_configure_wrong.py
index 92828790b03..cb2a031946e 100644
--- a/tests/appsec/iast/fixtures/integration/main_configure_wrong.py
+++ b/tests/appsec/iast/fixtures/integration/main_configure_wrong.py
@@ -4,8 +4,8 @@
import os
import sys
-from ddtrace import tracer
from ddtrace.ext import SpanTypes
+from ddtrace.trace import tracer
logger = logging.getLogger(__name__)
diff --git a/tests/appsec/iast_tdd_propagation/flask_orm_app.py b/tests/appsec/iast_tdd_propagation/flask_orm_app.py
index b4e7e0d2095..8dea94567a5 100644
--- a/tests/appsec/iast_tdd_propagation/flask_orm_app.py
+++ b/tests/appsec/iast_tdd_propagation/flask_orm_app.py
@@ -11,8 +11,8 @@
from flask import Flask
from flask import request
-from ddtrace import tracer
from ddtrace.appsec.iast import ddtrace_iast_flask_patch
+from ddtrace.trace import tracer
from tests.appsec.iast.taint_sinks.conftest import _get_span_report
from tests.utils import override_env
diff --git a/tests/appsec/iast_tdd_propagation/flask_propagation_views.py b/tests/appsec/iast_tdd_propagation/flask_propagation_views.py
index ae1ce2af489..83dcbfa41bf 100644
--- a/tests/appsec/iast_tdd_propagation/flask_propagation_views.py
+++ b/tests/appsec/iast_tdd_propagation/flask_propagation_views.py
@@ -3,8 +3,8 @@
from flask import Flask
from flask import request
-from ddtrace import tracer
from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted
+from ddtrace.trace import tracer
class ResultResponse:
diff --git a/tests/appsec/iast_tdd_propagation/flask_taint_sinks_views.py b/tests/appsec/iast_tdd_propagation/flask_taint_sinks_views.py
index 396aa0db63c..11d6ee3e0f2 100644
--- a/tests/appsec/iast_tdd_propagation/flask_taint_sinks_views.py
+++ b/tests/appsec/iast_tdd_propagation/flask_taint_sinks_views.py
@@ -5,8 +5,8 @@
from flask import Flask
from flask import request
-from ddtrace import tracer
from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted
+from ddtrace.trace import tracer
from tests.appsec.iast.taint_sinks.conftest import _get_span_report
diff --git a/tests/appsec/integrations/django_tests/conftest.py b/tests/appsec/integrations/django_tests/conftest.py
index e24eb07081e..d150edf68be 100644
--- a/tests/appsec/integrations/django_tests/conftest.py
+++ b/tests/appsec/integrations/django_tests/conftest.py
@@ -4,9 +4,9 @@
from django.conf import settings
import pytest
-from ddtrace import Pin
from ddtrace.appsec._iast import enable_iast_propagation
from ddtrace.contrib.internal.django.patch import patch
+from ddtrace.trace import Pin
from tests.appsec.iast.conftest import _end_iast_context_and_oce
from tests.appsec.iast.conftest import _start_iast_context_and_oce
from tests.utils import DummyTracer
diff --git a/tests/appsec/integrations/django_tests/django_app/settings.py b/tests/appsec/integrations/django_tests/django_app/settings.py
index 9883d69f5ba..9464c37fd43 100644
--- a/tests/appsec/integrations/django_tests/django_app/settings.py
+++ b/tests/appsec/integrations/django_tests/django_app/settings.py
@@ -1,6 +1,6 @@
import os
-from ddtrace import tracer
+from ddtrace.trace import tracer
from tests.webclient import PingFilter
diff --git a/tests/appsec/integrations/django_tests/django_app/urls.py b/tests/appsec/integrations/django_tests/django_app/urls.py
index c9dffbde8d8..dd1d069ad77 100644
--- a/tests/appsec/integrations/django_tests/django_app/urls.py
+++ b/tests/appsec/integrations/django_tests/django_app/urls.py
@@ -2,7 +2,7 @@
from django.http import HttpResponse
from django.urls import path
-from ddtrace import tracer
+from ddtrace.trace import tracer
from tests.appsec.integrations.django_tests.django_app import views
diff --git a/tests/appsec/integrations/django_tests/django_app/views.py b/tests/appsec/integrations/django_tests/django_app/views.py
index 74cc239cf34..693a9eab365 100644
--- a/tests/appsec/integrations/django_tests/django_app/views.py
+++ b/tests/appsec/integrations/django_tests/django_app/views.py
@@ -9,12 +9,12 @@
from django.http import HttpResponse
from django.http import JsonResponse
-from ddtrace import tracer
from ddtrace.appsec import _asm_request_context
from ddtrace.appsec._iast._taint_tracking import OriginType
from ddtrace.appsec._iast._taint_tracking._taint_objects import is_pyobject_tainted
from ddtrace.appsec._iast.reporter import IastSpanReporter
from ddtrace.appsec._trace_utils import block_request_if_user_blocked
+from ddtrace.trace import tracer
def assert_origin(parameter: Any, origin_type: Any) -> None:
diff --git a/tests/appsec/integrations/flask_tests/test_flask_remoteconfig.py b/tests/appsec/integrations/flask_tests/test_flask_remoteconfig.py
index 3c9b934416a..be495989f5d 100644
--- a/tests/appsec/integrations/flask_tests/test_flask_remoteconfig.py
+++ b/tests/appsec/integrations/flask_tests/test_flask_remoteconfig.py
@@ -10,9 +10,9 @@
import pytest
-from ddtrace import tracer
from ddtrace.internal.compat import httplib
from ddtrace.internal.compat import parse
+from ddtrace.trace import tracer
from tests.appsec.appsec_utils import gunicorn_server
from tests.appsec.integrations.flask_tests.utils import _PORT
from tests.appsec.integrations.flask_tests.utils import _multi_requests
diff --git a/tests/appsec/utils.py b/tests/appsec/utils.py
index 7d79455361f..9fe95b06a93 100644
--- a/tests/appsec/utils.py
+++ b/tests/appsec/utils.py
@@ -2,10 +2,10 @@
import sys
import typing
-from ddtrace import tracer as default_tracer
-from ddtrace._trace.span import Span
from ddtrace.ext import SpanTypes
import ddtrace.internal.core as core
+from ddtrace.trace import Span
+from ddtrace.trace import tracer as default_tracer
from tests.utils import override_global_config
diff --git a/tests/ci_visibility/api_client/_util.py b/tests/ci_visibility/api_client/_util.py
index 403482688a9..8a7d1871b96 100644
--- a/tests/ci_visibility/api_client/_util.py
+++ b/tests/ci_visibility/api_client/_util.py
@@ -344,7 +344,7 @@ def _get_mock_civisibility(requests_mode, suite_skipping_mode):
"runtime.version": "11.5.2",
}
mock_civisibility._git_client = mock.Mock(spec=CIVisibilityGitClient)
- mock_civisibility.tracer = mock.Mock(spec=ddtrace.Tracer)
+ mock_civisibility.tracer = mock.Mock(spec=ddtrace.trace.Tracer)
mock_civisibility.tracer._agent_url = "http://notahost:1234"
return mock_civisibility
diff --git a/tests/ci_visibility/test_ci_visibility.py b/tests/ci_visibility/test_ci_visibility.py
index 525d9b014fa..1db4f068c7a 100644
--- a/tests/ci_visibility/test_ci_visibility.py
+++ b/tests/ci_visibility/test_ci_visibility.py
@@ -14,7 +14,6 @@
import pytest
import ddtrace
-from ddtrace._trace.span import Span
from ddtrace.constants import AUTO_KEEP
from ddtrace.ext import ci
from ddtrace.ext.git import _build_git_packfiles_with_details
@@ -32,6 +31,7 @@
from ddtrace.internal.ci_visibility.recorder import _extract_repository_name_from_url
import ddtrace.internal.test_visibility._internal_item_ids
from ddtrace.internal.utils.http import Response
+from ddtrace.trace import Span
from tests.ci_visibility.api_client._util import _make_fqdn_suite_ids
from tests.ci_visibility.api_client._util import _make_fqdn_test_ids
from tests.ci_visibility.util import _ci_override_env
@@ -685,7 +685,7 @@ def test_civisibilitywriter_evp_proxy_url(self):
), mock.patch(
"ddtrace.internal.agent.get_trace_url", return_value="http://evpproxy.bar:1234"
), mock.patch("ddtrace.settings._config.Config", _get_default_civisibility_ddconfig()), mock.patch(
- "ddtrace.tracer", ddtrace.Tracer()
+ "ddtrace.tracer", ddtrace.trace.Tracer()
), mock.patch(
"ddtrace.internal.ci_visibility.recorder.CIVisibility._agent_evp_proxy_is_available", return_value=True
), _dummy_noop_git_client(), mock.patch(
@@ -705,7 +705,7 @@ def test_civisibilitywriter_only_traces(self):
)
), mock.patch(
"ddtrace.internal.agent.get_trace_url", return_value="http://onlytraces:1234"
- ), mock.patch("ddtrace.tracer", ddtrace.Tracer()), mock.patch(
+ ), mock.patch("ddtrace.tracer", ddtrace.trace.Tracer()), mock.patch(
"ddtrace.internal.ci_visibility.recorder.CIVisibility._agent_evp_proxy_is_available", return_value=False
), mock.patch(
"ddtrace.internal.ci_visibility.writer.config", ddtrace.settings.Config()
@@ -1119,7 +1119,7 @@ def test_civisibility_enable_respects_passed_in_tracer():
), _dummy_noop_git_client(), mock.patch(
"ddtrace.internal.ci_visibility.recorder.ddconfig", _get_default_civisibility_ddconfig()
), mock.patch("ddtrace.internal.ci_visibility.writer.config", ddtrace.settings.Config()):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(partial_flush_enabled=False, partial_flush_min_spans=100)
CIVisibility.enable(tracer=tracer)
assert CIVisibility._instance.tracer._partial_flush_enabled is False
diff --git a/tests/ci_visibility/test_ci_visibility_check_enabled_features.py b/tests/ci_visibility/test_ci_visibility_check_enabled_features.py
index 1402510bc73..24592d0bed2 100644
--- a/tests/ci_visibility/test_ci_visibility_check_enabled_features.py
+++ b/tests/ci_visibility/test_ci_visibility_check_enabled_features.py
@@ -46,7 +46,7 @@ def _get_mock_civisibility():
"runtime.version": "11.5.2",
}
mock_civisibility._git_client = mock.Mock(spec=CIVisibilityGitClient)
- mock_civisibility.tracer = mock.Mock(spec=ddtrace.Tracer)
+ mock_civisibility.tracer = mock.Mock(spec=ddtrace.trace.Tracer)
mock_civisibility.tracer._agent_url = "http://notahost:1234"
return mock_civisibility
diff --git a/tests/ci_visibility/test_encoder.py b/tests/ci_visibility/test_encoder.py
index 4a1d0fe2331..b503c4528df 100644
--- a/tests/ci_visibility/test_encoder.py
+++ b/tests/ci_visibility/test_encoder.py
@@ -3,7 +3,6 @@
import msgpack
-from ddtrace._trace.span import Span
from ddtrace.internal.ci_visibility.constants import COVERAGE_TAG_NAME
from ddtrace.internal.ci_visibility.constants import ITR_CORRELATION_ID_TAG_NAME
from ddtrace.internal.ci_visibility.constants import SESSION_ID
@@ -11,6 +10,7 @@
from ddtrace.internal.ci_visibility.encoder import CIVisibilityCoverageEncoderV02
from ddtrace.internal.ci_visibility.encoder import CIVisibilityEncoderV01
from ddtrace.internal.encoding import JSONEncoder
+from ddtrace.trace import Span
from tests.contrib.pytest.test_pytest import PytestTestCaseBase
diff --git a/tests/ci_visibility/util.py b/tests/ci_visibility/util.py
index 87d818191c5..dc0b886ca64 100644
--- a/tests/ci_visibility/util.py
+++ b/tests/ci_visibility/util.py
@@ -209,5 +209,5 @@ def _ci_override_env(
new_vars: t.Optional[t.Dict[str, str]] = None, mock_ci_env=False, replace_os_env=True, full_clear=False
):
env_vars = _get_default_ci_env_vars(new_vars, mock_ci_env, full_clear)
- with override_env(env_vars, replace_os_env=replace_os_env), mock.patch("ddtrace.tracer", ddtrace.Tracer()):
+ with override_env(env_vars, replace_os_env=replace_os_env), mock.patch("ddtrace.tracer", ddtrace.trace.Tracer()):
yield
diff --git a/tests/commands/ddtrace_run_disabled.py b/tests/commands/ddtrace_run_disabled.py
index e00fc46a2d1..1390948d1eb 100644
--- a/tests/commands/ddtrace_run_disabled.py
+++ b/tests/commands/ddtrace_run_disabled.py
@@ -1,5 +1,5 @@
from ddtrace import _monkey
-from ddtrace import tracer
+from ddtrace.trace import tracer
if __name__ == "__main__":
diff --git a/tests/commands/ddtrace_run_dogstatsd.py b/tests/commands/ddtrace_run_dogstatsd.py
index 5af8bd96b97..c11bd1247c0 100644
--- a/tests/commands/ddtrace_run_dogstatsd.py
+++ b/tests/commands/ddtrace_run_dogstatsd.py
@@ -1,6 +1,6 @@
from __future__ import print_function
-from ddtrace import tracer
+from ddtrace.trace import tracer
if __name__ == "__main__":
diff --git a/tests/commands/ddtrace_run_enabled.py b/tests/commands/ddtrace_run_enabled.py
index a9eaa840b85..07af9ac7038 100644
--- a/tests/commands/ddtrace_run_enabled.py
+++ b/tests/commands/ddtrace_run_enabled.py
@@ -1,4 +1,4 @@
-from ddtrace import tracer
+from ddtrace.trace import tracer
if __name__ == "__main__":
diff --git a/tests/commands/ddtrace_run_global_tags.py b/tests/commands/ddtrace_run_global_tags.py
index 3bb2f7f8924..2441d80f93a 100644
--- a/tests/commands/ddtrace_run_global_tags.py
+++ b/tests/commands/ddtrace_run_global_tags.py
@@ -1,4 +1,4 @@
-from ddtrace import tracer
+from ddtrace.trace import tracer
if __name__ == "__main__":
diff --git a/tests/commands/ddtrace_run_hostname.py b/tests/commands/ddtrace_run_hostname.py
index cafc93eec35..1350016236e 100644
--- a/tests/commands/ddtrace_run_hostname.py
+++ b/tests/commands/ddtrace_run_hostname.py
@@ -1,4 +1,4 @@
-from ddtrace import tracer
+from ddtrace.trace import tracer
if __name__ == "__main__":
diff --git a/tests/contrib/aiohttp_jinja2/test_aiohttp_jinja2.py b/tests/contrib/aiohttp_jinja2/test_aiohttp_jinja2.py
index 8889d828752..089c799ebe0 100644
--- a/tests/contrib/aiohttp_jinja2/test_aiohttp_jinja2.py
+++ b/tests/contrib/aiohttp_jinja2/test_aiohttp_jinja2.py
@@ -1,9 +1,9 @@
import aiohttp_jinja2
import pytest
-from ddtrace import tracer
from ddtrace.constants import ERROR_MSG
from ddtrace.trace import Pin
+from ddtrace.trace import tracer
from tests.contrib.aiohttp.app.web import set_filesystem_loader
from tests.contrib.aiohttp.app.web import set_package_loader
import tests.contrib.aiohttp.conftest # noqa:F401
diff --git a/tests/contrib/aiomysql/test_aiomysql.py b/tests/contrib/aiomysql/test_aiomysql.py
index 0bf8839dc96..8199b5c16a1 100644
--- a/tests/contrib/aiomysql/test_aiomysql.py
+++ b/tests/contrib/aiomysql/test_aiomysql.py
@@ -5,11 +5,11 @@
import pymysql
import pytest
-from ddtrace import Tracer
from ddtrace.contrib.internal.aiomysql.patch import patch
from ddtrace.contrib.internal.aiomysql.patch import unpatch
from ddtrace.internal.schema import DEFAULT_SPAN_SERVICE_NAME
from ddtrace.trace import Pin
+from ddtrace.trace import Tracer
from tests.contrib import shared_tests_async as shared_tests
from tests.contrib.asyncio.utils import AsyncioTestCase
from tests.contrib.asyncio.utils import mark_asyncio
diff --git a/tests/contrib/asyncio/test_lazyimport.py b/tests/contrib/asyncio/test_lazyimport.py
index 07c96bc799f..ec54022de40 100644
--- a/tests/contrib/asyncio/test_lazyimport.py
+++ b/tests/contrib/asyncio/test_lazyimport.py
@@ -4,7 +4,7 @@
@pytest.mark.subprocess()
def test_lazy_import():
import ddtrace.auto # noqa: F401,I001
- from ddtrace import tracer # noqa: I001
+ from ddtrace.trace import tracer # noqa: I001
assert tracer.context_provider.active() is None
span = tracer.trace("itsatest", service="test", resource="resource", span_type="http")
diff --git a/tests/contrib/asyncio/test_propagation.py b/tests/contrib/asyncio/test_propagation.py
index fa78e975c9f..fd962e544ea 100644
--- a/tests/contrib/asyncio/test_propagation.py
+++ b/tests/contrib/asyncio/test_propagation.py
@@ -3,10 +3,10 @@
import pytest
-from ddtrace._trace.context import Context
from ddtrace._trace.provider import DefaultContextProvider
from ddtrace.contrib.internal.asyncio.patch import patch
from ddtrace.contrib.internal.asyncio.patch import unpatch
+from ddtrace.trace import Context
from tests.opentracer.utils import init_tracer
diff --git a/tests/contrib/asyncpg/test_asyncpg.py b/tests/contrib/asyncpg/test_asyncpg.py
index c60bfae1456..5e5b649faaf 100644
--- a/tests/contrib/asyncpg/test_asyncpg.py
+++ b/tests/contrib/asyncpg/test_asyncpg.py
@@ -5,11 +5,11 @@
import mock
import pytest
-from ddtrace import tracer
from ddtrace.contrib.internal.asyncpg.patch import patch
from ddtrace.contrib.internal.asyncpg.patch import unpatch
from ddtrace.contrib.internal.trace_utils import iswrapped
from ddtrace.trace import Pin
+from ddtrace.trace import tracer
from tests.contrib.asyncio.utils import AsyncioTestCase
from tests.contrib.asyncio.utils import mark_asyncio
from tests.contrib.config import POSTGRES_CONFIG
diff --git a/tests/contrib/aws_lambda/handlers.py b/tests/contrib/aws_lambda/handlers.py
index 99870cf0166..3a0775f2abb 100644
--- a/tests/contrib/aws_lambda/handlers.py
+++ b/tests/contrib/aws_lambda/handlers.py
@@ -2,7 +2,7 @@
from datadog_lambda.wrapper import datadog_lambda_wrapper
-from ddtrace import tracer
+from ddtrace.trace import tracer
@datadog_lambda_wrapper
diff --git a/tests/contrib/celery/test_integration.py b/tests/contrib/celery/test_integration.py
index 717ed1de359..2ac6e1a61d0 100644
--- a/tests/contrib/celery/test_integration.py
+++ b/tests/contrib/celery/test_integration.py
@@ -8,12 +8,12 @@
import mock
import pytest
-from ddtrace._trace.context import Context
from ddtrace.constants import ERROR_MSG
from ddtrace.contrib.internal.celery.patch import patch
from ddtrace.contrib.internal.celery.patch import unpatch
import ddtrace.internal.forksafe as forksafe
from ddtrace.propagation.http import HTTPPropagator
+from ddtrace.trace import Context
from ddtrace.trace import Pin
from tests.opentracer.utils import init_tracer
from tests.utils import flaky
diff --git a/tests/contrib/celery/test_utils.py b/tests/contrib/celery/test_utils.py
index 3c9e0f09d16..8b498d33350 100644
--- a/tests/contrib/celery/test_utils.py
+++ b/tests/contrib/celery/test_utils.py
@@ -3,12 +3,12 @@
from mock import Mock
import pytest
-from ddtrace._trace.span import Span
from ddtrace.contrib.internal.celery.utils import attach_span
from ddtrace.contrib.internal.celery.utils import detach_span
from ddtrace.contrib.internal.celery.utils import retrieve_span
from ddtrace.contrib.internal.celery.utils import retrieve_task_id
from ddtrace.contrib.internal.celery.utils import set_tags_from_context
+from ddtrace.trace import Span
@pytest.fixture
diff --git a/tests/contrib/dbapi/test_dbapi.py b/tests/contrib/dbapi/test_dbapi.py
index 1f6be1d66f5..c60e49c56af 100644
--- a/tests/contrib/dbapi/test_dbapi.py
+++ b/tests/contrib/dbapi/test_dbapi.py
@@ -1,7 +1,6 @@
import mock
import pytest
-from ddtrace._trace.span import Span # noqa:F401
from ddtrace.contrib.dbapi import FetchTracedCursor
from ddtrace.contrib.dbapi import TracedConnection
from ddtrace.contrib.dbapi import TracedCursor
@@ -9,6 +8,7 @@
from ddtrace.settings import Config
from ddtrace.settings.integration import IntegrationConfig
from ddtrace.trace import Pin
+from ddtrace.trace import Span # noqa:F401
from tests.utils import TracerTestCase
from tests.utils import assert_is_measured
from tests.utils import assert_is_not_measured
diff --git a/tests/contrib/dbapi_async/test_dbapi_async.py b/tests/contrib/dbapi_async/test_dbapi_async.py
index 7343e875829..ceb2b0cf6a1 100644
--- a/tests/contrib/dbapi_async/test_dbapi_async.py
+++ b/tests/contrib/dbapi_async/test_dbapi_async.py
@@ -1,7 +1,6 @@
import mock
import pytest
-from ddtrace._trace.span import Span # noqa:F401
from ddtrace.contrib.dbapi_async import FetchTracedAsyncCursor
from ddtrace.contrib.dbapi_async import TracedAsyncConnection
from ddtrace.contrib.dbapi_async import TracedAsyncCursor
@@ -9,6 +8,7 @@
from ddtrace.settings import Config
from ddtrace.settings.integration import IntegrationConfig
from ddtrace.trace import Pin
+from ddtrace.trace import Span # noqa:F401
from tests.contrib.asyncio.utils import AsyncioTestCase
from tests.contrib.asyncio.utils import mark_asyncio
from tests.utils import assert_is_measured
diff --git a/tests/contrib/django/django_app/settings.py b/tests/contrib/django/django_app/settings.py
index 664690d71e1..431d9d7b4c4 100644
--- a/tests/contrib/django/django_app/settings.py
+++ b/tests/contrib/django/django_app/settings.py
@@ -2,7 +2,7 @@
import django
-from ddtrace import tracer
+from ddtrace.trace import tracer
from tests.webclient import PingFilter
diff --git a/tests/contrib/django/django_app/urls.py b/tests/contrib/django/django_app/urls.py
index 523a250d0c8..43d31c73613 100644
--- a/tests/contrib/django/django_app/urls.py
+++ b/tests/contrib/django/django_app/urls.py
@@ -11,7 +11,7 @@
from django.views.decorators.cache import cache_page
from django.views.generic import TemplateView
-from ddtrace import tracer
+from ddtrace.trace import tracer
from .. import views
diff --git a/tests/contrib/django/views.py b/tests/contrib/django/views.py
index f1989c374d7..dd45ce7e312 100644
--- a/tests/contrib/django/views.py
+++ b/tests/contrib/django/views.py
@@ -15,8 +15,8 @@
from django.views.generic import TemplateView
from django.views.generic import View
-from ddtrace import tracer
from ddtrace.contrib.internal.trace_utils import set_user
+from ddtrace.trace import tracer
class UserList(ListView):
diff --git a/tests/contrib/flask/app.py b/tests/contrib/flask/app.py
index d76ec8fb8b1..1e8e7b07683 100644
--- a/tests/contrib/flask/app.py
+++ b/tests/contrib/flask/app.py
@@ -6,9 +6,9 @@
from flask import Flask
from flask import request
-from ddtrace import tracer
from ddtrace.appsec._trace_utils import block_request_if_user_blocked
from ddtrace.contrib.internal.trace_utils import set_user
+from ddtrace.trace import tracer
from tests.webclient import PingFilter
@@ -60,7 +60,7 @@ def body():
@app.route("/checkuser/")
def checkuser(user_id):
- from ddtrace import tracer
+ from ddtrace.trace import tracer
block_request_if_user_blocked(tracer, user_id)
return "Ok", 200
diff --git a/tests/contrib/flask/test_flask_appsec.py b/tests/contrib/flask/test_flask_appsec.py
index 6937b9e4c03..edead3d10db 100644
--- a/tests/contrib/flask/test_flask_appsec.py
+++ b/tests/contrib/flask/test_flask_appsec.py
@@ -60,7 +60,7 @@ def test_route():
def test_flask_userblock_json(self):
@self.app.route("/checkuser/")
def test_route(user_id):
- from ddtrace import tracer
+ from ddtrace.trace import tracer
block_request_if_user_blocked(tracer, user_id)
return "Ok", 200
diff --git a/tests/contrib/flask_cache/test_utils.py b/tests/contrib/flask_cache/test_utils.py
index aa4d529c05f..fc5d640b5cf 100644
--- a/tests/contrib/flask_cache/test_utils.py
+++ b/tests/contrib/flask_cache/test_utils.py
@@ -2,11 +2,11 @@
from flask import Flask
-from ddtrace._trace.tracer import Tracer
from ddtrace.contrib.internal.flask_cache.patch import get_traced_cache
from ddtrace.contrib.internal.flask_cache.utils import _extract_client
from ddtrace.contrib.internal.flask_cache.utils import _extract_conn_tags
from ddtrace.contrib.internal.flask_cache.utils import _resource_from_cache_prefix
+from ddtrace.trace import Tracer
from ..config import MEMCACHED_CONFIG
from ..config import REDIS_CONFIG
diff --git a/tests/contrib/freezegun/test_freezegun.py b/tests/contrib/freezegun/test_freezegun.py
index 95198486598..f5f17f1749c 100644
--- a/tests/contrib/freezegun/test_freezegun.py
+++ b/tests/contrib/freezegun/test_freezegun.py
@@ -4,8 +4,8 @@
import pytest
-from ddtrace import tracer as dd_tracer
from ddtrace.internal.utils.time import StopWatch
+from ddtrace.trace import tracer as dd_tracer
from tests.contrib.pytest.test_pytest import PytestTestCaseBase
@@ -88,7 +88,7 @@ def test_freezegun_pytest_plugin(self):
import freezegun
- from ddtrace import tracer as dd_tracer
+ from ddtrace.trace import tracer as dd_tracer
def test_pytest_patched_freezegun():
with freezegun.freeze_time("2020-01-01"):
diff --git a/tests/contrib/gevent/test_tracer.py b/tests/contrib/gevent/test_tracer.py
index d804a4e9c59..dc72ccc08ca 100644
--- a/tests/contrib/gevent/test_tracer.py
+++ b/tests/contrib/gevent/test_tracer.py
@@ -8,7 +8,7 @@
from ddtrace.constants import ERROR_MSG
from ddtrace.constants import _SAMPLING_PRIORITY_KEY
from ddtrace.constants import USER_KEEP
-from ddtrace._trace.context import Context
+from ddtrace.trace import Context
from ddtrace.contrib.internal.gevent.patch import patch
from ddtrace.contrib.internal.gevent.patch import unpatch
from tests.opentracer.utils import init_tracer
diff --git a/tests/contrib/graphql/test_graphql.py b/tests/contrib/graphql/test_graphql.py
index f6eca690b36..7072b35bc81 100644
--- a/tests/contrib/graphql/test_graphql.py
+++ b/tests/contrib/graphql/test_graphql.py
@@ -3,10 +3,10 @@
import graphql
import pytest
-from ddtrace import tracer
from ddtrace.contrib.internal.graphql.patch import _graphql_version as graphql_version
from ddtrace.contrib.internal.graphql.patch import patch
from ddtrace.contrib.internal.graphql.patch import unpatch
+from ddtrace.trace import tracer
from tests.utils import override_config
from tests.utils import snapshot
diff --git a/tests/contrib/grpc/test_grpc.py b/tests/contrib/grpc/test_grpc.py
index 1ad7900d33b..d0559f2dff5 100644
--- a/tests/contrib/grpc/test_grpc.py
+++ b/tests/contrib/grpc/test_grpc.py
@@ -630,8 +630,8 @@ def intercept_unary_unary(self, continuation, client_call_details, request):
def test_handle_response_future_like():
- from ddtrace._trace.span import Span
from ddtrace.contrib.internal.grpc.client_interceptor import _handle_response
+ from ddtrace.trace import Span
span = Span(None)
diff --git a/tests/contrib/gunicorn/wsgi_mw_app.py b/tests/contrib/gunicorn/wsgi_mw_app.py
index 9cf9927ff34..0de0e4e9ae4 100644
--- a/tests/contrib/gunicorn/wsgi_mw_app.py
+++ b/tests/contrib/gunicorn/wsgi_mw_app.py
@@ -10,10 +10,10 @@
import json
-from ddtrace import tracer
from ddtrace.contrib.internal.wsgi.wsgi import DDWSGIMiddleware
from ddtrace.profiling import bootstrap
import ddtrace.profiling.auto # noqa:F401
+from ddtrace.trace import tracer
from tests.webclient import PingFilter
diff --git a/tests/contrib/kafka/test_kafka.py b/tests/contrib/kafka/test_kafka.py
index d5858574ef9..c67bdd08b01 100644
--- a/tests/contrib/kafka/test_kafka.py
+++ b/tests/contrib/kafka/test_kafka.py
@@ -11,7 +11,6 @@
import mock
import pytest
-from ddtrace import Tracer
from ddtrace.contrib.internal.kafka.patch import TracedConsumer
from ddtrace.contrib.internal.kafka.patch import patch
from ddtrace.contrib.internal.kafka.patch import unpatch
@@ -23,6 +22,7 @@
from ddtrace.internal.utils.retry import fibonacci_backoff_with_jitter
from ddtrace.trace import Pin
from ddtrace.trace import TraceFilter
+from ddtrace.trace import Tracer
from tests.contrib.config import KAFKA_CONFIG
from tests.datastreams.test_public_api import MockedTracer
from tests.utils import DummyTracer
diff --git a/tests/contrib/langchain/test_langchain.py b/tests/contrib/langchain/test_langchain.py
deleted file mode 100644
index 57cb6139db4..00000000000
--- a/tests/contrib/langchain/test_langchain.py
+++ /dev/null
@@ -1,1073 +0,0 @@
-import os
-import re
-import sys
-
-import langchain as _langchain
-import mock
-import pytest
-
-from ddtrace.internal.utils.version import parse_version
-from tests.contrib.langchain.utils import get_request_vcr
-from tests.contrib.langchain.utils import long_input_text
-from tests.utils import override_global_config
-
-
-pytestmark = pytest.mark.skipif(
- parse_version(_langchain.__version__) >= (0, 1), reason="This module only tests langchain < 0.1"
-)
-
-PY39 = sys.version_info < (3, 10)
-
-
-@pytest.fixture(scope="session")
-def request_vcr():
- yield get_request_vcr(subdirectory_name="langchain")
-
-
-@pytest.mark.parametrize("ddtrace_config_langchain", [dict(logs_enabled=True, log_prompt_completion_sample_rate=1.0)])
-def test_global_tags(ddtrace_config_langchain, langchain, request_vcr, mock_metrics, mock_logs, mock_tracer):
- """
- When the global config UST tags are set
- The service name should be used for all data
- The env should be used for all data
- The version should be used for all data
- """
- llm = langchain.llms.OpenAI(model="text-davinci-003")
- with override_global_config(dict(service="test-svc", env="staging", version="1234")):
- cassette_name = "openai_completion_sync_39.yaml" if PY39 else "openai_completion_sync.yaml"
- with request_vcr.use_cassette(cassette_name):
- llm("What does Nietzsche mean by 'God is dead'?")
-
- span = mock_tracer.pop_traces()[0][0]
- assert span.resource == "langchain.llms.openai.OpenAI" # check this needs changed
- assert span.service == "test-svc"
- assert span.get_tag("env") == "staging"
- assert span.get_tag("version") == "1234"
- assert span.get_tag("langchain.request.provider") == "openai"
- assert span.get_tag("langchain.request.model") == "text-davinci-003"
- assert span.get_tag("langchain.request.api_key") == "...key>"
-
- assert mock_logs.enqueue.call_count == 1
- assert mock_metrics.mock_calls
- for _, _args, kwargs in mock_metrics.mock_calls:
- expected_metrics = [
- "service:test-svc",
- "env:staging",
- "version:1234",
- "langchain.request.model:text-davinci-003",
- "langchain.request.provider:openai",
- "langchain.request.type:llm",
- "langchain.request.api_key:...key>",
- ]
- actual_tags = kwargs.get("tags")
- for m in expected_metrics:
- assert m in actual_tags
-
- for call, args, _kwargs in mock_logs.mock_calls:
- if call != "enqueue":
- continue
- log = args[0]
- assert log["service"] == "test-svc"
- assert (
- log["ddtags"]
- == "env:staging,version:1234,langchain.request.provider:openai,langchain.request.model:text-davinci-003,langchain.request.type:llm,langchain.request.api_key:...key>" # noqa: E501
- )
-
-
-@pytest.mark.skipif(PY39, reason="Python 3.10+ specific test")
-@pytest.mark.snapshot(ignores=["metrics.langchain.tokens.total_cost", "resource"])
-def test_openai_llm_sync(langchain, request_vcr):
- llm = langchain.llms.OpenAI(model="text-davinci-003")
- with request_vcr.use_cassette("openai_completion_sync.yaml"):
- llm("Can you explain what Descartes meant by 'I think, therefore I am'?")
-
-
-@pytest.mark.skipif(not PY39, reason="Python 3.9 specific test")
-@pytest.mark.snapshot(ignores=["metrics.langchain.tokens.total_cost"])
-def test_openai_llm_sync_39(langchain, request_vcr):
- llm = langchain.llms.OpenAI(model="text-davinci-003")
- with request_vcr.use_cassette("openai_completion_sync_39.yaml"):
- llm("Can you explain what Descartes meant by 'I think, therefore I am'?")
-
-
-@pytest.mark.skipif(PY39, reason="Python 3.10+ specific test")
-@pytest.mark.snapshot(ignores=["resource"])
-def test_openai_llm_sync_multiple_prompts(langchain, request_vcr):
- llm = langchain.llms.OpenAI(model="text-davinci-003")
- with request_vcr.use_cassette("openai_completion_sync_multi_prompt.yaml"):
- llm.generate(
- prompts=[
- "What is the best way to teach a baby multiple languages?",
- "How many times has Spongebob failed his road test?",
- ]
- )
-
-
-@pytest.mark.skipif(not PY39, reason="Python 3.9 specific test")
-@pytest.mark.snapshot
-def test_openai_llm_sync_multiple_prompts_39(langchain, request_vcr):
- llm = langchain.llms.OpenAI(model="text-davinci-003")
- with request_vcr.use_cassette("openai_completion_sync_multi_prompt_39.yaml"):
- llm.generate(
- [
- "What is the best way to teach a baby multiple languages?",
- "How many times has Spongebob failed his road test?",
- ]
- )
-
-
-@pytest.mark.asyncio
-@pytest.mark.snapshot(ignores=["resource", "langchain.request.openai.parameters.request_timeout"])
-async def test_openai_llm_async(langchain, request_vcr):
- llm = langchain.llms.OpenAI(model="text-davinci-003")
- cassette_name = "openai_completion_async_39.yaml" if PY39 else "openai_completion_async.yaml"
- with request_vcr.use_cassette(cassette_name):
- await llm.agenerate(["Which team won the 2019 NBA finals?"])
-
-
-@pytest.mark.snapshot(ignores=["meta.error.stack", "resource"])
-def test_openai_llm_error(langchain, request_vcr):
- import openai # Imported here because the os env OPENAI_API_KEY needs to be set via langchain fixture before import
-
- llm = langchain.llms.OpenAI(model="text-davinci-003")
-
- if parse_version(openai.__version__) >= (1, 0, 0):
- invalid_error = openai.BadRequestError
- else:
- invalid_error = openai.InvalidRequestError
- with pytest.raises(invalid_error):
- with request_vcr.use_cassette("openai_completion_error.yaml"):
- llm.generate([12345, 123456])
-
-
-@pytest.mark.snapshot(ignores=["resource"])
-def test_cohere_llm_sync(langchain, request_vcr):
- llm = langchain.llms.Cohere(cohere_api_key=os.getenv("COHERE_API_KEY", ""))
- with request_vcr.use_cassette("cohere_completion_sync.yaml"):
- llm("What is the secret Krabby Patty recipe?")
-
-
-@pytest.mark.snapshot(ignores=["resource"])
-def test_huggingfacehub_llm_sync(langchain, request_vcr):
- llm = langchain.llms.HuggingFaceHub(
- repo_id="google/flan-t5-xxl",
- model_kwargs={"temperature": 0.5, "max_length": 256},
- huggingfacehub_api_token=os.getenv("HUGGINGFACEHUB_API_TOKEN", ""),
- )
- with request_vcr.use_cassette("huggingfacehub_completion_sync.yaml"):
- llm("Why does Mr. Krabs have a whale daughter?")
-
-
-@pytest.mark.snapshot(ignores=["meta.langchain.response.completions.0.text", "resource"])
-def test_ai21_llm_sync(langchain, request_vcr):
- llm = langchain.llms.AI21(ai21_api_key=os.getenv("AI21_API_KEY", ""))
- cassette_name = "ai21_completion_sync_39.yaml" if PY39 else "ai21_completion_sync.yaml"
- with request_vcr.use_cassette(cassette_name):
- llm("Why does everyone in Bikini Bottom hate Plankton?")
-
-
-def test_openai_llm_metrics(langchain, request_vcr, mock_metrics, mock_logs, snapshot_tracer):
- llm = langchain.llms.OpenAI(model="text-davinci-003")
- cassette_name = "openai_completion_sync_39.yaml" if PY39 else "openai_completion_sync.yaml"
- with request_vcr.use_cassette(cassette_name):
- llm("Can you explain what Descartes meant by 'I think, therefore I am'?")
- expected_tags = [
- "version:",
- "env:",
- "service:tests.contrib.langchain",
- "langchain.request.provider:openai",
- "langchain.request.model:text-davinci-003",
- "langchain.request.type:llm",
- "langchain.request.api_key:...key>",
- "error:0",
- ]
- mock_metrics.assert_has_calls(
- [
- mock.call.distribution("tokens.prompt", 17, tags=expected_tags),
- mock.call.distribution("tokens.completion", mock.ANY, tags=expected_tags),
- mock.call.distribution("tokens.total", mock.ANY, tags=expected_tags),
- mock.call.increment("tokens.total_cost", mock.ANY, tags=expected_tags),
- mock.call.distribution("request.duration", mock.ANY, tags=expected_tags),
- ],
- any_order=True,
- )
- mock_logs.assert_not_called()
-
-
-@pytest.mark.parametrize(
- "ddtrace_config_langchain",
- [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)],
-)
-def test_llm_logs(langchain, ddtrace_config_langchain, request_vcr, mock_logs, mock_metrics, mock_tracer):
- llm = langchain.llms.OpenAI(model="text-davinci-003")
- cassette_name = "openai_completion_sync_39.yaml" if PY39 else "openai_completion_sync.yaml"
- with request_vcr.use_cassette(cassette_name):
- llm("Can you explain what Descartes meant by 'I think, therefore I am'?")
- span = mock_tracer.pop_traces()[0][0]
- trace_id, span_id = span.trace_id, span.span_id
-
- assert mock_logs.enqueue.call_count == 1
- mock_logs.enqueue.assert_called_with(
- {
- "timestamp": mock.ANY,
- "message": "sampled langchain.llms.openai.OpenAI",
- "hostname": mock.ANY,
- "ddsource": "langchain",
- "service": "tests.contrib.langchain",
- "status": "info",
- "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:text-davinci-003,langchain.request.type:llm,langchain.request.api_key:...key>", # noqa: E501
- "dd.trace_id": hex(trace_id)[2:],
- "dd.span_id": str(span_id),
- "prompts": ["Can you explain what Descartes meant by 'I think, therefore I am'?"],
- "choices": mock.ANY,
- }
- )
- mock_metrics.increment.assert_not_called()
- mock_metrics.distribution.assert_not_called()
- mock_metrics.count.assert_not_called()
-
-
-@pytest.mark.skipif(PY39, reason="Python 3.10+ specific test")
-@pytest.mark.snapshot(
- token="tests.contrib.langchain.test_langchain.test_openai_chat_model_call",
- ignores=["metrics.langchain.tokens.total_cost", "resource"],
-)
-def test_openai_chat_model_sync_call(langchain, request_vcr):
- chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256)
- with request_vcr.use_cassette("openai_chat_completion_sync_call.yaml"):
- chat(messages=[langchain.schema.HumanMessage(content="When do you use 'whom' instead of 'who'?")])
-
-
-@pytest.mark.skipif(not PY39, reason="Python 3.9 specific test")
-@pytest.mark.snapshot(ignores=["metrics.langchain.tokens.total_cost"])
-def test_openai_chat_model_sync_call_39(langchain, request_vcr):
- chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256)
- with request_vcr.use_cassette("openai_chat_completion_sync_call_39.yaml"):
- chat([langchain.schema.HumanMessage(content="When do you use 'whom' instead of 'who'?")])
-
-
-@pytest.mark.skipif(PY39, reason="Python 3.10+ specific test")
-@pytest.mark.snapshot(
- token="tests.contrib.langchain.test_langchain.test_openai_chat_model_generate",
- ignores=["metrics.langchain.tokens.total_cost", "resource"],
-)
-def test_openai_chat_model_sync_generate(langchain, request_vcr):
- chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256)
- with request_vcr.use_cassette("openai_chat_completion_sync_generate.yaml"):
- chat.generate(
- [
- [
- langchain.schema.SystemMessage(content="Respond like a frat boy."),
- langchain.schema.HumanMessage(
- content="Where's the nearest equinox gym from Hudson Yards manhattan?"
- ),
- ],
- [
- langchain.schema.SystemMessage(content="Respond with a pirate accent."),
- langchain.schema.HumanMessage(content="How does one get to Bikini Bottom from New York?"),
- ],
- ]
- )
-
-
-@pytest.mark.skipif(not PY39, reason="Python 3.9 specific test")
-@pytest.mark.snapshot(ignores=["metrics.langchain.tokens.total_cost"])
-def test_openai_chat_model_sync_generate_39(langchain, request_vcr):
- chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256)
- with request_vcr.use_cassette("openai_chat_completion_sync_generate_39.yaml"):
- chat.generate(
- [
- [
- langchain.schema.SystemMessage(content="Respond like a frat boy."),
- langchain.schema.HumanMessage(
- content="Where's the nearest equinox gym from Hudson Yards manhattan?"
- ),
- ],
- [
- langchain.schema.SystemMessage(content="Respond with a pirate accent."),
- langchain.schema.HumanMessage(content="How does one get to Bikini Bottom from New York?"),
- ],
- ]
- )
-
-
-@pytest.mark.asyncio
-@pytest.mark.snapshot(
- token="tests.contrib.langchain.test_langchain.test_openai_chat_model_call",
- ignores=["metrics.langchain.tokens.total_cost", "resource"],
-)
-async def test_openai_chat_model_async_call(langchain, request_vcr):
- chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256)
- with request_vcr.use_cassette("openai_chat_completion_async_call.yaml"):
- await chat._call_async([langchain.schema.HumanMessage(content="When do you use 'whom' instead of 'who'?")])
-
-
-@pytest.mark.asyncio
-@pytest.mark.snapshot(
- token="tests.contrib.langchain.test_langchain.test_openai_chat_model_generate",
- ignores=["metrics.langchain.tokens.total_cost", "resource"],
-)
-async def test_openai_chat_model_async_generate(langchain, request_vcr):
- chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256)
- with request_vcr.use_cassette("openai_chat_completion_async_generate.yaml"):
- await chat.agenerate(
- [
- [
- langchain.schema.SystemMessage(content="Respond like a frat boy."),
- langchain.schema.HumanMessage(
- content="Where's the nearest equinox gym from Hudson Yards manhattan?"
- ),
- ],
- [
- langchain.schema.SystemMessage(content="Respond with a pirate accent."),
- langchain.schema.HumanMessage(content="How does one get to Bikini Bottom from New York?"),
- ],
- ]
- )
-
-
-def test_chat_model_metrics(langchain, request_vcr, mock_metrics, mock_logs, snapshot_tracer):
- chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256)
- cassette_name = "openai_chat_completion_sync_call_39.yaml" if PY39 else "openai_chat_completion_sync_call.yaml"
- with request_vcr.use_cassette(cassette_name):
- chat([langchain.schema.HumanMessage(content="When do you use 'whom' instead of 'who'?")])
- expected_tags = [
- "version:",
- "env:",
- "service:tests.contrib.langchain",
- "langchain.request.provider:openai",
- "langchain.request.model:gpt-3.5-turbo",
- "langchain.request.type:chat_model",
- "langchain.request.api_key:...key>",
- "error:0",
- ]
- mock_metrics.assert_has_calls(
- [
- mock.call.distribution("tokens.prompt", 21, tags=expected_tags),
- mock.call.distribution("tokens.completion", 59, tags=expected_tags),
- mock.call.distribution("tokens.total", 80, tags=expected_tags),
- mock.call.increment("tokens.total_cost", mock.ANY, tags=expected_tags),
- mock.call.distribution("request.duration", mock.ANY, tags=expected_tags),
- ],
- any_order=True,
- )
- mock_logs.assert_not_called()
-
-
-@pytest.mark.parametrize(
- "ddtrace_config_langchain",
- [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)],
-)
-def test_chat_model_logs(langchain, ddtrace_config_langchain, request_vcr, mock_logs, mock_metrics, mock_tracer):
- chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256)
- cassette_name = "openai_chat_completion_sync_call_39.yaml" if PY39 else "openai_chat_completion_sync_call.yaml"
- with request_vcr.use_cassette(cassette_name):
- chat([langchain.schema.HumanMessage(content="When do you use 'whom' instead of 'who'?")])
- span = mock_tracer.pop_traces()[0][0]
- trace_id, span_id = span.trace_id, span.span_id
-
- assert mock_logs.enqueue.call_count == 1
- mock_logs.enqueue.assert_called_with(
- {
- "timestamp": mock.ANY,
- "message": "sampled langchain.chat_models.openai.ChatOpenAI",
- "hostname": mock.ANY,
- "ddsource": "langchain",
- "service": "tests.contrib.langchain",
- "status": "info",
- "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:gpt-3.5-turbo,langchain.request.type:chat_model,langchain.request.api_key:...key>", # noqa: E501
- "dd.trace_id": hex(trace_id)[2:],
- "dd.span_id": str(span_id),
- "messages": [[{"content": "When do you use 'whom' instead of 'who'?", "message_type": "HumanMessage"}]],
- "choices": [[{"content": mock.ANY, "message_type": "AIMessage"}]],
- }
- )
- mock_metrics.increment.assert_not_called()
- mock_metrics.distribution.assert_not_called()
- mock_metrics.count.assert_not_called()
-
-
-@pytest.mark.snapshot
-def test_openai_embedding_query(langchain, request_vcr):
- embeddings = langchain.embeddings.OpenAIEmbeddings()
- cassette_name = "openai_embedding_query_39.yaml" if PY39 else "openai_embedding_query.yaml"
- with request_vcr.use_cassette(cassette_name):
- embeddings.embed_query("this is a test query.")
-
-
-@pytest.mark.skip(reason="Tiktoken request to get model encodings cannot be made in CI")
-@pytest.mark.snapshot
-def test_openai_embedding_document(langchain, request_vcr):
- embeddings = langchain.embeddings.OpenAIEmbeddings()
- cassette_name = "openai_embedding_document_39.yaml" if PY39 else "openai_embedding_document.yaml"
- with request_vcr.use_cassette(cassette_name):
- embeddings.embed_documents(["this is", "a test document."])
-
-
-@pytest.mark.snapshot(ignores=["resource"])
-def test_fake_embedding_query(langchain):
- embeddings = langchain.embeddings.FakeEmbeddings(size=99)
- embeddings.embed_query(text="foo")
-
-
-@pytest.mark.snapshot(ignores=["resource"])
-def test_fake_embedding_document(langchain):
- embeddings = langchain.embeddings.FakeEmbeddings(size=99)
- embeddings.embed_documents(texts=["foo", "bar"])
-
-
-def test_openai_embedding_metrics(langchain, request_vcr, mock_metrics, mock_logs, snapshot_tracer):
- embeddings = langchain.embeddings.OpenAIEmbeddings()
- cassette_name = "openai_embedding_query_39.yaml" if PY39 else "openai_embedding_query.yaml"
- with request_vcr.use_cassette(cassette_name):
- embeddings.embed_query("this is a test query.")
- expected_tags = [
- "version:",
- "env:",
- "service:tests.contrib.langchain",
- "langchain.request.provider:openai",
- "langchain.request.model:text-embedding-ada-002",
- "langchain.request.type:embedding",
- "langchain.request.api_key:...key>",
- "error:0",
- ]
- mock_metrics.assert_has_calls(
- [mock.call.distribution("request.duration", mock.ANY, tags=expected_tags)],
- any_order=True,
- )
- mock_logs.assert_not_called()
-
-
-@pytest.mark.parametrize(
- "ddtrace_config_langchain",
- [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)],
-)
-def test_embedding_logs(langchain, ddtrace_config_langchain, request_vcr, mock_logs, mock_metrics, mock_tracer):
- embeddings = langchain.embeddings.OpenAIEmbeddings()
- cassette_name = "openai_embedding_query_39.yaml" if PY39 else "openai_embedding_query.yaml"
- with request_vcr.use_cassette(cassette_name):
- embeddings.embed_query("this is a test query.")
- span = mock_tracer.pop_traces()[0][0]
- trace_id, span_id = span.trace_id, span.span_id
-
- assert mock_logs.enqueue.call_count == 1
- mock_logs.enqueue.assert_called_with(
- {
- "timestamp": mock.ANY,
- "message": "sampled langchain.embeddings.openai.OpenAIEmbeddings",
- "hostname": mock.ANY,
- "ddsource": "langchain",
- "service": "tests.contrib.langchain",
- "status": "info",
- "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:text-embedding-ada-002,langchain.request.type:embedding,langchain.request.api_key:...key>", # noqa: E501
- "dd.trace_id": hex(trace_id)[2:],
- "dd.span_id": str(span_id),
- "inputs": ["this is a test query."],
- }
- )
- mock_metrics.increment.assert_not_called()
- mock_metrics.distribution.assert_not_called()
- mock_metrics.count.assert_not_called()
-
-
-@pytest.mark.snapshot(
- token="tests.contrib.langchain.test_langchain.test_openai_math_chain",
- ignores=["metrics.langchain.tokens.total_cost", "resource"],
-)
-def test_openai_math_chain_sync(langchain, request_vcr):
- """
- Test that using the provided LLMMathChain will result in a 3-span trace with
- the overall LLMMathChain, LLMChain, and underlying OpenAI interface.
- """
- chain = langchain.chains.LLMMathChain(llm=langchain.llms.OpenAI(temperature=0))
- cassette_name = "openai_math_chain_sync_39.yaml" if PY39 else "openai_math_chain_sync.yaml"
- with request_vcr.use_cassette(cassette_name):
- chain.run("what is two raised to the fifty-fourth power?")
-
-
-@pytest.mark.asyncio
-@pytest.mark.snapshot(
- token="tests.contrib.langchain.test_langchain.test_openai_math_chain",
- ignores=["metrics.langchain.tokens.total_cost"],
-)
-async def test_openai_math_chain_async(langchain, request_vcr):
- """
- Test that using the provided LLMMathChain will result in a 3-span trace with
- the overall LLMMathChain, LLMChain, and underlying OpenAI interface.
- """
- chain = langchain.chains.LLMMathChain(llm=langchain.llms.OpenAI(temperature=0))
- with request_vcr.use_cassette("openai_math_chain_async.yaml"):
- await chain.acall("what is two raised to the fifty-fourth power?")
-
-
-@pytest.mark.snapshot(token="tests.contrib.langchain.test_langchain.test_cohere_math_chain")
-def test_cohere_math_chain_sync(langchain, request_vcr):
- """
- Test that using the provided LLMMathChain will result in a 3-span trace with
- the overall LLMMathChain, LLMChain, and underlying Cohere interface.
- """
- chain = langchain.chains.LLMMathChain(
- llm=langchain.llms.Cohere(cohere_api_key=os.getenv("COHERE_API_KEY", ""))
- )
- with request_vcr.use_cassette("cohere_math_chain_sync.yaml"):
- chain.run("what is thirteen raised to the .3432 power?")
-
-
-@pytest.mark.skipif(PY39, reason="Requires unnecessary cassette file for Python 3.9")
-@pytest.mark.snapshot(
- token="tests.contrib.langchain.test_langchain.test_openai_sequential_chain",
- ignores=["metrics.langchain.tokens.total_cost", "resource"],
-)
-def test_openai_sequential_chain(langchain, request_vcr):
- """
- Test that using a SequentialChain will result in a 4-span trace with
- the overall SequentialChain, TransformChain, LLMChain, and underlying OpenAI interface.
- """
-
- def _transform_func(inputs):
- """Helper function to replace multiple new lines and multiple spaces with a single space"""
- text = inputs["text"]
- text = re.sub(r"(\r\n|\r|\n){2,}", r"\n", text)
- text = re.sub(r"[ \t]+", " ", text)
- return {"output_text": text}
-
- clean_extra_spaces_chain = langchain.chains.TransformChain(
- input_variables=["text"], output_variables=["output_text"], transform=_transform_func
- )
- template = """Paraphrase this text:
-
- {output_text}
-
- In the style of a {style}.
-
- Paraphrase: """
- prompt = langchain.PromptTemplate(input_variables=["style", "output_text"], template=template)
- style_paraphrase_chain = langchain.chains.LLMChain(
- llm=langchain.llms.OpenAI(), prompt=prompt, output_key="final_output"
- )
- sequential_chain = langchain.chains.SequentialChain(
- chains=[clean_extra_spaces_chain, style_paraphrase_chain],
- input_variables=["text", "style"],
- output_variables=["final_output"],
- )
-
- input_text = """
- Chains allow us to combine multiple
-
-
- components together to create a single, coherent application.
-
- For example, we can create a chain that takes user input, format it with a PromptTemplate,
-
- and then passes the formatted response to an LLM. We can build more complex chains by combining
-
- multiple chains together, or by
-
-
- combining chains with other components.
- """
- with request_vcr.use_cassette("openai_paraphrase.yaml"):
- sequential_chain.run({"text": input_text, "style": "a 90s rapper"})
-
-
-@pytest.mark.skipif(PY39, reason="Requires unnecessary cassette file for Python 3.9")
-@pytest.mark.snapshot(ignores=["langchain.tokens.total_cost", "resource"])
-def test_openai_sequential_chain_with_multiple_llm_sync(langchain, request_vcr):
- template = """Paraphrase this text:
-
- {input_text}
-
- Paraphrase: """
- prompt = langchain.PromptTemplate(input_variables=["input_text"], template=template)
- style_paraphrase_chain = langchain.chains.LLMChain(
- llm=langchain.llms.OpenAI(), prompt=prompt, output_key="paraphrased_output"
- )
- rhyme_template = """Make this text rhyme:
-
- {paraphrased_output}
-
- Rhyme: """
- rhyme_prompt = langchain.PromptTemplate(input_variables=["paraphrased_output"], template=rhyme_template)
- rhyme_chain = langchain.chains.LLMChain(llm=langchain.llms.OpenAI(), prompt=rhyme_prompt, output_key="final_output")
- sequential_chain = langchain.chains.SequentialChain(
- chains=[style_paraphrase_chain, rhyme_chain],
- input_variables=["input_text"],
- output_variables=["final_output"],
- )
-
- with request_vcr.use_cassette("openai_sequential_paraphrase_and_rhyme_sync.yaml"):
- sequential_chain.run({"input_text": long_input_text})
-
-
-@pytest.mark.asyncio
-@pytest.mark.snapshot(ignores=["resource"])
-async def test_openai_sequential_chain_with_multiple_llm_async(langchain, request_vcr):
- template = """Paraphrase this text:
-
- {input_text}
-
- Paraphrase: """
- prompt = langchain.PromptTemplate(input_variables=["input_text"], template=template)
- style_paraphrase_chain = langchain.chains.LLMChain(
- llm=langchain.llms.OpenAI(), prompt=prompt, output_key="paraphrased_output"
- )
- rhyme_template = """Make this text rhyme:
-
- {paraphrased_output}
-
- Rhyme: """
- rhyme_prompt = langchain.PromptTemplate(input_variables=["paraphrased_output"], template=rhyme_template)
- rhyme_chain = langchain.chains.LLMChain(llm=langchain.llms.OpenAI(), prompt=rhyme_prompt, output_key="final_output")
- sequential_chain = langchain.chains.SequentialChain(
- chains=[style_paraphrase_chain, rhyme_chain],
- input_variables=["input_text"],
- output_variables=["final_output"],
- )
- with request_vcr.use_cassette("openai_sequential_paraphrase_and_rhyme_async.yaml"):
- await sequential_chain.acall({"input_text": long_input_text})
-
-
-def test_openai_chain_metrics(langchain, request_vcr, mock_metrics, mock_logs, snapshot_tracer):
- chain = langchain.chains.LLMMathChain(llm=langchain.llms.OpenAI(temperature=0))
- cassette_name = "openai_math_chain_sync_39.yaml" if PY39 else "openai_math_chain_sync.yaml"
- with request_vcr.use_cassette(cassette_name):
- chain.run("what is two raised to the fifty-fourth power?")
- expected_tags = [
- "version:",
- "env:",
- "service:tests.contrib.langchain",
- "langchain.request.provider:openai",
- "langchain.request.model:text-davinci-003",
- mock.ANY, # should be in format "langchain.request.type:"
- "langchain.request.api_key:...key>",
- "error:0",
- ]
- mock_metrics.assert_has_calls(
- [
- mock.call.distribution("tokens.prompt", 236, tags=expected_tags),
- mock.call.distribution("tokens.completion", 24, tags=expected_tags),
- mock.call.distribution("tokens.total", 260, tags=expected_tags),
- mock.call.increment("tokens.total_cost", mock.ANY, tags=expected_tags),
- mock.call.distribution("request.duration", mock.ANY, tags=expected_tags),
- ],
- any_order=True,
- )
- mock_logs.assert_not_called()
-
-
-@pytest.mark.parametrize(
- "ddtrace_config_langchain",
- [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)],
-)
-def test_chain_logs(langchain, ddtrace_config_langchain, request_vcr, mock_logs, mock_metrics, mock_tracer):
- chain = langchain.chains.LLMMathChain(llm=langchain.llms.OpenAI(temperature=0))
- cassette_name = "openai_math_chain_sync_39.yaml" if PY39 else "openai_math_chain_sync.yaml"
- with request_vcr.use_cassette(cassette_name):
- chain.run("what is two raised to the fifty-fourth power?")
- traces = mock_tracer.pop_traces()
- base_chain_span = traces[0][0]
- mid_chain_span = traces[0][1]
- llm_span = traces[0][2]
-
- assert mock_logs.enqueue.call_count == 3 # This operation includes 2 chains and 1 LLM call
- mock_logs.assert_has_calls(
- [
- mock.call.enqueue(
- {
- "timestamp": mock.ANY,
- "message": "sampled langchain.llms.openai.OpenAI",
- "hostname": mock.ANY,
- "ddsource": "langchain",
- "service": "tests.contrib.langchain",
- "status": "info",
- "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:text-davinci-003,langchain.request.type:llm,langchain.request.api_key:...key>", # noqa: E501
- "dd.trace_id": hex(llm_span.trace_id)[2:],
- "dd.span_id": str(llm_span.span_id),
- "prompts": mock.ANY,
- "choices": mock.ANY,
- }
- ),
- mock.call.enqueue(
- {
- "timestamp": mock.ANY,
- "message": "sampled langchain.chains.llm.LLMChain",
- "hostname": mock.ANY,
- "ddsource": "langchain",
- "service": "tests.contrib.langchain",
- "status": "info",
- "ddtags": "env:,version:,langchain.request.provider:,langchain.request.model:,langchain.request.type:chain,langchain.request.api_key:", # noqa: E501
- "dd.trace_id": hex(mid_chain_span.trace_id)[2:],
- "dd.span_id": str(mid_chain_span.span_id),
- "inputs": mock.ANY,
- "prompt": mock.ANY,
- "outputs": {
- "question": "what is two raised to the fifty-fourth power?",
- "stop": mock.ANY,
- "text": '\n```text\n2**54\n```\n...numexpr.evaluate("2**54")...\n',
- },
- }
- ),
- mock.call.enqueue(
- {
- "timestamp": mock.ANY,
- "message": "sampled langchain.chains.llm_math.base.LLMMathChain",
- "hostname": mock.ANY,
- "ddsource": "langchain",
- "service": "tests.contrib.langchain",
- "status": "info",
- "ddtags": "env:,version:,langchain.request.provider:,langchain.request.model:,langchain.request.type:chain,langchain.request.api_key:", # noqa: E501
- "dd.trace_id": hex(base_chain_span.trace_id)[2:],
- "dd.span_id": str(base_chain_span.span_id),
- "inputs": {"question": "what is two raised to the fifty-fourth power?"},
- "prompt": mock.ANY,
- "outputs": {
- "question": "what is two raised to the fifty-fourth power?",
- "answer": "Answer: 18014398509481984",
- },
- }
- ),
- ]
- )
- mock_metrics.increment.assert_not_called()
- mock_metrics.distribution.assert_not_called()
- mock_metrics.count.assert_not_called()
-
-
-def test_chat_prompt_template_does_not_parse_template(langchain, mock_tracer):
- """
- Test that tracing a chain with a ChatPromptTemplate does not try to directly parse the template,
- as ChatPromptTemplates do not contain a specific template attribute (which will lead to an attribute error)
- but instead contain multiple messages each with their own prompt template and are not trivial to tag.
- """
- import langchain.prompts.chat # noqa: F401
-
- with mock.patch("langchain.chat_models.openai.ChatOpenAI._generate", side_effect=Exception("Mocked Error")):
- with pytest.raises(Exception) as exc_info:
- chat = langchain.chat_models.ChatOpenAI(temperature=0)
- template = "You are a helpful assistant that translates english to pirate."
- system_message_prompt = langchain.prompts.chat.SystemMessagePromptTemplate.from_template(template)
- example_human = langchain.prompts.chat.HumanMessagePromptTemplate.from_template("Hi")
- example_ai = langchain.prompts.chat.AIMessagePromptTemplate.from_template("Argh me mateys")
- human_template = "{text}"
- human_message_prompt = langchain.prompts.chat.HumanMessagePromptTemplate.from_template(human_template)
- chat_prompt = langchain.prompts.chat.ChatPromptTemplate.from_messages(
- [system_message_prompt, example_human, example_ai, human_message_prompt]
- )
- chain = langchain.chains.LLMChain(llm=chat, prompt=chat_prompt)
- chain.run("I love programming.")
- assert str(exc_info.value) == "Mocked Error"
- traces = mock_tracer.pop_traces()
- chain_span = traces[0][0]
- assert chain_span.get_tag("langchain.request.inputs.text") == "I love programming."
- assert chain_span.get_tag("langchain.request.type") == "chain"
- assert chain_span.get_tag("langchain.request.prompt") is None
-
-
-@pytest.mark.snapshot
-def test_pinecone_vectorstore_similarity_search(langchain, request_vcr):
- """
- Test that calling a similarity search on a Pinecone vectorstore with langchain will
- result in a 2-span trace with a vectorstore span and underlying OpenAI embedding interface span.
- """
- import pinecone
-
- cassette_name = "openai_pinecone_similarity_search_39.yaml" if PY39 else "openai_pinecone_similarity_search.yaml"
- with request_vcr.use_cassette(cassette_name):
- pinecone.init(
- api_key=os.getenv("PINECONE_API_KEY", ""),
- environment=os.getenv("PINECONE_ENV", ""),
- )
- embed = langchain.embeddings.OpenAIEmbeddings(model="text-embedding-ada-002")
- index = pinecone.Index(index_name="langchain-retrieval")
- vectorstore = langchain.vectorstores.Pinecone(index, embed.embed_query, "text")
- vectorstore.similarity_search("Who was Alan Turing?", 1)
-
-
-@pytest.mark.skipif(PY39, reason="Cassette specific to Python 3.10+")
-@pytest.mark.snapshot
-def test_pinecone_vectorstore_retrieval_chain(langchain, request_vcr):
- """
- Test that calling a similarity search on a Pinecone vectorstore with langchain will
- result in a 2-span trace with a vectorstore span and underlying OpenAI embedding interface span.
- """
- import pinecone
-
- with request_vcr.use_cassette("openai_pinecone_vectorstore_retrieval_chain.yaml"):
- pinecone.init(
- api_key=os.getenv("PINECONE_API_KEY", ""),
- environment=os.getenv("PINECONE_ENV", ""),
- )
- embed = langchain.embeddings.OpenAIEmbeddings()
- index = pinecone.Index(index_name="langchain-retrieval")
- vectorstore = langchain.vectorstores.Pinecone(index, embed.embed_query, "text")
-
- llm = langchain.llms.OpenAI()
- qa_with_sources = langchain.chains.RetrievalQAWithSourcesChain.from_chain_type(
- llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever()
- )
- qa_with_sources("Who was Alan Turing?")
-
-
-@pytest.mark.skipif(not PY39, reason="Cassette specific to Python 3.9")
-@pytest.mark.snapshot
-def test_pinecone_vectorstore_retrieval_chain_39(langchain, request_vcr):
- """
- Test that calling a similarity search on a Pinecone vectorstore with langchain will
- result in a 2-span trace with a vectorstore span and underlying OpenAI embedding interface span.
- """
- import pinecone
-
- with request_vcr.use_cassette("openai_pinecone_vectorstore_retrieval_chain_39.yaml"):
- pinecone.init(
- api_key=os.getenv("PINECONE_API_KEY", ""),
- environment=os.getenv("PINECONE_ENV", ""),
- )
- embed = langchain.embeddings.OpenAIEmbeddings(model="text-embedding-ada-002")
- index = pinecone.Index(index_name="langchain-retrieval")
- vectorstore = langchain.vectorstores.Pinecone(index, embed.embed_query, "text")
-
- llm = langchain.llms.OpenAI()
- qa_with_sources = langchain.chains.RetrievalQAWithSourcesChain.from_chain_type(
- llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever()
- )
- qa_with_sources("Who was Alan Turing?")
-
-
-def test_vectorstore_similarity_search_metrics(langchain, request_vcr, mock_metrics, mock_logs, snapshot_tracer):
- import pinecone
-
- cassette_name = "openai_pinecone_similarity_search_39.yaml" if PY39 else "openai_pinecone_similarity_search.yaml"
- with request_vcr.use_cassette(cassette_name):
- pinecone.init(
- api_key=os.getenv("PINECONE_API_KEY", ""),
- environment=os.getenv("PINECONE_ENV", ""),
- )
- embed = langchain.embeddings.OpenAIEmbeddings(model="text-embedding-ada-002")
- index = pinecone.Index(index_name="langchain-retrieval")
- vectorstore = langchain.vectorstores.Pinecone(index, embed.embed_query, "text")
- vectorstore.similarity_search("Who was Alan Turing?", 1)
- expected_tags = [
- "version:",
- "env:",
- "service:tests.contrib.langchain",
- "langchain.request.provider:pinecone",
- "langchain.request.model:",
- "langchain.request.type:similarity_search",
- "langchain.request.api_key:...key>",
- "error:0",
- ]
- mock_metrics.assert_has_calls(
- [mock.call.distribution("request.duration", mock.ANY, tags=expected_tags)],
- any_order=True,
- )
- mock_logs.assert_not_called()
-
-
-@pytest.mark.parametrize(
- "ddtrace_config_langchain",
- [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)],
-)
-def test_vectorstore_logs(langchain, ddtrace_config_langchain, request_vcr, mock_logs, mock_metrics, mock_tracer):
- import pinecone
-
- cassette_name = "openai_pinecone_similarity_search_39.yaml" if PY39 else "openai_pinecone_similarity_search.yaml"
- with request_vcr.use_cassette(cassette_name):
- pinecone.init(
- api_key=os.getenv("PINECONE_API_KEY", ""),
- environment=os.getenv("PINECONE_ENV", ""),
- )
- embed = langchain.embeddings.OpenAIEmbeddings(model="text-embedding-ada-002")
- index = pinecone.Index(index_name="langchain-retrieval")
- vectorstore = langchain.vectorstores.Pinecone(index, embed.embed_query, "text")
- vectorstore.similarity_search("Who was Alan Turing?", 1)
- traces = mock_tracer.pop_traces()
- vectorstore_span = traces[0][0]
- embeddings_span = traces[0][1]
-
- assert mock_logs.enqueue.call_count == 2 # This operation includes 1 vectorstore call and 1 embeddings call
- mock_logs.assert_has_calls(
- [
- mock.call.enqueue(
- {
- "timestamp": mock.ANY,
- "message": "sampled langchain.embeddings.openai.OpenAIEmbeddings",
- "hostname": mock.ANY,
- "ddsource": "langchain",
- "service": "tests.contrib.langchain",
- "status": "info",
- "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:text-embedding-ada-002,langchain.request.type:embedding,langchain.request.api_key:...key>", # noqa: E501
- "dd.trace_id": hex(embeddings_span.trace_id)[2:],
- "dd.span_id": str(embeddings_span.span_id),
- "inputs": ["Who was Alan Turing?"],
- }
- ),
- mock.call.enqueue(
- {
- "timestamp": mock.ANY,
- "message": "sampled langchain.vectorstores.pinecone.Pinecone",
- "hostname": mock.ANY,
- "ddsource": "langchain",
- "service": "tests.contrib.langchain",
- "status": "info",
- "ddtags": "env:,version:,langchain.request.provider:pinecone,langchain.request.model:,langchain.request.type:similarity_search,langchain.request.api_key:...key>", # noqa: E501
- "dd.trace_id": hex(vectorstore_span.trace_id)[2:],
- "dd.span_id": str(vectorstore_span.span_id),
- "query": "Who was Alan Turing?",
- "k": 1,
- "documents": mock.ANY,
- }
- ),
- ]
- )
- mock_metrics.increment.assert_not_called()
- mock_metrics.distribution.assert_not_called()
- mock_metrics.count.assert_not_called()
-
-
-@pytest.mark.parametrize(
- "ddtrace_config_langchain",
- [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)],
-)
-def test_llm_logs_when_response_not_completed(
- langchain, ddtrace_config_langchain, mock_logs, mock_metrics, mock_tracer
-):
- """Test that errors get logged even if the response is not returned."""
- with mock.patch("langchain.llms.openai.OpenAI._generate", side_effect=Exception("Mocked Error")):
- with pytest.raises(Exception) as exc_info:
- llm = langchain.llms.OpenAI(model="text-davinci-003")
- llm("Can you please not return an error?")
- assert str(exc_info.value) == "Mocked Error"
- span = mock_tracer.pop_traces()[0][0]
- trace_id, span_id = span.trace_id, span.span_id
-
- assert mock_logs.enqueue.call_count == 1
- mock_logs.enqueue.assert_called_with(
- {
- "timestamp": mock.ANY,
- "message": "sampled langchain.llms.openai.OpenAI",
- "hostname": mock.ANY,
- "ddsource": "langchain",
- "service": "tests.contrib.langchain",
- "status": "error",
- "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:text-davinci-003,langchain.request.type:llm,langchain.request.api_key:...key>", # noqa: E501
- "dd.trace_id": hex(trace_id)[2:],
- "dd.span_id": str(span_id),
- "prompts": ["Can you please not return an error?"],
- "choices": [],
- }
- )
-
-
-@pytest.mark.parametrize(
- "ddtrace_config_langchain",
- [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)],
-)
-def test_chat_model_logs_when_response_not_completed(
- langchain, ddtrace_config_langchain, mock_logs, mock_metrics, mock_tracer
-):
- """Test that errors get logged even if the response is not returned."""
- with mock.patch("langchain.chat_models.openai.ChatOpenAI._generate", side_effect=Exception("Mocked Error")):
- with pytest.raises(Exception) as exc_info:
- chat = langchain.chat_models.ChatOpenAI(temperature=0, max_tokens=256)
- chat([langchain.schema.HumanMessage(content="Can you please not return an error?")])
- assert str(exc_info.value) == "Mocked Error"
- span = mock_tracer.pop_traces()[0][0]
- trace_id, span_id = span.trace_id, span.span_id
-
- assert mock_logs.enqueue.call_count == 1
- mock_logs.enqueue.assert_called_with(
- {
- "timestamp": mock.ANY,
- "message": "sampled langchain.chat_models.openai.ChatOpenAI",
- "hostname": mock.ANY,
- "ddsource": "langchain",
- "service": "tests.contrib.langchain",
- "status": "error",
- "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:gpt-3.5-turbo,langchain.request.type:chat_model,langchain.request.api_key:...key>", # noqa: E501
- "dd.trace_id": hex(trace_id)[2:],
- "dd.span_id": str(span_id),
- "messages": [[{"content": "Can you please not return an error?", "message_type": "HumanMessage"}]],
- "choices": [],
- }
- )
-
-
-@pytest.mark.parametrize(
- "ddtrace_config_langchain",
- [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)],
-)
-def test_embedding_logs_when_response_not_completed(
- langchain, ddtrace_config_langchain, mock_logs, mock_metrics, mock_tracer
-):
- """Test that errors get logged even if the response is not returned."""
- with mock.patch(
- "langchain.embeddings.openai.OpenAIEmbeddings._embedding_func",
- side_effect=Exception("Mocked Error"),
- ):
- with pytest.raises(Exception) as exc_info:
- embeddings = langchain.embeddings.OpenAIEmbeddings()
- embeddings.embed_query("Can you please not return an error?")
- assert str(exc_info.value) == "Mocked Error"
- span = mock_tracer.pop_traces()[0][0]
- trace_id, span_id = span.trace_id, span.span_id
-
- assert mock_logs.enqueue.call_count == 1
- mock_logs.enqueue.assert_called_with(
- {
- "timestamp": mock.ANY,
- "message": "sampled langchain.embeddings.openai.OpenAIEmbeddings",
- "hostname": mock.ANY,
- "ddsource": "langchain",
- "service": "tests.contrib.langchain",
- "status": "error",
- "ddtags": "env:,version:,langchain.request.provider:openai,langchain.request.model:text-embedding-ada-002,langchain.request.type:embedding,langchain.request.api_key:...key>", # noqa: E501
- "dd.trace_id": hex(trace_id)[2:],
- "dd.span_id": str(span_id),
- "inputs": ["Can you please not return an error?"],
- }
- )
-
-
-@pytest.mark.parametrize(
- "ddtrace_config_langchain",
- [dict(metrics_enabled=False, logs_enabled=True, log_prompt_completion_sample_rate=1.0)],
-)
-def test_vectorstore_logs_error(langchain, ddtrace_config_langchain, mock_logs, mock_metrics, mock_tracer):
- """Test that errors get logged even if the response is not returned."""
- with mock.patch(
- "langchain.embeddings.openai.OpenAIEmbeddings._embedding_func",
- side_effect=Exception("Mocked Error"),
- ):
- with pytest.raises(Exception) as exc_info:
- import pinecone
-
- pinecone.init(
- api_key=os.getenv("PINECONE_API_KEY", ""),
- environment=os.getenv("PINECONE_ENV", ""),
- )
- embed = langchain.embeddings.OpenAIEmbeddings(
- model="text-embedding-ada-002", openai_api_key=os.getenv("OPENAI_API_KEY", "")
- )
- index = pinecone.Index(index_name="langchain-retrieval")
- vectorstore = langchain.vectorstores.Pinecone(index, embed.embed_query, "text")
- vectorstore.similarity_search("Can you please not return an error?", 1)
- assert str(exc_info.value) == "Mocked Error"
- traces = mock_tracer.pop_traces()
- vectorstore_span = traces[0][0]
- assert mock_logs.enqueue.call_count == 2 # This operation includes 1 vectorstore call and 1 embeddings call
- mock_logs.enqueue.assert_called_with(
- {
- "timestamp": mock.ANY,
- "message": "sampled langchain.vectorstores.pinecone.Pinecone",
- "hostname": mock.ANY,
- "ddsource": "langchain",
- "service": "tests.contrib.langchain",
- "status": "error",
- "ddtags": "env:,version:,langchain.request.provider:pinecone,langchain.request.model:,langchain.request.type:similarity_search,langchain.request.api_key:...key>", # noqa: E501
- "dd.trace_id": hex(vectorstore_span.trace_id)[2:],
- "dd.span_id": str(vectorstore_span.span_id),
- "query": "Can you please not return an error?",
- "k": 1,
- "documents": [],
- }
- )
diff --git a/tests/contrib/langchain/test_langchain_patch.py b/tests/contrib/langchain/test_langchain_patch.py
index 10df4ab60e9..56c1697179f 100644
--- a/tests/contrib/langchain/test_langchain_patch.py
+++ b/tests/contrib/langchain/test_langchain_patch.py
@@ -1,6 +1,5 @@
from ddtrace.contrib.internal.langchain.constants import text_embedding_models
from ddtrace.contrib.internal.langchain.constants import vectorstore_classes
-from ddtrace.contrib.internal.langchain.patch import PATCH_LANGCHAIN_V0
from ddtrace.contrib.internal.langchain.patch import get_version
from ddtrace.contrib.internal.langchain.patch import patch
from ddtrace.contrib.internal.langchain.patch import unpatch
@@ -15,36 +14,27 @@ class TestLangchainPatch(PatchTestCase.Base):
__get_version__ = get_version
def assert_module_patched(self, langchain):
- if PATCH_LANGCHAIN_V0:
- gated_langchain = langchain
- self.assert_wrapped(langchain.llms.base.BaseLLM.generate)
- self.assert_wrapped(langchain.llms.base.BaseLLM.agenerate)
- self.assert_wrapped(langchain.chat_models.base.BaseChatModel.generate)
- self.assert_wrapped(langchain.chat_models.base.BaseChatModel.agenerate)
- self.assert_wrapped(langchain.chains.base.Chain.__call__)
- self.assert_wrapped(langchain.chains.base.Chain.acall)
- else:
- try:
- import langchain_community as gated_langchain
- except ImportError:
- gated_langchain = None
+ try:
+ import langchain_community as gated_langchain
+ except ImportError:
+ gated_langchain = None
- import langchain_core
- import langchain_openai
- import langchain_pinecone
+ import langchain_core
+ import langchain_openai
+ import langchain_pinecone
- self.assert_wrapped(langchain_core.language_models.llms.BaseLLM.generate)
- self.assert_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate)
- self.assert_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate)
- self.assert_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate)
- self.assert_wrapped(langchain.chains.base.Chain.invoke)
- self.assert_wrapped(langchain.chains.base.Chain.ainvoke)
- self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.invoke)
- self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke)
- self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.batch)
- self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.abatch)
- self.assert_wrapped(langchain_openai.OpenAIEmbeddings.embed_documents)
- self.assert_wrapped(langchain_pinecone.PineconeVectorStore.similarity_search)
+ self.assert_wrapped(langchain_core.language_models.llms.BaseLLM.generate)
+ self.assert_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate)
+ self.assert_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate)
+ self.assert_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate)
+ self.assert_wrapped(langchain.chains.base.Chain.invoke)
+ self.assert_wrapped(langchain.chains.base.Chain.ainvoke)
+ self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.invoke)
+ self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke)
+ self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.batch)
+ self.assert_wrapped(langchain_core.runnables.base.RunnableSequence.abatch)
+ self.assert_wrapped(langchain_openai.OpenAIEmbeddings.embed_documents)
+ self.assert_wrapped(langchain_pinecone.PineconeVectorStore.similarity_search)
if not gated_langchain:
return
@@ -59,43 +49,31 @@ def assert_module_patched(self, langchain):
self.assert_wrapped(vectorstore_interface.similarity_search)
def assert_not_module_patched(self, langchain):
- if PATCH_LANGCHAIN_V0:
- from langchain import embeddings # noqa: F401
- from langchain import vectorstores # noqa: F401
+ from langchain import chains # noqa: F401
+ from langchain.chains import base # noqa: F401
- gated_langchain = langchain
- self.assert_not_wrapped(langchain.llms.base.BaseLLM.generate)
- self.assert_not_wrapped(langchain.llms.base.BaseLLM.agenerate)
- self.assert_not_wrapped(langchain.chat_models.base.BaseChatModel.generate)
- self.assert_not_wrapped(langchain.chat_models.base.BaseChatModel.agenerate)
- self.assert_not_wrapped(langchain.chains.base.Chain.__call__)
- self.assert_not_wrapped(langchain.chains.base.Chain.acall)
- else:
- from langchain import chains # noqa: F401
- from langchain.chains import base # noqa: F401
+ try:
+ import langchain_community as gated_langchain
+ from langchain_community import embeddings # noqa: F401
+ from langchain_community import vectorstores # noqa: F401
+ except ImportError:
+ gated_langchain = None
+ import langchain_core
+ import langchain_openai
+ import langchain_pinecone
- try:
- import langchain_community as gated_langchain
- from langchain_community import embeddings # noqa: F401
- from langchain_community import vectorstores # noqa: F401
- except ImportError:
- gated_langchain = None
- import langchain_core
- import langchain_openai
- import langchain_pinecone
-
- self.assert_not_wrapped(langchain_core.language_models.llms.BaseLLM.generate)
- self.assert_not_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate)
- self.assert_not_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate)
- self.assert_not_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate)
- self.assert_not_wrapped(langchain.chains.base.Chain.invoke)
- self.assert_not_wrapped(langchain.chains.base.Chain.ainvoke)
- self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.invoke)
- self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke)
- self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.batch)
- self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.abatch)
- self.assert_not_wrapped(langchain_openai.OpenAIEmbeddings.embed_documents)
- self.assert_not_wrapped(langchain_pinecone.PineconeVectorStore.similarity_search)
+ self.assert_not_wrapped(langchain_core.language_models.llms.BaseLLM.generate)
+ self.assert_not_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate)
+ self.assert_not_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate)
+ self.assert_not_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate)
+ self.assert_not_wrapped(langchain.chains.base.Chain.invoke)
+ self.assert_not_wrapped(langchain.chains.base.Chain.ainvoke)
+ self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.invoke)
+ self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke)
+ self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.batch)
+ self.assert_not_wrapped(langchain_core.runnables.base.RunnableSequence.abatch)
+ self.assert_not_wrapped(langchain_openai.OpenAIEmbeddings.embed_documents)
+ self.assert_not_wrapped(langchain_pinecone.PineconeVectorStore.similarity_search)
if not gated_langchain:
return
@@ -110,37 +88,28 @@ def assert_not_module_patched(self, langchain):
self.assert_not_wrapped(vectorstore_interface.similarity_search)
def assert_not_module_double_patched(self, langchain):
- if PATCH_LANGCHAIN_V0:
- gated_langchain = langchain
- self.assert_not_double_wrapped(langchain.llms.base.BaseLLM.generate)
- self.assert_not_double_wrapped(langchain.llms.base.BaseLLM.agenerate)
- self.assert_not_double_wrapped(langchain.chat_models.base.BaseChatModel.generate)
- self.assert_not_double_wrapped(langchain.chat_models.base.BaseChatModel.agenerate)
- self.assert_not_double_wrapped(langchain.chains.base.Chain.__call__)
- self.assert_not_double_wrapped(langchain.chains.base.Chain.acall)
- else:
- from langchain.chains import base # noqa: F401
+ from langchain.chains import base # noqa: F401
- try:
- import langchain_community as gated_langchain
- except ImportError:
- gated_langchain = None
- import langchain_core
- import langchain_openai
- import langchain_pinecone
+ try:
+ import langchain_community as gated_langchain
+ except ImportError:
+ gated_langchain = None
+ import langchain_core
+ import langchain_openai
+ import langchain_pinecone
- self.assert_not_double_wrapped(langchain_core.language_models.llms.BaseLLM.generate)
- self.assert_not_double_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate)
- self.assert_not_double_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate)
- self.assert_not_double_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate)
- self.assert_not_double_wrapped(langchain.chains.base.Chain.invoke)
- self.assert_not_double_wrapped(langchain.chains.base.Chain.ainvoke)
- self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.invoke)
- self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke)
- self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.batch)
- self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.abatch)
- self.assert_not_double_wrapped(langchain_openai.OpenAIEmbeddings.embed_documents)
- self.assert_not_double_wrapped(langchain_pinecone.PineconeVectorStore.similarity_search)
+ self.assert_not_double_wrapped(langchain_core.language_models.llms.BaseLLM.generate)
+ self.assert_not_double_wrapped(langchain_core.language_models.llms.BaseLLM.agenerate)
+ self.assert_not_double_wrapped(langchain_core.language_models.chat_models.BaseChatModel.generate)
+ self.assert_not_double_wrapped(langchain_core.language_models.chat_models.BaseChatModel.agenerate)
+ self.assert_not_double_wrapped(langchain.chains.base.Chain.invoke)
+ self.assert_not_double_wrapped(langchain.chains.base.Chain.ainvoke)
+ self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.invoke)
+ self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.ainvoke)
+ self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.batch)
+ self.assert_not_double_wrapped(langchain_core.runnables.base.RunnableSequence.abatch)
+ self.assert_not_double_wrapped(langchain_openai.OpenAIEmbeddings.embed_documents)
+ self.assert_not_double_wrapped(langchain_pinecone.PineconeVectorStore.similarity_search)
if not gated_langchain:
return
diff --git a/tests/contrib/langgraph/conftest.py b/tests/contrib/langgraph/conftest.py
index a521ff367fb..13e1a5f9242 100644
--- a/tests/contrib/langgraph/conftest.py
+++ b/tests/contrib/langgraph/conftest.py
@@ -7,12 +7,12 @@
from langgraph.graph import StateGraph
import pytest
-from ddtrace import Pin
from ddtrace.contrib.internal.langgraph.patch import patch
from ddtrace.contrib.internal.langgraph.patch import unpatch
from ddtrace.llmobs import LLMObs as llmobs_service
from ddtrace.llmobs._constants import AGENTLESS_BASE_URL
from ddtrace.llmobs._writer import LLMObsSpanWriter
+from ddtrace.trace import Pin
from tests.utils import DummyTracer
from tests.utils import override_global_config
diff --git a/tests/contrib/logbook/test_logbook_logging.py b/tests/contrib/logbook/test_logbook_logging.py
index d9d67da82f4..757d7a557a2 100644
--- a/tests/contrib/logbook/test_logbook_logging.py
+++ b/tests/contrib/logbook/test_logbook_logging.py
@@ -3,13 +3,13 @@
import pytest
from ddtrace import config
-from ddtrace import tracer
from ddtrace.constants import ENV_KEY
from ddtrace.constants import SERVICE_KEY
from ddtrace.constants import VERSION_KEY
from ddtrace.contrib.internal.logbook.patch import patch
from ddtrace.contrib.internal.logbook.patch import unpatch
from ddtrace.internal.constants import MAX_UINT_64BITS
+from ddtrace.trace import tracer
from tests.utils import override_global_config
@@ -77,9 +77,9 @@ def test_log_trace():
from logbook import TestHandler
from ddtrace import config
- from ddtrace import tracer
from ddtrace.contrib.internal.logbook.patch import patch
from ddtrace.contrib.internal.logbook.patch import unpatch
+ from ddtrace.trace import tracer
config.service = "logging"
config.env = "global.env"
@@ -115,10 +115,10 @@ def test_log_trace_128bit_trace_ids():
from logbook import TestHandler
from ddtrace import config
- from ddtrace import tracer
from ddtrace.contrib.internal.logbook.patch import patch
from ddtrace.contrib.internal.logbook.patch import unpatch
from ddtrace.internal.constants import MAX_UINT_64BITS
+ from ddtrace.trace import tracer
config.service = "logging"
config.env = "global.env"
@@ -150,10 +150,10 @@ def test_log_DD_TAGS():
import logbook
from logbook import TestHandler
- from ddtrace import tracer
from ddtrace.contrib.internal.logbook.patch import patch
from ddtrace.contrib.internal.logbook.patch import unpatch
from ddtrace.internal.constants import MAX_UINT_64BITS
+ from ddtrace.trace import tracer
handler = TestHandler()
diff --git a/tests/contrib/loguru/test_loguru_logging.py b/tests/contrib/loguru/test_loguru_logging.py
index 7ea8baddddb..a11fe4b7d58 100644
--- a/tests/contrib/loguru/test_loguru_logging.py
+++ b/tests/contrib/loguru/test_loguru_logging.py
@@ -5,13 +5,13 @@
import pytest
from ddtrace import config
-from ddtrace import tracer
from ddtrace.constants import ENV_KEY
from ddtrace.constants import SERVICE_KEY
from ddtrace.constants import VERSION_KEY
from ddtrace.contrib.internal.loguru.patch import patch
from ddtrace.contrib.internal.loguru.patch import unpatch
from ddtrace.internal.constants import MAX_UINT_64BITS
+from ddtrace.trace import tracer
from tests.utils import override_global_config
@@ -69,7 +69,7 @@ def test_log_no_trace(captured_logs):
def test_log_with_default_sink(ddtrace_run_python_code_in_subprocess):
code = """
from loguru import logger
-from ddtrace import tracer
+from ddtrace.trace import tracer
with tracer.trace("test.logging") as span:
logger.info("Hello!")
@@ -94,7 +94,7 @@ def test_log_with_default_sink(ddtrace_run_python_code_in_subprocess):
def test_log_with_default_sink_and_configure(ddtrace_run_python_code_in_subprocess):
code = """
from loguru import logger
-from ddtrace import tracer
+from ddtrace.trace import tracer
logger.configure(patcher=lambda r: r.update({"extra": {"dd.new": "cc"}}))
@@ -132,7 +132,7 @@ def test_log_trace():
from loguru import logger
from ddtrace import config
- from ddtrace import tracer
+ from ddtrace.trace import tracer
config.service = "logging"
config.env = "global.env"
@@ -171,8 +171,8 @@ def test_log_trace_128bit_trace_ids():
from loguru import logger
from ddtrace import config
- from ddtrace import tracer
from ddtrace.internal.constants import MAX_UINT_64BITS
+ from ddtrace.trace import tracer
config.service = "logging"
config.env = "global.env"
@@ -203,8 +203,8 @@ def test_log_DD_TAGS():
from loguru import logger
- from ddtrace import tracer
from ddtrace.internal.constants import MAX_UINT_64BITS
+ from ddtrace.trace import tracer
captured_logs = []
logger.remove()
@@ -253,8 +253,8 @@ def serialize(record):
from loguru import logger
from ddtrace import config
- from ddtrace import tracer
from ddtrace.internal.constants import MAX_UINT_64BITS
+ from ddtrace.trace import tracer
config.service = "logging"
config.env = "global.env"
diff --git a/tests/contrib/openai/conftest.py b/tests/contrib/openai/conftest.py
index 64a046a37ba..615a4e773b1 100644
--- a/tests/contrib/openai/conftest.py
+++ b/tests/contrib/openai/conftest.py
@@ -19,7 +19,7 @@
if TYPE_CHECKING:
- from ddtrace import Span # noqa:F401
+ from ddtrace.trace import Span # noqa:F401
def pytest_configure(config):
diff --git a/tests/contrib/pyramid/app/app.py b/tests/contrib/pyramid/app/app.py
index e83acbe5197..0a73af7c602 100644
--- a/tests/contrib/pyramid/app/app.py
+++ b/tests/contrib/pyramid/app/app.py
@@ -3,7 +3,7 @@
from pyramid.config import Configurator
from pyramid.response import Response
-from ddtrace import tracer
+from ddtrace.trace import tracer
from tests.webclient import PingFilter
diff --git a/tests/contrib/pyramid/pserve_app/app/__init__.py b/tests/contrib/pyramid/pserve_app/app/__init__.py
index dd10de6c5ad..fa191fb9da4 100644
--- a/tests/contrib/pyramid/pserve_app/app/__init__.py
+++ b/tests/contrib/pyramid/pserve_app/app/__init__.py
@@ -1,8 +1,8 @@
from pyramid.config import Configurator
from pyramid.response import Response
-from ddtrace import tracer
from ddtrace.trace import TraceFilter
+from ddtrace.trace import tracer
class PingFilter(TraceFilter):
diff --git a/tests/contrib/pytest/test_pytest.py b/tests/contrib/pytest/test_pytest.py
index 3918b82174b..b4c91c1735c 100644
--- a/tests/contrib/pytest/test_pytest.py
+++ b/tests/contrib/pytest/test_pytest.py
@@ -35,11 +35,11 @@
def _get_spans_from_list(
- spans: t.List[ddtrace.Span],
+ spans: t.List[ddtrace.trace.Span],
span_type: str,
name: str = None,
status: t.Optional[str] = None,
-) -> t.List[ddtrace.Span]:
+) -> t.List[ddtrace.trace.Span]:
_names_map = {
"session": ("test_session_end",),
"module": ("test_module_end", "test.module"),
diff --git a/tests/contrib/redis/test_redis_asyncio.py b/tests/contrib/redis/test_redis_asyncio.py
index 77a809392cd..b1bd5858e04 100644
--- a/tests/contrib/redis/test_redis_asyncio.py
+++ b/tests/contrib/redis/test_redis_asyncio.py
@@ -7,10 +7,10 @@
import redis.asyncio
from wrapt import ObjectProxy
-from ddtrace import tracer
from ddtrace.contrib.internal.redis.patch import patch
from ddtrace.contrib.internal.redis.patch import unpatch
from ddtrace.trace import Pin
+from ddtrace.trace import tracer
from tests.utils import override_config
from ..config import REDIS_CONFIG
diff --git a/tests/contrib/sanic/run_server.py b/tests/contrib/sanic/run_server.py
index cf8d1142d05..8e19b76ed5c 100644
--- a/tests/contrib/sanic/run_server.py
+++ b/tests/contrib/sanic/run_server.py
@@ -5,7 +5,7 @@
from sanic import Sanic
from sanic.response import json
-from ddtrace import tracer
+from ddtrace.trace import tracer
from tests.webclient import PingFilter
diff --git a/tests/contrib/snowflake/test_snowflake.py b/tests/contrib/snowflake/test_snowflake.py
index 9762804651d..2e75867c757 100644
--- a/tests/contrib/snowflake/test_snowflake.py
+++ b/tests/contrib/snowflake/test_snowflake.py
@@ -6,10 +6,10 @@
import responses
import snowflake.connector
-from ddtrace import tracer
from ddtrace.contrib.internal.snowflake.patch import patch
from ddtrace.contrib.internal.snowflake.patch import unpatch
from ddtrace.trace import Pin
+from ddtrace.trace import tracer
from tests.opentracer.utils import init_tracer
from tests.utils import override_config
from tests.utils import snapshot
diff --git a/tests/contrib/structlog/test_structlog_logging.py b/tests/contrib/structlog/test_structlog_logging.py
index da37f23be33..0e9b74d092b 100644
--- a/tests/contrib/structlog/test_structlog_logging.py
+++ b/tests/contrib/structlog/test_structlog_logging.py
@@ -4,13 +4,13 @@
import structlog
from ddtrace import config
-from ddtrace import tracer
from ddtrace.constants import ENV_KEY
from ddtrace.constants import SERVICE_KEY
from ddtrace.constants import VERSION_KEY
from ddtrace.contrib.internal.structlog.patch import patch
from ddtrace.contrib.internal.structlog.patch import unpatch
from ddtrace.internal.constants import MAX_UINT_64BITS
+from ddtrace.trace import tracer
from tests.utils import override_global_config
@@ -86,9 +86,9 @@ def test_log_trace():
import structlog
from ddtrace import config
- from ddtrace import tracer
from ddtrace.contrib.internal.structlog.patch import patch
from ddtrace.contrib.internal.structlog.patch import unpatch
+ from ddtrace.trace import tracer
config.service = "logging"
config.env = "global.env"
@@ -131,10 +131,10 @@ def test_log_trace_128bit_trace_ids():
import structlog
from ddtrace import config
- from ddtrace import tracer
from ddtrace.contrib.internal.structlog.patch import patch
from ddtrace.contrib.internal.structlog.patch import unpatch
from ddtrace.internal.constants import MAX_UINT_64BITS
+ from ddtrace.trace import tracer
config.service = "logging"
config.env = "global.env"
@@ -174,12 +174,12 @@ def test_log_DD_TAGS():
import structlog
- from ddtrace import tracer
from ddtrace.constants import ENV_KEY
from ddtrace.constants import SERVICE_KEY
from ddtrace.constants import VERSION_KEY
from ddtrace.contrib.internal.structlog.patch import patch
from ddtrace.contrib.internal.structlog.patch import unpatch
+ from ddtrace.trace import tracer
patch()
@@ -221,9 +221,9 @@ def test_tuple_processor_list():
import structlog
from ddtrace import config
- from ddtrace import tracer
from ddtrace.contrib.internal.structlog.patch import patch
from ddtrace.contrib.internal.structlog.patch import unpatch
+ from ddtrace.trace import tracer
config.service = "logging"
config.env = "global.env"
@@ -263,9 +263,9 @@ def test_no_configured_processor():
import structlog
from ddtrace import config
- from ddtrace import tracer
from ddtrace.contrib.internal.structlog.patch import patch
from ddtrace.contrib.internal.structlog.patch import unpatch
+ from ddtrace.trace import tracer
config.service = "logging"
config.env = "global.env"
diff --git a/tests/contrib/tornado/test_config.py b/tests/contrib/tornado/test_config.py
index fba648b23d7..aaa87fcb2ec 100644
--- a/tests/contrib/tornado/test_config.py
+++ b/tests/contrib/tornado/test_config.py
@@ -1,5 +1,5 @@
-from ddtrace._trace.tracer import Tracer
from ddtrace.trace import TraceFilter
+from ddtrace.trace import Tracer
from tests.utils import DummyWriter
from .utils import TornadoTestCase
diff --git a/tests/contrib/tornado/test_stack_context.py b/tests/contrib/tornado/test_stack_context.py
index 5d7035c3df5..094b36d70dc 100644
--- a/tests/contrib/tornado/test_stack_context.py
+++ b/tests/contrib/tornado/test_stack_context.py
@@ -1,8 +1,8 @@
import pytest
import tornado
-from ddtrace._trace.context import Context
from ddtrace.contrib.internal.tornado.stack_context import TracerStackContext
+from ddtrace.trace import Context
from .utils import TornadoTestCase
from .web.compat import sleep
diff --git a/tests/integration/test_context_snapshots.py b/tests/integration/test_context_snapshots.py
index 612422064a0..8018f1b11cb 100644
--- a/tests/integration/test_context_snapshots.py
+++ b/tests/integration/test_context_snapshots.py
@@ -15,7 +15,7 @@ def test_context_multiprocess(run_python_code_in_subprocess):
from multiprocessing import Process
import time
-from ddtrace import tracer
+from ddtrace.trace import tracer
def _target(ctx):
diff --git a/tests/integration/test_debug.py b/tests/integration/test_debug.py
index 18c28e51620..e87014c28b9 100644
--- a/tests/integration/test_debug.py
+++ b/tests/integration/test_debug.py
@@ -11,10 +11,10 @@
import ddtrace
import ddtrace._trace.sampler
-from ddtrace._trace.span import Span
from ddtrace.internal import debug
from ddtrace.internal.writer import AgentWriter
from ddtrace.internal.writer import TraceWriter
+from ddtrace.trace import Span
from tests.integration.utils import AGENT_VERSION
from tests.subprocesstest import SubprocessTestCase
from tests.subprocesstest import run_in_subprocess
@@ -118,8 +118,8 @@ def test_standard_tags():
def test_debug_post_configure():
import re
- from ddtrace import tracer
from ddtrace.internal import debug
+ from ddtrace.trace import tracer
tracer._configure(
hostname="0.0.0.0",
@@ -143,8 +143,8 @@ def test_debug_post_configure():
def test_debug_post_configure_uds():
import re
- from ddtrace import tracer
from ddtrace.internal import debug
+ from ddtrace.trace import tracer
tracer._configure(uds_path="/file.sock")
@@ -201,7 +201,7 @@ def test_trace_agent_url(self):
)
)
def test_tracer_loglevel_info_connection(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
logging.basicConfig(level=logging.INFO)
with mock.patch.object(logging.Logger, "log") as mock_logger:
# shove an unserializable object into the config log output
@@ -217,7 +217,7 @@ def test_tracer_loglevel_info_connection(self):
)
)
def test_tracer_loglevel_info_no_connection(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
logging.basicConfig(level=logging.INFO)
with mock.patch.object(logging.Logger, "log") as mock_logger:
tracer._configure()
@@ -231,7 +231,7 @@ def test_tracer_loglevel_info_no_connection(self):
)
)
def test_tracer_log_disabled_error(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
with mock.patch.object(logging.Logger, "log") as mock_logger:
tracer._configure()
assert mock_logger.mock_calls == []
@@ -243,7 +243,7 @@ def test_tracer_log_disabled_error(self):
)
)
def test_tracer_log_disabled(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
with mock.patch.object(logging.Logger, "log") as mock_logger:
tracer._configure()
assert mock_logger.mock_calls == []
@@ -255,7 +255,7 @@ def test_tracer_log_disabled(self):
)
def test_tracer_info_level_log(self):
logging.basicConfig(level=logging.INFO)
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
with mock.patch.object(logging.Logger, "log") as mock_logger:
tracer._configure()
assert mock_logger.mock_calls == []
@@ -301,14 +301,14 @@ def test_to_json():
def test_agentless(monkeypatch):
monkeypatch.setenv("AWS_LAMBDA_FUNCTION_NAME", "something")
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
info = debug.collect(tracer)
assert info.get("agent_url") == "AGENTLESS"
def test_custom_writer():
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
class CustomWriter(TraceWriter):
def recreate(self) -> TraceWriter:
@@ -330,7 +330,7 @@ def flush_queue(self) -> None:
def test_different_samplers():
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(sampler=ddtrace._trace.sampler.RateSampler())
info = debug.collect(tracer)
@@ -338,7 +338,7 @@ def test_different_samplers():
def test_startup_logs_sampling_rules():
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
sampler = ddtrace._trace.sampler.DatadogSampler(rules=[ddtrace._trace.sampler.SamplingRule(sample_rate=1.0)])
tracer._configure(sampler=sampler)
f = debug.collect(tracer)
@@ -427,7 +427,7 @@ def test_debug_span_log():
def test_partial_flush_log():
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(
partial_flush_enabled=True,
@@ -450,7 +450,7 @@ def test_partial_flush_log():
)
)
def test_partial_flush_log_subprocess():
- from ddtrace import tracer
+ from ddtrace.trace import tracer
assert tracer._partial_flush_enabled is True
assert tracer._partial_flush_min_spans == 2
diff --git a/tests/integration/test_encoding.py b/tests/integration/test_encoding.py
index 7138ff94e00..e3f5037e7b3 100644
--- a/tests/integration/test_encoding.py
+++ b/tests/integration/test_encoding.py
@@ -4,7 +4,7 @@
import mock
import pytest
-from ddtrace import Tracer
+from ddtrace.trace import Tracer
AGENT_VERSION = os.environ.get("AGENT_VERSION")
diff --git a/tests/integration/test_integration.py b/tests/integration/test_integration.py
index 32484ac65c0..4354f3acdf9 100644
--- a/tests/integration/test_integration.py
+++ b/tests/integration/test_integration.py
@@ -7,9 +7,9 @@
import mock
import pytest
-from ddtrace import Tracer
from ddtrace.internal.atexit import register_on_exit_signal
from ddtrace.internal.runtime import container
+from ddtrace.trace import Tracer
from tests.integration.utils import import_ddtrace_in_subprocess
from tests.integration.utils import parametrize_with_all_encodings
from tests.integration.utils import skip_if_testagent
@@ -21,7 +21,7 @@
@pytest.mark.subprocess()
def test_configure_keeps_api_hostname_and_port():
- from ddtrace import tracer
+ from ddtrace.trace import tracer
from tests.integration.utils import AGENT_VERSION
assert tracer._writer.agent_url == "http://localhost:{}".format("9126" if AGENT_VERSION == "testagent" else "8126")
@@ -96,7 +96,7 @@ def target():
def test_single_trace_uds():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
sockdir = "/tmp/ddagent/trace.sock"
t._configure(uds_path=sockdir)
@@ -114,7 +114,7 @@ def test_uds_wrong_socket_path():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
encoding = os.environ["DD_TRACE_API_VERSION"]
t._configure(uds_path="/tmp/ddagent/nosockethere")
@@ -146,7 +146,7 @@ def test_payload_too_large():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
from tests.integration.test_integration import FOUR_KB
from tests.utils import AnyInt
from tests.utils import AnyStr
@@ -185,7 +185,7 @@ def test_payload_too_large():
def test_resource_name_too_large():
import pytest
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
from tests.integration.test_integration import FOUR_KB
assert t._writer._buffer_size == FOUR_KB
@@ -205,7 +205,7 @@ def test_resource_name_too_large():
def test_large_payload_is_sent_without_warning_logs():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
with mock.patch("ddtrace.internal.writer.writer.log") as log:
for _ in range(10000):
@@ -221,7 +221,7 @@ def test_large_payload_is_sent_without_warning_logs():
def test_child_spans_do_not_cause_warning_logs():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
with mock.patch("ddtrace.internal.writer.writer.log") as log:
spans = []
@@ -239,7 +239,7 @@ def test_child_spans_do_not_cause_warning_logs():
def test_metrics():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
from tests.utils import AnyInt
from tests.utils import override_global_config
@@ -287,7 +287,7 @@ def test_metrics():
def test_metrics_partial_flush_disabled():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
from tests.utils import AnyInt
from tests.utils import override_global_config
@@ -331,8 +331,8 @@ def test_metrics_partial_flush_disabled():
def test_single_trace_too_large():
import mock
- from ddtrace import tracer as t
from ddtrace.internal.writer import AgentWriter
+ from ddtrace.trace import tracer as t
from tests.utils import AnyInt
from tests.utils import AnyStr
@@ -368,7 +368,7 @@ def test_single_trace_too_large():
def test_single_trace_too_large_partial_flush_disabled():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
from tests.utils import AnyInt
with mock.patch("ddtrace.internal.writer.writer.log") as log:
@@ -389,7 +389,7 @@ def test_trace_generates_error_logs_when_hostname_invalid():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
t._configure(hostname="bad", port=1111)
@@ -415,8 +415,8 @@ def test_validate_headers_in_payload_to_intake():
import mock
from ddtrace import __version__
- from ddtrace import tracer as t
from ddtrace.internal.runtime import container
+ from ddtrace.trace import tracer as t
t._writer._put = mock.Mock(wraps=t._writer._put)
t.trace("op").finish()
@@ -438,7 +438,7 @@ def test_validate_headers_in_payload_to_intake():
def test_inode_entity_id_header_present():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
t._writer._put = mock.Mock(wraps=t._writer._put)
with mock.patch("container.get_container_info") as gcimock:
@@ -456,7 +456,7 @@ def test_inode_entity_id_header_present():
def test_external_env_header_present():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
mocked_external_env = "it-false,cn-nginx-webserver,pu-75a2b6d5-3949-4afb-ad0d-92ff0674e759"
@@ -476,7 +476,7 @@ def test_external_env_header_present():
def test_validate_headers_in_payload_to_intake_with_multiple_traces():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
t._writer._put = mock.Mock(wraps=t._writer._put)
for _ in range(100):
@@ -492,7 +492,7 @@ def test_validate_headers_in_payload_to_intake_with_multiple_traces():
def test_validate_headers_in_payload_to_intake_with_nested_spans():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
t._writer._put = mock.Mock(wraps=t._writer._put)
for _ in range(10):
@@ -509,7 +509,7 @@ def test_validate_headers_in_payload_to_intake_with_nested_spans():
def test_trace_with_invalid_client_endpoint_generates_error_log():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
for client in t._writer._clients:
client.ENDPOINT = "/bad"
@@ -619,8 +619,8 @@ def encode_traces(self, traces):
def test_api_version_downgrade_generates_no_warning_logs():
import mock
- from ddtrace import tracer as t
from ddtrace.internal.utils.http import Response
+ from ddtrace.trace import tracer as t
t._writer.api_version = "v0.5"
t._writer._downgrade(Response(status=404), t._writer._clients[0])
@@ -634,8 +634,8 @@ def test_api_version_downgrade_generates_no_warning_logs():
@pytest.mark.subprocess()
def test_synchronous_writer_shutdown_raises_no_exception():
- from ddtrace import tracer
from ddtrace.internal.writer import AgentWriter
+ from ddtrace.trace import tracer
tracer._configure(writer=AgentWriter(tracer._writer.agent_url, sync_mode=True))
tracer.shutdown()
@@ -758,7 +758,7 @@ def test_writer_configured_correctly_from_env_defaults_under_ddtrace_run(ddtrace
def test_partial_flush_log():
import mock
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
partial_flush_min_spans = 2
t._configure(
diff --git a/tests/integration/test_integration_civisibility.py b/tests/integration/test_integration_civisibility.py
index a95bcc2bccb..cc633d12018 100644
--- a/tests/integration/test_integration_civisibility.py
+++ b/tests/integration/test_integration_civisibility.py
@@ -75,10 +75,10 @@ def test_civisibility_intake_with_apikey():
def test_civisibility_intake_payloads():
import mock
- from ddtrace import tracer as t
from ddtrace.internal.ci_visibility.constants import COVERAGE_TAG_NAME
from ddtrace.internal.ci_visibility.recorder import CIVisibilityWriter
from ddtrace.internal.utils.http import Response
+ from ddtrace.trace import tracer as t
from tests.utils import override_env
with override_env(dict(DD_API_KEY="foobar.baz")):
diff --git a/tests/integration/test_integration_snapshots.py b/tests/integration/test_integration_snapshots.py
index dc80f9508ca..0ba978fa260 100644
--- a/tests/integration/test_integration_snapshots.py
+++ b/tests/integration/test_integration_snapshots.py
@@ -5,8 +5,8 @@
import mock
import pytest
-from ddtrace import Tracer
-from ddtrace import tracer
+from ddtrace.trace import Tracer
+from ddtrace.trace import tracer
from tests.integration.utils import AGENT_VERSION
from tests.integration.utils import mark_snapshot
from tests.integration.utils import parametrize_with_all_encodings
@@ -20,7 +20,7 @@
@snapshot(include_tracer=True)
@pytest.mark.subprocess()
def test_single_trace_single_span(tracer):
- from ddtrace import tracer
+ from ddtrace.trace import tracer
s = tracer.trace("operation", service="my-svc")
s.set_tag("k", "v")
@@ -35,7 +35,7 @@ def test_single_trace_single_span(tracer):
@snapshot(include_tracer=True)
@pytest.mark.subprocess()
def test_multiple_traces(tracer):
- from ddtrace import tracer
+ from ddtrace.trace import tracer
with tracer.trace("operation1", service="my-svc") as s:
s.set_tag("k", "v")
@@ -61,8 +61,8 @@ def test_multiple_traces(tracer):
def test_filters():
import os
- from ddtrace import tracer
from ddtrace.internal.writer import AgentWriter
+ from ddtrace.trace import tracer
writer = os.environ.get("DD_WRITER_MODE", "default")
@@ -101,8 +101,8 @@ def process_trace(self, trace):
@pytest.mark.subprocess()
@snapshot(async_mode=False)
def test_synchronous_writer():
- from ddtrace import tracer
from ddtrace.internal.writer import AgentWriter
+ from ddtrace.trace import tracer
writer = AgentWriter(tracer._writer.agent_url, sync_mode=True)
tracer._configure(writer=writer)
@@ -171,7 +171,7 @@ def test_wrong_span_name_type_not_sent():
"""Span names should be a text type."""
import mock
- from ddtrace import tracer
+ from ddtrace.trace import tracer
with mock.patch("ddtrace._trace.span.log") as log:
with tracer.trace(123):
@@ -227,10 +227,10 @@ def test_trace_with_wrong_metrics_types_not_sent(encoding, metrics, monkeypatch)
@pytest.mark.subprocess()
@pytest.mark.snapshot()
def test_tracetagsprocessor_only_adds_new_tags():
- from ddtrace import tracer
from ddtrace.constants import _SAMPLING_PRIORITY_KEY
from ddtrace.constants import AUTO_KEEP
from ddtrace.constants import USER_KEEP
+ from ddtrace.trace import tracer
with tracer.trace(name="web.request") as span:
span.context.sampling_priority = AUTO_KEEP
@@ -261,7 +261,7 @@ def test_env_vars(use_ddtracerun, ddtrace_run_python_code_in_subprocess, run_pyt
fn(
"""
-from ddtrace import tracer
+from ddtrace.trace import tracer
tracer.trace("test-op").finish()
""",
env=env,
diff --git a/tests/integration/test_priority_sampling.py b/tests/integration/test_priority_sampling.py
index 8ea46591a1a..57b64a2fe5c 100644
--- a/tests/integration/test_priority_sampling.py
+++ b/tests/integration/test_priority_sampling.py
@@ -8,7 +8,7 @@
from ddtrace.internal.encoding import JSONEncoder
from ddtrace.internal.encoding import MsgpackEncoderV04 as Encoder
from ddtrace.internal.writer import AgentWriter
-from ddtrace.tracer import Tracer
+from ddtrace.trace import Tracer
from tests.integration.utils import AGENT_VERSION
from tests.integration.utils import parametrize_with_all_encodings
from tests.integration.utils import skip_if_testagent
@@ -54,7 +54,7 @@ def _prime_tracer_with_priority_sample_rate_from_agent(t, service, env):
def test_priority_sampling_rate_honored():
import time
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
from tests.integration.test_priority_sampling import _prime_tracer_with_priority_sample_rate_from_agent
from tests.integration.test_priority_sampling import _turn_tracer_into_dummy
@@ -95,7 +95,7 @@ def test_priority_sampling_rate_honored():
def test_priority_sampling_response():
import time
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
from tests.integration.test_priority_sampling import _prime_tracer_with_priority_sample_rate_from_agent
_id = time.time()
@@ -136,7 +136,7 @@ def test_agent_sample_rate_keep():
@pytest.mark.snapshot(agent_sample_rate_by_service={"service:test,env:": 0.0001})
def test_agent_sample_rate_reject():
"""Ensure that the agent sample rate is respected when a trace is auto rejected."""
- from ddtrace.tracer import Tracer
+ from ddtrace.trace import Tracer
tracer = Tracer()
diff --git a/tests/integration/test_propagation.py b/tests/integration/test_propagation.py
index bcad0ed4432..0bea4251f57 100644
--- a/tests/integration/test_propagation.py
+++ b/tests/integration/test_propagation.py
@@ -1,8 +1,8 @@
import pytest
-from ddtrace import tracer
from ddtrace.constants import MANUAL_DROP_KEY
from ddtrace.propagation.http import HTTPPropagator
+from ddtrace.trace import tracer
from tests.integration.utils import AGENT_VERSION
diff --git a/tests/integration/test_sampling.py b/tests/integration/test_sampling.py
index 442ed6e4d88..053064c8cd8 100644
--- a/tests/integration/test_sampling.py
+++ b/tests/integration/test_sampling.py
@@ -306,8 +306,8 @@ def test_rate_limiter_on_spans(tracer):
"""
Ensure that the rate limiter is applied to spans
"""
- from ddtrace import tracer
- from ddtrace.sampler import DatadogSampler
+ from ddtrace._trace.sampler import DatadogSampler
+ from ddtrace.trace import tracer
# Rate limit is only applied if a sample rate or trace sample rule is set
tracer._configure(sampler=DatadogSampler(default_sample_rate=1, rate_limit=10))
@@ -339,8 +339,8 @@ def test_rate_limiter_on_long_running_spans(tracer):
"""
import mock
- from ddtrace import tracer
- from ddtrace.sampler import DatadogSampler
+ from ddtrace._trace.sampler import DatadogSampler
+ from ddtrace.trace import tracer
tracer._configure(sampler=DatadogSampler(rate_limit=5))
diff --git a/tests/integration/test_trace_stats.py b/tests/integration/test_trace_stats.py
index 37982dbf7b2..21b2eac8419 100644
--- a/tests/integration/test_trace_stats.py
+++ b/tests/integration/test_trace_stats.py
@@ -80,7 +80,7 @@ def test_compute_stats_default_and_configure(run_python_code_in_subprocess, envv
env.update({envvar: "true"})
out, err, status, _ = run_python_code_in_subprocess(
"""
-from ddtrace import tracer
+from ddtrace.trace import tracer
from ddtrace import config
from ddtrace.internal.processor.stats import SpanStatsProcessorV06
assert config._trace_compute_stats is True
@@ -104,8 +104,8 @@ def test_apm_opt_out_compute_stats_and_configure():
Ensure stats computation is disabled, but reported as enabled,
if APM is opt-out.
"""
- from ddtrace import tracer as t
from ddtrace.internal.processor.stats import SpanStatsProcessorV06
+ from ddtrace.trace import tracer as t
# Test via `configure`
assert not t._compute_stats
@@ -124,7 +124,7 @@ def test_apm_opt_out_compute_stats_and_configure_env(run_python_code_in_subproce
env.update({"DD_EXPERIMENTAL_APPSEC_STANDALONE_ENABLED": "true", "DD_APPSEC_ENABLED": "true"})
out, err, status, _ = run_python_code_in_subprocess(
"""
-from ddtrace import tracer
+from ddtrace.trace import tracer
from ddtrace import config
from ddtrace.internal.processor.stats import SpanStatsProcessorV06
# the stats computation is disabled (completely, for both agent and tracer)
diff --git a/tests/integration/utils.py b/tests/integration/utils.py
index 21822ea6e59..5b87161e2d0 100644
--- a/tests/integration/utils.py
+++ b/tests/integration/utils.py
@@ -5,7 +5,7 @@
import mock
import pytest
-from ddtrace import Tracer
+from ddtrace.trace import Tracer
AGENT_VERSION = os.environ.get("AGENT_VERSION")
diff --git a/tests/internal/peer_service/test_processor.py b/tests/internal/peer_service/test_processor.py
index 9170d639a1b..d45b97e204e 100644
--- a/tests/internal/peer_service/test_processor.py
+++ b/tests/internal/peer_service/test_processor.py
@@ -3,11 +3,11 @@
import mock
import pytest
-from ddtrace._trace.span import Span
from ddtrace.constants import SPAN_KIND
from ddtrace.ext import SpanKind
from ddtrace.internal.peer_service.processor import PeerServiceProcessor
from ddtrace.settings.peer_service import PeerServiceConfig
+from ddtrace.trace import Span
@pytest.fixture
diff --git a/tests/internal/service_name/test_processor.py b/tests/internal/service_name/test_processor.py
index a765491c67c..158f5e1e621 100644
--- a/tests/internal/service_name/test_processor.py
+++ b/tests/internal/service_name/test_processor.py
@@ -27,7 +27,7 @@ def test_base_service(ddtrace_run_python_code_in_subprocess, schema_version, glo
from ddtrace import config
from ddtrace.constants import _BASE_SERVICE_KEY
from ddtrace.internal.schema.processor import BaseServiceProcessor
-from ddtrace._trace.span import Span
+from ddtrace.trace import Span
from tests.internal.service_name.test_processor import processor
def test(processor):
diff --git a/tests/internal/test_database_monitoring.py b/tests/internal/test_database_monitoring.py
index 89b069a489e..33afb475710 100644
--- a/tests/internal/test_database_monitoring.py
+++ b/tests/internal/test_database_monitoring.py
@@ -34,8 +34,8 @@ def test_propagation_mode_configuration():
@pytest.mark.subprocess(env=dict(DD_DBM_PROPAGATION_MODE="disabled"))
def test_get_dbm_comment_disabled_mode():
- from ddtrace import tracer
from ddtrace.propagation import _database_monitoring
+ from ddtrace.trace import tracer
with tracer.trace("dbspan", service="orders-db") as dbspan:
# when dbm propagation mode is disabled sqlcomments should NOT be generated
@@ -62,8 +62,8 @@ def test_get_dbm_comment_disabled_mode():
)
)
def test_dbm_propagation_service_mode():
- from ddtrace import tracer
from ddtrace.propagation import _database_monitoring
+ from ddtrace.trace import tracer
with tracer.trace("dbspan", service="orders-db") as dbspan:
# when dbm propagation is service mode sql comments should be generated with dbm tags
@@ -90,8 +90,8 @@ def test_dbm_propagation_service_mode():
)
)
def test_dbm_propagation_full_mode():
- from ddtrace import tracer
from ddtrace.propagation import _database_monitoring
+ from ddtrace.trace import tracer
with tracer.trace("dbspan", service="orders-db") as dbspan:
# since inject() below will call the sampler we just call the sampler here
@@ -130,8 +130,8 @@ def test_dbm_propagation_full_mode():
)
)
def test_dbm_dddbs_peer_service_enabled():
- from ddtrace import tracer
from ddtrace.propagation import _database_monitoring
+ from ddtrace.trace import tracer
with tracer.trace("dbname") as dbspan_no_service:
# when dbm propagation mode is full sql comments should be generated with dbm tags and traceparent keys
@@ -166,8 +166,8 @@ def test_dbm_dddbs_peer_service_enabled():
)
)
def test_dbm_peer_entity_tags():
- from ddtrace import tracer
from ddtrace.propagation import _database_monitoring
+ from ddtrace.trace import tracer
with tracer.trace("dbname") as dbspan:
dbspan.set_tag("out.host", "some-hostname")
diff --git a/tests/llmobs/_utils.py b/tests/llmobs/_utils.py
index f9cff969c8a..3bbc4ffcef2 100644
--- a/tests/llmobs/_utils.py
+++ b/tests/llmobs/_utils.py
@@ -9,10 +9,10 @@
vcr = None
import ddtrace
-from ddtrace._trace.span import Span
from ddtrace.ext import SpanTypes
from ddtrace.llmobs._utils import _get_span_name
from ddtrace.llmobs._writer import LLMObsEvaluationMetricEvent
+from ddtrace.trace import Span
if vcr:
diff --git a/tests/llmobs/test_llmobs_evaluator_runner.py b/tests/llmobs/test_llmobs_evaluator_runner.py
index eaf381367d0..6b13ce38718 100644
--- a/tests/llmobs/test_llmobs_evaluator_runner.py
+++ b/tests/llmobs/test_llmobs_evaluator_runner.py
@@ -5,10 +5,10 @@
import mock
import pytest
-from ddtrace._trace.span import Span
from ddtrace.llmobs._evaluators.runner import EvaluatorRunner
from ddtrace.llmobs._evaluators.sampler import EvaluatorRunnerSampler
from ddtrace.llmobs._evaluators.sampler import EvaluatorRunnerSamplingRule
+from ddtrace.trace import Span
from tests.llmobs._utils import DummyEvaluator
from tests.llmobs._utils import _dummy_evaluator_eval_metric_event
from tests.utils import override_env
diff --git a/tests/llmobs/test_llmobs_ragas_evaluators.py b/tests/llmobs/test_llmobs_ragas_evaluators.py
index cc02709baff..9766c18c1e5 100644
--- a/tests/llmobs/test_llmobs_ragas_evaluators.py
+++ b/tests/llmobs/test_llmobs_ragas_evaluators.py
@@ -6,7 +6,7 @@
from ddtrace.llmobs._evaluators.ragas.answer_relevancy import RagasAnswerRelevancyEvaluator
from ddtrace.llmobs._evaluators.ragas.context_precision import RagasContextPrecisionEvaluator
from ddtrace.llmobs._evaluators.ragas.faithfulness import RagasFaithfulnessEvaluator
-from ddtrace.span import Span
+from ddtrace.trace import Span
from tests.llmobs._utils import _expected_llmobs_llm_span_event
from tests.llmobs._utils import _expected_ragas_answer_relevancy_spans
from tests.llmobs._utils import _expected_ragas_context_precision_spans
diff --git a/tests/llmobs/test_llmobs_service.py b/tests/llmobs/test_llmobs_service.py
index c43bee68ae2..7c3c78a6085 100644
--- a/tests/llmobs/test_llmobs_service.py
+++ b/tests/llmobs/test_llmobs_service.py
@@ -7,7 +7,6 @@
import pytest
import ddtrace
-from ddtrace._trace.context import Context
from ddtrace.ext import SpanTypes
from ddtrace.internal.service import ServiceStatus
from ddtrace.llmobs import LLMObs as llmobs_service
@@ -32,6 +31,7 @@
from ddtrace.llmobs._writer import LLMObsAgentlessEventClient
from ddtrace.llmobs._writer import LLMObsProxiedEventClient
from ddtrace.llmobs.utils import Prompt
+from ddtrace.trace import Context
from tests.llmobs._utils import _expected_llmobs_eval_metric_event
from tests.llmobs._utils import _expected_llmobs_llm_span_event
from tests.llmobs._utils import _expected_llmobs_non_llm_span_event
diff --git a/tests/llmobs/test_propagation.py b/tests/llmobs/test_propagation.py
index e3ab9c80d66..7d7c6a59bbb 100644
--- a/tests/llmobs/test_propagation.py
+++ b/tests/llmobs/test_propagation.py
@@ -58,7 +58,7 @@ def test_propagate_correct_llmobs_parent_id_simple(run_python_code_in_subprocess
code = """
import json
-from ddtrace import tracer
+from ddtrace.trace import tracer
from ddtrace.ext import SpanTypes
from ddtrace.propagation.http import HTTPPropagator
@@ -94,7 +94,7 @@ def test_propagate_llmobs_parent_id_complex(run_python_code_in_subprocess):
code = """
import json
-from ddtrace import tracer
+from ddtrace.trace import tracer
from ddtrace.ext import SpanTypes
from ddtrace.propagation.http import HTTPPropagator
@@ -132,7 +132,7 @@ def test_no_llmobs_parent_id_propagated_if_no_llmobs_spans(run_python_code_in_su
code = """
import json
-from ddtrace import tracer
+from ddtrace.trace import tracer
from ddtrace.propagation.http import HTTPPropagator
with tracer.trace("Non-LLMObs span") as root_span:
@@ -198,7 +198,7 @@ def test_activate_distributed_headers_propagate_correct_llmobs_parent_id_simple(
code = """
import json
-from ddtrace import tracer
+from ddtrace.trace import tracer
from ddtrace.ext import SpanTypes
from ddtrace.llmobs import LLMObs
@@ -233,7 +233,7 @@ def test_activate_distributed_headers_propagate_llmobs_parent_id_complex(run_pyt
code = """
import json
-from ddtrace import tracer
+from ddtrace.trace import tracer
from ddtrace.ext import SpanTypes
from ddtrace.llmobs import LLMObs
@@ -271,7 +271,7 @@ def test_activate_distributed_headers_does_not_propagate_if_no_llmobs_spans(run_
code = """
import json
-from ddtrace import tracer
+from ddtrace.trace import tracer
from ddtrace.llmobs import LLMObs
LLMObs.enable(ml_app="test-app", api_key="")
diff --git a/tests/opentracer/core/test_dd_compatibility.py b/tests/opentracer/core/test_dd_compatibility.py
index ba4e84ce6d8..4ba14b0618f 100644
--- a/tests/opentracer/core/test_dd_compatibility.py
+++ b/tests/opentracer/core/test_dd_compatibility.py
@@ -19,7 +19,7 @@ def test_custom_ddtracer(self):
"""A user should be able to specify their own Datadog tracer instance if
they wish.
"""
- custom_dd_tracer = ddtrace.Tracer()
+ custom_dd_tracer = ddtrace.trace.Tracer()
tracer = ddtrace.opentracer.Tracer(dd_tracer=custom_dd_tracer)
assert tracer._dd_tracer is custom_dd_tracer
diff --git a/tests/opentracer/core/test_tracer.py b/tests/opentracer/core/test_tracer.py
index c96339ed0e3..a0a18ff0dd8 100644
--- a/tests/opentracer/core/test_tracer.py
+++ b/tests/opentracer/core/test_tracer.py
@@ -9,13 +9,13 @@
import pytest
import ddtrace
-from ddtrace import Tracer as DDTracer
from ddtrace.constants import AUTO_KEEP
from ddtrace.opentracer import Tracer
from ddtrace.opentracer import set_global_tracer
from ddtrace.opentracer.span_context import SpanContext
from ddtrace.propagation.http import HTTP_HEADER_TRACE_ID
from ddtrace.settings import ConfigException
+from ddtrace.trace import Tracer as DDTracer
from tests.utils import override_global_config
diff --git a/tests/profiling/collector/conftest.py b/tests/profiling/collector/conftest.py
index bf2ce222169..a774b20f7da 100644
--- a/tests/profiling/collector/conftest.py
+++ b/tests/profiling/collector/conftest.py
@@ -7,7 +7,7 @@
@pytest.fixture
def tracer(monkeypatch):
monkeypatch.setenv("DD_TRACE_STARTUP_LOGS", "0")
- return ddtrace.Tracer()
+ return ddtrace.trace.Tracer()
@pytest.fixture
diff --git a/tests/profiling/collector/test_stack.py b/tests/profiling/collector/test_stack.py
index 86ee91e2ac4..65478222932 100644
--- a/tests/profiling/collector/test_stack.py
+++ b/tests/profiling/collector/test_stack.py
@@ -447,7 +447,7 @@ def test_exception_collection():
@pytest.mark.skipif(not stack.FEATURES["stack-exceptions"], reason="Stack exceptions not supported")
def test_exception_collection_trace(
- tracer, # type: ddtrace.Tracer
+ tracer, # type: ddtrace.trace.Tracer
):
# type: (...) -> None
r = recorder.Recorder()
diff --git a/tests/profiling/test_profiler.py b/tests/profiling/test_profiler.py
index b46970f2591..0aba1240b7d 100644
--- a/tests/profiling/test_profiler.py
+++ b/tests/profiling/test_profiler.py
@@ -236,8 +236,8 @@ def _check_url(prof, url, api_key, endpoint_path="profiling/v1/input"):
def test_tracer_url():
import os
- from ddtrace import tracer as t
from ddtrace.profiling import profiler
+ from ddtrace.trace import tracer as t
from tests.profiling.test_profiler import _check_url
t._configure(hostname="foobar")
@@ -249,8 +249,8 @@ def test_tracer_url():
def test_tracer_url_https():
import os
- from ddtrace import tracer as t
from ddtrace.profiling import profiler
+ from ddtrace.trace import tracer as t
from tests.profiling.test_profiler import _check_url
t._configure(hostname="foobar", https=True)
@@ -262,8 +262,8 @@ def test_tracer_url_https():
def test_tracer_url_uds_hostname():
import os
- from ddtrace import tracer as t
from ddtrace.profiling import profiler
+ from ddtrace.trace import tracer as t
from tests.profiling.test_profiler import _check_url
t._configure(hostname="foobar", uds_path="/foobar")
@@ -275,8 +275,8 @@ def test_tracer_url_uds_hostname():
def test_tracer_url_uds():
import os
- from ddtrace import tracer as t
from ddtrace.profiling import profiler
+ from ddtrace.trace import tracer as t
from tests.profiling.test_profiler import _check_url
t._configure(uds_path="/foobar")
@@ -288,8 +288,8 @@ def test_tracer_url_uds():
def test_tracer_url_configure_after():
import os
- from ddtrace import tracer as t
from ddtrace.profiling import profiler
+ from ddtrace.trace import tracer as t
from tests.profiling.test_profiler import _check_url
prof = profiler.Profiler(tracer=t)
@@ -306,8 +306,8 @@ def test_env_no_api_key():
def test_env_endpoint_url():
import os
- from ddtrace import tracer as t
from ddtrace.profiling import profiler
+ from ddtrace.trace import tracer as t
from tests.profiling.test_profiler import _check_url
prof = profiler.Profiler(tracer=t)
diff --git a/tests/profiling_v2/collector/conftest.py b/tests/profiling_v2/collector/conftest.py
index b2ba1ced203..311c286c11e 100644
--- a/tests/profiling_v2/collector/conftest.py
+++ b/tests/profiling_v2/collector/conftest.py
@@ -5,4 +5,4 @@
@pytest.fixture
def tracer():
- return ddtrace.Tracer()
+ return ddtrace.trace.Tracer()
diff --git a/tests/profiling_v2/collector/test_stack_asyncio.py b/tests/profiling_v2/collector/test_stack_asyncio.py
index d28ad54e586..d70278e767c 100644
--- a/tests/profiling_v2/collector/test_stack_asyncio.py
+++ b/tests/profiling_v2/collector/test_stack_asyncio.py
@@ -16,9 +16,9 @@ def test_asyncio():
import uuid
from ddtrace import ext
- from ddtrace import tracer
from ddtrace.internal.datadog.profiling import stack_v2
from ddtrace.profiling import profiler
+ from ddtrace.trace import tracer
from tests.profiling.collector import _asyncio_compat
from tests.profiling.collector import pprof_utils
diff --git a/tests/telemetry/test_telemetry.py b/tests/telemetry/test_telemetry.py
index e2aa4552631..82c960cfead 100644
--- a/tests/telemetry/test_telemetry.py
+++ b/tests/telemetry/test_telemetry.py
@@ -147,7 +147,7 @@ def test_app_started_error_handled_exception(test_agent_session, run_python_code
import logging
logging.basicConfig()
-from ddtrace import tracer
+from ddtrace.trace import tracer
from ddtrace.trace import TraceFilter
class FailingFilture(TraceFilter):
@@ -325,7 +325,7 @@ def test_instrumentation_telemetry_disabled(test_agent_session, run_python_code_
env["DD_INSTRUMENTATION_TELEMETRY_ENABLED"] = "false"
code = """
-from ddtrace import tracer
+from ddtrace.trace import tracer
# We want to import the telemetry module even when telemetry is disabled.
import sys
diff --git a/tests/telemetry/test_telemetry_metrics_e2e.py b/tests/telemetry/test_telemetry_metrics_e2e.py
index 30033458cef..591e61f1cc8 100644
--- a/tests/telemetry/test_telemetry_metrics_e2e.py
+++ b/tests/telemetry/test_telemetry_metrics_e2e.py
@@ -87,7 +87,7 @@ def test_telemetry_metrics_enabled_on_gunicorn_child_process(test_agent_session)
def test_span_creation_and_finished_metrics_datadog(test_agent_session, ddtrace_run_python_code_in_subprocess):
code = """
-from ddtrace import tracer
+from ddtrace.trace import tracer
for _ in range(10):
with tracer.trace('span1'):
pass
diff --git a/tests/tracer/runtime/test_runtime_metrics.py b/tests/tracer/runtime/test_runtime_metrics.py
index 9039da147a5..9204dc49426 100644
--- a/tests/tracer/runtime/test_runtime_metrics.py
+++ b/tests/tracer/runtime/test_runtime_metrics.py
@@ -116,8 +116,8 @@ def test_runtime_tags_dd_tags():
@pytest.mark.subprocess()
def test_runtime_tags_manual_tracer_tags():
- from ddtrace import tracer
from ddtrace.internal.runtime.runtime_metrics import RuntimeTags
+ from ddtrace.trace import tracer
tracer.set_tags({"manual": "tag"})
diff --git a/tests/tracer/test_context.py b/tests/tracer/test_context.py
index 15b2f870fae..9829de88def 100644
--- a/tests/tracer/test_context.py
+++ b/tests/tracer/test_context.py
@@ -5,8 +5,8 @@
import pytest
from ddtrace._trace._span_link import SpanLink
-from ddtrace._trace.context import Context
-from ddtrace._trace.span import Span
+from ddtrace.trace import Context
+from ddtrace.trace import Span
@pytest.mark.parametrize(
diff --git a/tests/tracer/test_correlation_log_context.py b/tests/tracer/test_correlation_log_context.py
index 51f7cfb07e6..b7200b8b38f 100644
--- a/tests/tracer/test_correlation_log_context.py
+++ b/tests/tracer/test_correlation_log_context.py
@@ -1,8 +1,8 @@
import pytest
-from ddtrace import Tracer
from ddtrace import config
-from ddtrace import tracer
+from ddtrace.trace import Tracer
+from ddtrace.trace import tracer
def global_config(config):
@@ -33,8 +33,8 @@ def format_trace_id(span):
@pytest.mark.subprocess()
def test_get_log_correlation_service():
"""Ensure expected DDLogRecord service is generated via get_correlation_log_record."""
- from ddtrace import Tracer
- from ddtrace import tracer
+ from ddtrace.trace import Tracer
+ from ddtrace.trace import tracer
from tests.tracer.test_correlation_log_context import format_trace_id
from tests.utils import override_global_config
@@ -64,8 +64,8 @@ def test_get_log_correlation_service():
@pytest.mark.subprocess()
def test_get_log_correlation_context_basic():
"""Ensure expected DDLogRecord is generated via get_correlation_log_record."""
- from ddtrace import Tracer
- from ddtrace.context import Context
+ from ddtrace.trace import Context
+ from ddtrace.trace import Tracer
from tests.tracer.test_correlation_log_context import format_trace_id
from tests.utils import override_global_config
@@ -130,7 +130,7 @@ def test_get_log_correlation_context_opentracer():
@pytest.mark.subprocess()
def test_get_log_correlation_context_no_active_span():
"""Ensure empty DDLogRecord generated if no active span."""
- from ddtrace import Tracer
+ from ddtrace.trace import Tracer
tracer = Tracer()
dd_log_record = tracer.get_log_correlation_context()
@@ -146,7 +146,7 @@ def test_get_log_correlation_context_no_active_span():
@pytest.mark.subprocess()
def test_get_log_correlation_context_disabled_tracer():
"""Ensure get_correlation_log_record returns None if tracer is disabled."""
- from ddtrace import Tracer
+ from ddtrace.trace import Tracer
tracer = Tracer()
tracer.enabled = False
@@ -164,9 +164,9 @@ def test_get_log_correlation_context_disabled_tracer():
@pytest.mark.subprocess()
def test_custom_logging_injection_global_config():
"""Ensure custom log injection via get_correlation_log_record returns proper tracer information."""
- from ddtrace import tracer
from ddtrace._trace.provider import _DD_CONTEXTVAR
from ddtrace.contrib.internal.structlog.patch import patch
+ from ddtrace.trace import tracer
from tests.tracer.test_correlation_log_context import format_trace_id
from tests.tracer.test_correlation_log_context import tracer_injection
from tests.utils import override_global_config
@@ -231,8 +231,8 @@ def test_custom_logging_injection_no_span():
@pytest.mark.subprocess()
def test_custom_logging_injection():
"""Ensure custom log injection via get_correlation_log_record returns proper active span information."""
- from ddtrace import tracer
from ddtrace.contrib.internal.structlog.patch import patch
+ from ddtrace.trace import tracer
from tests.tracer.test_correlation_log_context import format_trace_id
from tests.tracer.test_correlation_log_context import tracer_injection
diff --git a/tests/tracer/test_encoders.py b/tests/tracer/test_encoders.py
index 00321a59924..fa625cc6edb 100644
--- a/tests/tracer/test_encoders.py
+++ b/tests/tracer/test_encoders.py
@@ -19,8 +19,6 @@
from ddtrace._trace._span_link import SpanLink
from ddtrace._trace._span_pointer import _SpanPointerDirection
-from ddtrace._trace.context import Context
-from ddtrace._trace.span import Span
from ddtrace.constants import _ORIGIN_KEY as ORIGIN_KEY
from ddtrace.ext import SpanTypes
from ddtrace.ext.ci import CI_APP_TEST_ORIGIN
@@ -34,6 +32,8 @@
from ddtrace.internal.encoding import MsgpackEncoderV04
from ddtrace.internal.encoding import MsgpackEncoderV05
from ddtrace.internal.encoding import _EncoderBase
+from ddtrace.trace import Context
+from ddtrace.trace import Span
from tests.utils import DummyTracer
@@ -845,8 +845,8 @@ def test_json_encoder_traces_bytes():
import json
import os
- from ddtrace._trace.span import Span
import ddtrace.internal.encoding as encoding
+ from ddtrace.trace import Span
encoder_class_name = os.getenv("encoder_cls")
@@ -879,7 +879,7 @@ def test_v03_trace_api_deprecation():
with warnings.catch_warnings(record=True) as warns:
warnings.simplefilter("always")
- from ddtrace import tracer
+ from ddtrace.trace import tracer
assert tracer._writer._api_version == "v0.4"
assert len(warns) == 1, warns
diff --git a/tests/tracer/test_filters.py b/tests/tracer/test_filters.py
index d632ceb4998..3c1ee310f27 100644
--- a/tests/tracer/test_filters.py
+++ b/tests/tracer/test_filters.py
@@ -3,8 +3,8 @@
import pytest
from ddtrace._trace.filters import FilterRequestsOnUrl
-from ddtrace._trace.span import Span
from ddtrace.ext.http import URL
+from ddtrace.trace import Span
from ddtrace.trace import TraceFilter
diff --git a/tests/tracer/test_gitmetadata.py b/tests/tracer/test_gitmetadata.py
index 655398e8b0c..cb03d59f7e2 100644
--- a/tests/tracer/test_gitmetadata.py
+++ b/tests/tracer/test_gitmetadata.py
@@ -44,7 +44,7 @@ class GitMetadataTestCase(TracerTestCase):
)
)
def test_gitmetadata_from_package(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(writer=DummyWriter())
with tracer.trace("span") as s:
pass
@@ -59,7 +59,7 @@ def test_gitmetadata_from_package(self):
)
)
def test_gitmetadata_from_DD_TAGS(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(writer=DummyWriter())
with tracer.trace("span") as s:
pass
@@ -80,7 +80,7 @@ def test_gitmetadata_from_DD_TAGS(self):
)
)
def test_gitmetadata_from_ENV(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(writer=DummyWriter())
with tracer.trace("span") as s:
pass
@@ -104,7 +104,7 @@ def test_gitmetadata_from_ENV(self):
)
)
def test_gitmetadata_disabled(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(writer=DummyWriter())
with tracer.trace("span") as s:
pass
@@ -123,7 +123,7 @@ def test_gitmetadata_disabled(self):
)
)
def test_gitmetadata_package_without_metadata(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(writer=DummyWriter())
with tracer.trace("span") as s:
pass
@@ -143,7 +143,7 @@ def test_gitmetadata_package_without_metadata(self):
)
)
def test_gitmetadata_from_env_filtering_https(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(writer=DummyWriter())
with tracer.trace("span") as s:
pass
@@ -163,7 +163,7 @@ def test_gitmetadata_from_env_filtering_https(self):
)
)
def test_gitmetadata_from_ddtags_filtering_https(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(writer=DummyWriter())
with tracer.trace("span") as s:
pass
@@ -184,7 +184,7 @@ def test_gitmetadata_from_ddtags_filtering_https(self):
)
)
def test_gitmetadata_from_env_filtering_ssh(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(writer=DummyWriter())
with tracer.trace("span") as s:
pass
@@ -204,7 +204,7 @@ def test_gitmetadata_from_env_filtering_ssh(self):
)
)
def test_gitmetadata_from_ddtags_filtering_ssh(self):
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(writer=DummyWriter())
with tracer.trace("span") as s:
pass
diff --git a/tests/tracer/test_memory_leak.py b/tests/tracer/test_memory_leak.py
index 47e82c71f7e..7fdcd7589f6 100644
--- a/tests/tracer/test_memory_leak.py
+++ b/tests/tracer/test_memory_leak.py
@@ -9,11 +9,11 @@
import pytest
-from ddtrace import Tracer
+from ddtrace.trace import Tracer
if TYPE_CHECKING: # pragma: no cover
- from ddtrace._trace.span import Span # noqa:F401
+ from ddtrace.trace import Span # noqa:F401
@pytest.fixture
@@ -117,7 +117,7 @@ def test_fork_open_span():
import os
from weakref import WeakValueDictionary
- from ddtrace import tracer
+ from ddtrace.trace import tracer
from tests.tracer.test_memory_leak import trace
wd = WeakValueDictionary()
diff --git a/tests/tracer/test_processors.py b/tests/tracer/test_processors.py
index ad9360deec2..ff19453555b 100644
--- a/tests/tracer/test_processors.py
+++ b/tests/tracer/test_processors.py
@@ -3,15 +3,12 @@
import mock
import pytest
-from ddtrace import Tracer
-from ddtrace._trace.context import Context
from ddtrace._trace.processor import SpanAggregator
from ddtrace._trace.processor import SpanProcessor
from ddtrace._trace.processor import TraceProcessor
from ddtrace._trace.processor import TraceSamplingProcessor
from ddtrace._trace.processor import TraceTagsProcessor
from ddtrace._trace.sampler import DatadogSampler
-from ddtrace._trace.span import Span
from ddtrace.constants import _SAMPLING_PRIORITY_KEY
from ddtrace.constants import _SINGLE_SPAN_SAMPLING_MAX_PER_SEC
from ddtrace.constants import _SINGLE_SPAN_SAMPLING_MECHANISM
@@ -27,6 +24,9 @@
from ddtrace.internal.sampling import SamplingMechanism
from ddtrace.internal.sampling import SpanSamplingRule
from ddtrace.internal.telemetry.constants import TELEMETRY_NAMESPACE
+from ddtrace.trace import Context
+from ddtrace.trace import Span
+from ddtrace.trace import Tracer
from tests.utils import DummyTracer
from tests.utils import DummyWriter
from tests.utils import override_global_config
diff --git a/tests/tracer/test_propagation.py b/tests/tracer/test_propagation.py
index 533e4974250..43052dced9f 100644
--- a/tests/tracer/test_propagation.py
+++ b/tests/tracer/test_propagation.py
@@ -8,9 +8,7 @@
import pytest
import ddtrace
-from ddtrace import tracer as ddtracer
from ddtrace._trace._span_link import SpanLink
-from ddtrace._trace.context import Context
from ddtrace._trace.span import _get_64_lowest_order_bits_as_int
from ddtrace.appsec._trace_utils import _asm_manual_keep
from ddtrace.constants import AUTO_REJECT
@@ -43,6 +41,8 @@
from ddtrace.propagation.http import HTTPPropagator
from ddtrace.propagation.http import _BaggageHeader
from ddtrace.propagation.http import _TraceContext
+from ddtrace.trace import Context
+from ddtrace.trace import tracer as ddtracer
from tests.contrib.fastapi.conftest import client as fastapi_client # noqa:F401
from tests.contrib.fastapi.conftest import fastapi_application # noqa:F401
from tests.contrib.fastapi.conftest import test_spans as fastapi_test_spans # noqa:F401
@@ -87,10 +87,10 @@ def test_inject_with_baggage_http_propagation(tracer): # noqa: F811
env=dict(DD_TRACE_PROPAGATION_STYLE=PROPAGATION_STYLE_DATADOG),
)
def test_inject_128bit_trace_id_datadog():
- from ddtrace._trace.context import Context
from ddtrace.internal.constants import HIGHER_ORDER_TRACE_ID_BITS
from ddtrace.internal.constants import SAMPLING_DECISION_TRACE_TAG_KEY
from ddtrace.propagation.http import HTTPPropagator
+ from ddtrace.trace import Context
from tests.utils import DummyTracer
tracer = DummyTracer() # noqa: F811
@@ -117,8 +117,8 @@ def test_inject_128bit_trace_id_datadog():
env=dict(DD_TRACE_PROPAGATION_STYLE=PROPAGATION_STYLE_B3_MULTI),
)
def test_inject_128bit_trace_id_b3multi():
- from ddtrace._trace.context import Context
from ddtrace.propagation.http import HTTPPropagator
+ from ddtrace.trace import Context
from tests.utils import DummyTracer
tracer = DummyTracer() # noqa: F811
@@ -139,8 +139,8 @@ def test_inject_128bit_trace_id_b3multi():
env=dict(DD_TRACE_PROPAGATION_STYLE=PROPAGATION_STYLE_B3_SINGLE),
)
def test_inject_128bit_trace_id_b3_single_header():
- from ddtrace._trace.context import Context
from ddtrace.propagation.http import HTTPPropagator
+ from ddtrace.trace import Context
from tests.utils import DummyTracer
tracer = DummyTracer() # noqa: F811
@@ -161,8 +161,8 @@ def test_inject_128bit_trace_id_b3_single_header():
env=dict(DD_TRACE_PROPAGATION_STYLE=_PROPAGATION_STYLE_W3C_TRACECONTEXT),
)
def test_inject_128bit_trace_id_tracecontext():
- from ddtrace._trace.context import Context
from ddtrace.propagation.http import HTTPPropagator
+ from ddtrace.trace import Context
from tests.utils import DummyTracer
tracer = DummyTracer() # noqa: F811
@@ -2487,7 +2487,7 @@ def test_propagation_extract_env(
code = """
import json
import pickle
-from ddtrace._trace.context import Context
+from ddtrace.trace import Context
from ddtrace.propagation.http import HTTPPropagator
context = HTTPPropagator.extract({!r})
@@ -3295,7 +3295,7 @@ def test_propagation_inject(name, styles, context, expected_headers, run_python_
code = """
import json
-from ddtrace._trace.context import Context
+from ddtrace.trace import Context
from ddtrace.propagation.http import HTTPPropagator
context = Context(**{!r})
@@ -3362,7 +3362,7 @@ def test_DD_TRACE_PROPAGATION_STYLE_INJECT_overrides_DD_TRACE_PROPAGATION_STYLE(
code = """
import json
-from ddtrace._trace.context import Context
+from ddtrace.trace import Context
from ddtrace.propagation.http import HTTPPropagator
context = Context(**{!r})
diff --git a/tests/tracer/test_rand.py b/tests/tracer/test_rand.py
index 4d3a109c8ec..76a4bc1f33a 100644
--- a/tests/tracer/test_rand.py
+++ b/tests/tracer/test_rand.py
@@ -12,10 +12,10 @@
import threading
import time
-from ddtrace import tracer
from ddtrace.internal import _rand
from ddtrace.internal import forksafe
from ddtrace.internal.compat import Queue
+from ddtrace.trace import tracer
def test_random():
@@ -285,7 +285,7 @@ def test_span_api_fork():
from itertools import chain
import os
- from ddtrace._trace.span import Span
+ from ddtrace.trace import Span
from tests.tracer.test_rand import MPQueue
q = MPQueue()
diff --git a/tests/tracer/test_sampler.py b/tests/tracer/test_sampler.py
index 4bf9de2019e..813dc1be439 100644
--- a/tests/tracer/test_sampler.py
+++ b/tests/tracer/test_sampler.py
@@ -6,12 +6,10 @@
import mock
import pytest
-from ddtrace._trace.context import Context
from ddtrace._trace.sampler import DatadogSampler
from ddtrace._trace.sampler import RateByServiceSampler
from ddtrace._trace.sampler import RateSampler
from ddtrace._trace.sampling_rule import SamplingRule
-from ddtrace._trace.span import Span
from ddtrace.constants import _SAMPLING_AGENT_DECISION
from ddtrace.constants import _SAMPLING_LIMIT_DECISION
from ddtrace.constants import _SAMPLING_PRIORITY_KEY
@@ -24,6 +22,8 @@
from ddtrace.internal.sampling import SAMPLING_DECISION_TRACE_TAG_KEY
from ddtrace.internal.sampling import SamplingMechanism
from ddtrace.internal.sampling import set_sampling_decision_maker
+from ddtrace.trace import Context
+from ddtrace.trace import Span
from ..subprocesstest import run_in_subprocess
from ..utils import DummyTracer
@@ -630,7 +630,7 @@ def pattern(prop):
)
def test_sampling_rule_sample():
from ddtrace._trace.sampling_rule import SamplingRule
- from ddtrace._trace.span import Span
+ from ddtrace.trace import Span
for sample_rate in [0.01, 0.1, 0.15, 0.25, 0.5, 0.75, 0.85, 0.9, 0.95, 0.991]:
rule = SamplingRule(sample_rate=sample_rate)
diff --git a/tests/tracer/test_single_span_sampling_rules.py b/tests/tracer/test_single_span_sampling_rules.py
index 24dfda91ad5..ef33ecfd619 100644
--- a/tests/tracer/test_single_span_sampling_rules.py
+++ b/tests/tracer/test_single_span_sampling_rules.py
@@ -2,7 +2,6 @@
import pytest
-from ddtrace import Tracer
from ddtrace.constants import _SAMPLING_PRIORITY_KEY
from ddtrace.constants import _SINGLE_SPAN_SAMPLING_MAX_PER_SEC
from ddtrace.constants import _SINGLE_SPAN_SAMPLING_MECHANISM
@@ -11,6 +10,7 @@
from ddtrace.internal.sampling import SpanSamplingRule
from ddtrace.internal.sampling import _get_file_json
from ddtrace.internal.sampling import get_span_sampling_rules
+from ddtrace.trace import Tracer
from tests.utils import DummyTracer
from tests.utils import DummyWriter
diff --git a/tests/tracer/test_span.py b/tests/tracer/test_span.py
index 1725f0d7675..1ea7bbb0003 100644
--- a/tests/tracer/test_span.py
+++ b/tests/tracer/test_span.py
@@ -10,7 +10,6 @@
from ddtrace._trace._span_link import SpanLink
from ddtrace._trace._span_pointer import _SpanPointerDirection
-from ddtrace._trace.span import Span
from ddtrace.constants import _SPAN_MEASURED_KEY
from ddtrace.constants import ENV_KEY
from ddtrace.constants import ERROR_MSG
@@ -20,6 +19,7 @@
from ddtrace.constants import VERSION_KEY
from ddtrace.ext import SpanTypes
from ddtrace.internal import core
+from ddtrace.trace import Span
from tests.subprocesstest import run_in_subprocess
from tests.utils import TracerTestCase
from tests.utils import assert_is_measured
diff --git a/tests/tracer/test_trace_utils.py b/tests/tracer/test_trace_utils.py
index 9e05cd9f40d..31099763d50 100644
--- a/tests/tracer/test_trace_utils.py
+++ b/tests/tracer/test_trace_utils.py
@@ -13,10 +13,7 @@
import mock
import pytest
-from ddtrace import Tracer
from ddtrace import config
-from ddtrace._trace.context import Context
-from ddtrace._trace.span import Span
from ddtrace.contrib.internal import trace_utils
from ddtrace.contrib.internal.trace_utils import _get_request_header_client_ip
from ddtrace.ext import SpanTypes
@@ -28,7 +25,10 @@
from ddtrace.propagation.http import HTTP_HEADER_TRACE_ID
from ddtrace.settings import Config
from ddtrace.settings import IntegrationConfig
+from ddtrace.trace import Context
from ddtrace.trace import Pin
+from ddtrace.trace import Span
+from ddtrace.trace import Tracer
from tests.appsec.utils import asm_context
from tests.utils import override_global_config
@@ -315,8 +315,8 @@ def test_ext_service(int_config, pin, config_val, default, expected):
)
def test_set_http_meta_with_http_header_tags_config():
from ddtrace import config
- from ddtrace._trace.span import Span
from ddtrace.contrib.internal.trace_utils import set_http_meta
+ from ddtrace.trace import Span
assert config._trace_http_header_tags == {
"header1": "",
@@ -511,8 +511,8 @@ def test_set_http_meta_custom_errors(mock_log, span, int_config, error_codes, st
@pytest.mark.subprocess(env={"DD_TRACE_HTTP_SERVER_ERROR_STATUSES": "404-412"})
def test_set_http_meta_custom_errors_via_env():
from ddtrace import config
- from ddtrace import tracer
from ddtrace.contrib.internal.trace_utils import set_http_meta
+ from ddtrace.trace import tracer
config._add("myint", dict())
with tracer.trace("error") as span1:
@@ -1041,9 +1041,9 @@ def test_sanitized_url_in_http_meta(span, int_config):
@pytest.mark.subprocess(env={"DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP": ""})
def test_url_in_http_with_empty_obfuscation_regex():
from ddtrace import config
- from ddtrace import tracer
from ddtrace.contrib.internal.trace_utils import set_http_meta
from ddtrace.ext import http
+ from ddtrace.trace import tracer
assert config._obfuscation_query_string_pattern.pattern == b"", config._obfuscation_query_string_pattern
@@ -1066,9 +1066,9 @@ def test_url_in_http_with_obfuscation_enabled_and_empty_regex():
# Test that query strings are not added to urls when the obfuscation regex is an empty string
# and obfuscation is enabled (not disabled xD)
from ddtrace import config
- from ddtrace import tracer
from ddtrace.contrib.internal.trace_utils import set_http_meta
from ddtrace.ext import http
+ from ddtrace.trace import tracer
# assert obfuscation is disabled when the regex is an empty string
assert config.global_query_string_obfuscation_disabled is True
diff --git a/tests/tracer/test_tracer.py b/tests/tracer/test_tracer.py
index 1c45f424679..0a75e5fc037 100644
--- a/tests/tracer/test_tracer.py
+++ b/tests/tracer/test_tracer.py
@@ -15,9 +15,7 @@
import pytest
import ddtrace
-from ddtrace._trace.context import Context
from ddtrace._trace.span import _is_top_level
-from ddtrace._trace.tracer import Tracer
from ddtrace.constants import _HOSTNAME_KEY
from ddtrace.constants import _ORIGIN_KEY
from ddtrace.constants import _SAMPLING_PRIORITY_KEY
@@ -41,6 +39,8 @@
from ddtrace.internal.writer import AgentWriter
from ddtrace.internal.writer import LogWriter
from ddtrace.settings import Config
+from ddtrace.trace import Context
+from ddtrace.trace import Tracer
from tests.subprocesstest import run_in_subprocess
from tests.utils import TracerTestCase
from tests.utils import override_global_config
@@ -641,30 +641,30 @@ def test_tracer_url():
import ddtrace
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
assert t._writer.agent_url == "http://localhost:8126"
- t = ddtrace.Tracer(url="http://foobar:12")
+ t = ddtrace.trace.Tracer(url="http://foobar:12")
assert t._writer.agent_url == "http://foobar:12"
- t = ddtrace.Tracer(url="unix:///foobar")
+ t = ddtrace.trace.Tracer(url="unix:///foobar")
assert t._writer.agent_url == "unix:///foobar"
- t = ddtrace.Tracer(url="http://localhost")
+ t = ddtrace.trace.Tracer(url="http://localhost")
assert t._writer.agent_url == "http://localhost"
- t = ddtrace.Tracer(url="https://localhost")
+ t = ddtrace.trace.Tracer(url="https://localhost")
assert t._writer.agent_url == "https://localhost"
with pytest.raises(ValueError) as e:
- ddtrace.Tracer(url="foo://foobar:12")
+ ddtrace.trace.Tracer(url="foo://foobar:12")
assert (
str(e.value) == "Unsupported protocol 'foo' in intake URL 'foo://foobar:12'. Must be one of: http, https, unix"
)
def test_tracer_shutdown_no_timeout():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
with mock.patch.object(AgentWriter, "stop") as mock_stop:
with mock.patch.object(AgentWriter, "join") as mock_join:
@@ -675,7 +675,7 @@ def test_tracer_shutdown_no_timeout():
def test_tracer_configure_writer_stop_unstarted():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
t._writer = mock.Mock(wraps=t._writer)
orig_writer = t._writer
@@ -685,7 +685,7 @@ def test_tracer_configure_writer_stop_unstarted():
def test_tracer_configure_writer_stop_started():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
t._writer = mock.Mock(wraps=t._writer)
orig_writer = t._writer
@@ -698,7 +698,7 @@ def test_tracer_configure_writer_stop_started():
def test_tracer_shutdown_timeout():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
with mock.patch.object(AgentWriter, "stop") as mock_stop:
with t.trace("something"):
@@ -709,7 +709,7 @@ def test_tracer_shutdown_timeout():
def test_tracer_shutdown():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
t.shutdown()
with mock.patch.object(AgentWriter, "write") as mock_write:
@@ -720,7 +720,7 @@ def test_tracer_shutdown():
def test_tracer_shutdown_warning():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
t.shutdown()
with mock.patch.object(logging.Logger, "warning") as mock_logger:
@@ -735,26 +735,26 @@ def test_tracer_shutdown_warning():
def test_tracer_dogstatsd_url():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
assert t._writer.dogstatsd.host == "localhost"
assert t._writer.dogstatsd.port == 8125
- t = ddtrace.Tracer(dogstatsd_url="foobar:12")
+ t = ddtrace.trace.Tracer(dogstatsd_url="foobar:12")
assert t._writer.dogstatsd.host == "foobar"
assert t._writer.dogstatsd.port == 12
- t = ddtrace.Tracer(dogstatsd_url="udp://foobar:12")
+ t = ddtrace.trace.Tracer(dogstatsd_url="udp://foobar:12")
assert t._writer.dogstatsd.host == "foobar"
assert t._writer.dogstatsd.port == 12
- t = ddtrace.Tracer(dogstatsd_url="/var/run/statsd.sock")
+ t = ddtrace.trace.Tracer(dogstatsd_url="/var/run/statsd.sock")
assert t._writer.dogstatsd.socket_path == "/var/run/statsd.sock"
- t = ddtrace.Tracer(dogstatsd_url="unix:///var/run/statsd.sock")
+ t = ddtrace.trace.Tracer(dogstatsd_url="unix:///var/run/statsd.sock")
assert t._writer.dogstatsd.socket_path == "/var/run/statsd.sock"
with pytest.raises(ValueError) as e:
- t = ddtrace.Tracer(dogstatsd_url="foo://foobar:12")
+ t = ddtrace.trace.Tracer(dogstatsd_url="foo://foobar:12")
assert str(e) == "Unknown url format for `foo://foobar:12`"
@@ -764,7 +764,7 @@ def test_tracer_fork():
import contextlib
import multiprocessing
- from ddtrace import tracer as t
+ from ddtrace.trace import tracer as t
original_pid = t._pid
original_writer = t._writer
@@ -811,7 +811,7 @@ def task(t, errors):
def test_tracer_with_version():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
# With global `config.version` defined
with override_global_config(dict(version="1.2.3")):
@@ -838,7 +838,7 @@ def test_tracer_with_version():
def test_tracer_with_env():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
# With global `config.env` defined
with override_global_config(dict(env="prod")):
@@ -1001,7 +1001,7 @@ def test_dd_tags_invalid(self):
@run_in_subprocess(env_overrides=dict(DD_TAGS="service:mysvc,env:myenv,version:myvers"))
def test_tags_from_DD_TAGS(self):
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
with t.trace("test") as s:
assert s.service == "mysvc"
assert s.get_tag("env") == "myenv"
@@ -1016,7 +1016,7 @@ def test_tags_from_DD_TAGS(self):
)
)
def test_tags_from_DD_TAGS_precedence(self):
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
with t.trace("test") as s:
assert s.service == "svc"
assert s.get_tag("env") == "env"
@@ -1024,7 +1024,7 @@ def test_tags_from_DD_TAGS_precedence(self):
@run_in_subprocess(env_overrides=dict(DD_TAGS="service:mysvc,env:myenv,version:myvers"))
def test_tags_from_DD_TAGS_override(self):
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
ddtrace.config.env = "env"
ddtrace.config.service = "service"
ddtrace.config.version = "0.123"
@@ -1035,13 +1035,13 @@ def test_tags_from_DD_TAGS_override(self):
def test_tracer_set_runtime_tags():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
with t.start_span("foobar") as span:
pass
assert len(span.get_tag("runtime-id"))
- t2 = ddtrace.Tracer()
+ t2 = ddtrace.trace.Tracer()
with t2.start_span("foobaz") as span2:
pass
@@ -1059,7 +1059,7 @@ def _test_tracer_runtime_tags_fork_task(tracer, q):
def test_tracer_runtime_tags_fork():
import multiprocessing
- from ddtrace import tracer
+ from ddtrace.trace import tracer
from tests.tracer.test_tracer import _test_tracer_runtime_tags_fork_task
span = tracer.start_span("foobar")
@@ -1084,7 +1084,7 @@ def test_tracer_runtime_tags_cross_execution(tracer):
def test_start_span_hooks():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
result = {}
@@ -1099,7 +1099,7 @@ def store_span(span):
def test_deregister_start_span_hooks():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
result = {}
@@ -1121,7 +1121,7 @@ def test_enable():
import ddtrace
- t2 = ddtrace.Tracer()
+ t2 = ddtrace.trace.Tracer()
if os.environ["DD_TRACE_ENABLED"] == "true":
assert t2.enabled
else:
@@ -1138,8 +1138,8 @@ def test_enable():
)
def test_unfinished_span_warning_log():
"""Test that a warning log is emitted when the tracer is shut down with unfinished spans."""
- from ddtrace import tracer
from ddtrace.constants import MANUAL_KEEP_KEY
+ from ddtrace.trace import tracer
# Create two unfinished spans
span1 = tracer.trace("unfinished_span1", service="my_service", resource="my_resource1")
@@ -1170,7 +1170,7 @@ def thread_target():
def test_runtime_id_parent_only():
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
# Parent spans should have runtime-id
with tracer.trace("test") as s:
@@ -1196,7 +1196,7 @@ def test_runtime_id_parent_only():
def test_runtime_id_fork():
import os
- from ddtrace import tracer
+ from ddtrace.trace import tracer
s = tracer.trace("test")
s.finish()
@@ -1222,8 +1222,8 @@ def test_runtime_id_fork():
def test_multiple_tracer_ctx():
- t1 = ddtrace.Tracer()
- t2 = ddtrace.Tracer()
+ t1 = ddtrace.trace.Tracer()
+ t2 = ddtrace.trace.Tracer()
with t1.trace("") as s1:
with t2.trace("") as s2:
@@ -1413,7 +1413,7 @@ def _test_partial_flush(self):
def test_unicode_config_vals():
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
with override_global_config(dict(version="😇", env="😇")):
with t.trace("1"):
@@ -1664,22 +1664,24 @@ def override_service_mapping(service_mapping):
ddtrace.config.service_mapping = {}
# Test single mapping
- with override_service_mapping("foo:bar"), ddtrace.Tracer().trace("renaming", service="foo") as span:
+ with override_service_mapping("foo:bar"), ddtrace.trace.Tracer().trace("renaming", service="foo") as span:
assert span.service == "bar"
# Test multiple mappings
- with override_service_mapping("foo:bar,sna:fu"), ddtrace.Tracer().trace("renaming", service="sna") as span:
+ with override_service_mapping("foo:bar,sna:fu"), ddtrace.trace.Tracer().trace("renaming", service="sna") as span:
assert span.service == "fu"
# Test colliding mappings
- with override_service_mapping("foo:bar,foo:foobar"), ddtrace.Tracer().trace("renaming", service="foo") as span:
+ with override_service_mapping("foo:bar,foo:foobar"), ddtrace.trace.Tracer().trace(
+ "renaming", service="foo"
+ ) as span:
assert span.service == "foobar"
# Test invalid service mapping
with override_service_mapping("foo;bar,sna:fu"):
- with ddtrace.Tracer().trace("passthru", service="foo") as _:
+ with ddtrace.trace.Tracer().trace("passthru", service="foo") as _:
assert _.service == "foo"
- with ddtrace.Tracer().trace("renaming", "sna") as _:
+ with ddtrace.trace.Tracer().trace("renaming", "sna") as _:
assert _.service == "fu"
@@ -1687,13 +1689,13 @@ def override_service_mapping(service_mapping):
def test_configure_url_partial():
import ddtrace
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(hostname="abc")
assert tracer._writer.agent_url == "http://abc:8126"
tracer._configure(port=123)
assert tracer._writer.agent_url == "http://abc:123"
- tracer = ddtrace.Tracer(url="http://abc")
+ tracer = ddtrace.trace.Tracer(url="http://abc")
assert tracer._writer.agent_url == "http://abc"
tracer._configure(port=123)
assert tracer._writer.agent_url == "http://abc:123"
@@ -1706,7 +1708,7 @@ def test_bad_agent_url():
import pytest
with pytest.raises(ValueError) as e:
- from ddtrace import tracer # noqa: F401
+ from ddtrace.trace import tracer # noqa: F401
assert (
str(e.value)
@@ -1719,7 +1721,7 @@ def test_bad_agent_url_invalid_path():
import pytest
with pytest.raises(ValueError) as e:
- from ddtrace import tracer # noqa: F401
+ from ddtrace.trace import tracer # noqa: F401
assert str(e.value) == "Invalid file path in intake URL 'unix://'"
@@ -1728,7 +1730,7 @@ def test_bad_agent_url_invalid_hostname():
import pytest
with pytest.raises(ValueError) as e:
- from ddtrace import tracer # noqa: F401
+ from ddtrace.trace import tracer # noqa: F401
assert str(e.value) == "Invalid hostname in intake URL 'http://'"
@@ -1834,7 +1836,7 @@ def _target(span):
def test_fork_manual_span_same_context():
import os
- from ddtrace import tracer
+ from ddtrace.trace import tracer
span = tracer.trace("test")
pid = os.fork()
@@ -1858,7 +1860,7 @@ def test_fork_manual_span_same_context():
def test_fork_manual_span_different_contexts():
import os
- from ddtrace import tracer
+ from ddtrace.trace import tracer
span = tracer.start_span("test")
pid = os.fork()
@@ -1881,8 +1883,8 @@ def test_fork_manual_span_different_contexts():
def test_fork_pid():
import os
- from ddtrace import tracer
from ddtrace.constants import PID
+ from ddtrace.trace import tracer
root = tracer.trace("root_span")
assert root.get_tag("runtime-id") is not None
@@ -2017,8 +2019,8 @@ def test_import_ddtrace_tracer_not_module():
if import_ddtrace_tracer:
import ddtrace.tracer # noqa: F401
- from ddtrace import Tracer
- from ddtrace import tracer
+ from ddtrace.trace import Tracer
+ from ddtrace.trace import tracer
assert isinstance(tracer, Tracer)
@@ -2032,7 +2034,7 @@ def test_asm_standalone_configuration(sca_enabled, appsec_enabled, iast_enabled)
with override_env({"DD_APPSEC_SCA_ENABLED": sca_enabled}):
ddtrace.config._reset()
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
tracer._configure(appsec_enabled=appsec_enabled, iast_enabled=iast_enabled, appsec_standalone_enabled=True)
if sca_enabled == "true":
assert bool(ddtrace.config._sca_enabled) is True
@@ -2051,7 +2053,7 @@ def test_asm_standalone_configuration(sca_enabled, appsec_enabled, iast_enabled)
def test_gc_not_used_on_root_spans():
- tracer = ddtrace.Tracer()
+ tracer = ddtrace.trace.Tracer()
gc.freeze()
with tracer.trace("test-event"):
@@ -2084,7 +2086,7 @@ def test_multiple_tracer_instances():
assert "Support for multiple Tracer instances is deprecated" not in str(w.message)
warns.clear()
- t = ddtrace.Tracer()
+ t = ddtrace.trace.Tracer()
# TODO: Update this assertion when the deprecation is removed and the tracer becomes a singleton
assert t is not ddtrace.tracer
assert len(warns) == 1
diff --git a/tests/tracer/test_utils.py b/tests/tracer/test_utils.py
index b24396fde7b..a83a329d716 100644
--- a/tests/tracer/test_utils.py
+++ b/tests/tracer/test_utils.py
@@ -7,7 +7,6 @@
import mock
import pytest
-from ddtrace._trace.context import Context
from ddtrace.internal.utils import ArgumentError
from ddtrace.internal.utils import get_argument_value
from ddtrace.internal.utils import set_argument_value
@@ -21,6 +20,7 @@
from ddtrace.internal.utils.formats import parse_tags_str
from ddtrace.internal.utils.http import w3c_get_dd_list_member
from ddtrace.internal.utils.importlib import func_name
+from ddtrace.trace import Context
class TestUtils(unittest.TestCase):
diff --git a/tests/tracer/test_writer.py b/tests/tracer/test_writer.py
index 6abb7681ab8..c0e375cca22 100644
--- a/tests/tracer/test_writer.py
+++ b/tests/tracer/test_writer.py
@@ -14,7 +14,6 @@
import ddtrace
from ddtrace import config
-from ddtrace._trace.span import Span
from ddtrace.constants import _KEEP_SPANS_RATE_KEY
from ddtrace.internal.ci_visibility.writer import CIVisibilityWriter
from ddtrace.internal.compat import get_connection_response
@@ -26,6 +25,7 @@
from ddtrace.internal.writer import LogWriter
from ddtrace.internal.writer import Response
from ddtrace.internal.writer import _human_size
+from ddtrace.trace import Span
from tests.utils import AnyInt
from tests.utils import BaseTestCase
from tests.utils import override_env
diff --git a/tests/utils.py b/tests/utils.py
index 5283e27e7cf..bc7acd68b84 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -17,9 +17,7 @@
import wrapt
import ddtrace
-from ddtrace import Tracer
from ddtrace import config as dd_config
-from ddtrace._trace.span import Span
from ddtrace.constants import _SPAN_MEASURED_KEY
from ddtrace.ext import http
from ddtrace.internal import agent
@@ -40,6 +38,8 @@
from ddtrace.propagation.http import _DatadogMultiHeader
from ddtrace.settings._database_monitoring import dbm_config
from ddtrace.settings.asm import config as asm_config
+from ddtrace.trace import Span
+from ddtrace.trace import Tracer
from tests.subprocesstest import SubprocessTestCase
@@ -373,7 +373,7 @@ def _ensure_test_spans(self, spans):
"""
internal helper to ensure the list of spans are all :class:`tests.utils.span.TestSpan`
- :param spans: List of :class:`ddtrace._trace.span.Span` or :class:`tests.utils.span.TestSpan`
+ :param spans: List of :class:`ddtrace.trace.Span` or :class:`tests.utils.span.TestSpan`
:type spans: list
:returns: A list og :class:`tests.utils.span.TestSpan`
:rtype: list
@@ -664,7 +664,7 @@ def _configure(self, *args, **kwargs):
class TestSpan(Span):
"""
- Test wrapper for a :class:`ddtrace._trace.span.Span` that provides additional functions and assertions
+ Test wrapper for a :class:`ddtrace.trace.Span` that provides additional functions and assertions
Example::
@@ -682,8 +682,8 @@ def __init__(self, span):
"""
Constructor for TestSpan
- :param span: The :class:`ddtrace._trace.span.Span` to wrap
- :type span: :class:`ddtrace._trace.span.Span`
+ :param span: The :class:`ddtrace.trace.Span` to wrap
+ :type span: :class:`ddtrace.trace.Span`
"""
if isinstance(span, TestSpan):
span = span._span
@@ -693,7 +693,7 @@ def __init__(self, span):
def __getattr__(self, key):
"""
- First look for property on the base :class:`ddtrace._trace.span.Span` otherwise return this object's attribute
+ First look for property on the base :class:`ddtrace.trace.Span` otherwise return this object's attribute
"""
if hasattr(self._span, key):
return getattr(self._span, key)
@@ -701,12 +701,12 @@ def __getattr__(self, key):
return self.__getattribute__(key)
def __setattr__(self, key, value):
- """Pass through all assignment to the base :class:`ddtrace._trace.span.Span`"""
+ """Pass through all assignment to the base :class:`ddtrace.trace.Span`"""
return setattr(self._span, key, value)
def __eq__(self, other):
"""
- Custom equality code to ensure we are using the base :class:`ddtrace._trace.span.Span.__eq__`
+ Custom equality code to ensure we are using the base :class:`ddtrace.trace.Span.__eq__`
:param other: The object to check equality with
:type other: object
@@ -882,7 +882,7 @@ class TestSpanNode(TestSpan, TestSpanContainer):
"""
A :class:`tests.utils.span.TestSpan` which is used as part of a span tree.
- Each :class:`tests.utils.span.TestSpanNode` represents the current :class:`ddtrace._trace.span.Span`
+ Each :class:`tests.utils.span.TestSpanNode` represents the current :class:`ddtrace.trace.Span`
along with any children who have that span as it's parent.
This class can be used to assert on the parent/child relationships between spans.
@@ -1002,7 +1002,7 @@ class SnapshotFailed(Exception):
@dataclasses.dataclass
class SnapshotTest:
token: str
- tracer: ddtrace.Tracer = ddtrace.tracer
+ tracer: ddtrace.trace.Tracer = ddtrace.tracer
def clear(self):
"""Clear any traces sent that were sent for this snapshot."""
diff --git a/tests/webclient.py b/tests/webclient.py
index 33e5751baf6..38904a9af95 100644
--- a/tests/webclient.py
+++ b/tests/webclient.py
@@ -2,9 +2,9 @@
import requests
-from ddtrace._trace.context import Context
from ddtrace.internal.utils.retry import retry
from ddtrace.propagation.http import HTTPPropagator
+from ddtrace.trace import Context
from ddtrace.trace import TraceFilter