From c8ac4da77c8db28dd57ba3b8958372d4f273c71e Mon Sep 17 00:00:00 2001 From: Sam Brenner <106700075+sabrenner@users.noreply.github.com> Date: Wed, 29 Jan 2025 15:57:47 -0500 Subject: [PATCH 1/2] chore(langchain): drop support for tracing v0.0.x (#12130) This PR officially drops tracing support for LangChain's 0.0.x release line. If a user tries to use `ddtrace` with `langchain< 0.1`, then we'll log a warning and stop patching to avoid hard crashing. This PR removes testing for v0.0.x, and removes patching for v0.0.x methods. Follow-ups for further cleanup: - resolve patching partner libraries and sub modules - re-enabling langchain>0.1 tests - refactoring patching further into handlers for different operations (llms, chat models, tools, vectorstores, embeddings) if possible MLOB-2092 ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --------- Co-authored-by: kyle --- .riot/requirements/16c3b9f.txt | 84 -- .riot/requirements/585e779.txt | 82 -- .riot/requirements/d39d3de.txt | 84 -- ddtrace/contrib/internal/langchain/patch.py | 249 ++-- docs/index.rst | 2 +- ...in-drop-v0.0-support-745a0572da799e4e.yaml | 4 + riotfile.py | 11 - tests/contrib/langchain/test_langchain.py | 1073 ----------------- .../contrib/langchain/test_langchain_patch.py | 155 +-- 9 files changed, 173 insertions(+), 1571 deletions(-) delete mode 100644 .riot/requirements/16c3b9f.txt delete mode 100644 .riot/requirements/585e779.txt delete mode 100644 .riot/requirements/d39d3de.txt create mode 100644 releasenotes/notes/langchain-drop-v0.0-support-745a0572da799e4e.yaml delete mode 100644 tests/contrib/langchain/test_langchain.py 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/ddtrace/contrib/internal/langchain/patch.py b/ddtrace/contrib/internal/langchain/patch.py index 430700e2782..0d1ba2a8d47 100644 --- a/ddtrace/contrib/internal/langchain/patch.py +++ b/ddtrace/contrib/internal/langchain/patch.py @@ -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/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/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/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 From 58b4dfa6d603317da20ffcfb38786dddb5985727 Mon Sep 17 00:00:00 2001 From: Munir Abdinur Date: Wed, 29 Jan 2025 16:34:00 -0500 Subject: [PATCH 2/2] chore(tracing): avoid using deprecated code internally [3.0] (#12113) Ensures deprecated tracing attributes are not used in ddtrace internals and tests. We should not log deprecation warnings when the tracer is used in an expected way. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting) --- benchmarks/ddtrace_run/scenario.py | 2 +- benchmarks/otel_span/scenario.py | 2 +- benchmarks/span/scenario.py | 2 +- benchmarks/threading/scenario.py | 2 +- benchmarks/tracer/scenario.py | 2 +- ddtrace/_trace/_span_link.py | 2 +- ddtrace/_trace/pin.py | 20 +-- ddtrace/_trace/sampler.py | 4 +- ddtrace/_trace/trace_handlers.py | 2 +- ddtrace/_trace/tracer.py | 2 +- .../utils_botocore/aws_payload_tagging.py | 2 +- ddtrace/_trace/utils_botocore/span_tags.py | 2 +- ddtrace/appsec/_asm_request_context.py | 6 +- ddtrace/appsec/_capabilities.py | 4 +- .../_exploit_prevention/stack_traces.py | 4 +- ddtrace/appsec/_iast/_iast_request_context.py | 2 +- ddtrace/appsec/_iast/processor.py | 2 +- ddtrace/appsec/_iast/taint_sinks/_base.py | 2 +- ddtrace/appsec/_processor.py | 2 +- ddtrace/appsec/_remoteconfiguration.py | 6 +- ddtrace/appsec/_trace_utils.py | 4 +- ddtrace/bootstrap/preload.py | 2 +- ddtrace/context.py | 2 +- ddtrace/contrib/aiohttp/__init__.py | 2 +- ddtrace/contrib/bottle/__init__.py | 2 +- ddtrace/contrib/cherrypy/__init__.py | 4 +- ddtrace/contrib/falcon/__init__.py | 4 +- ddtrace/contrib/flask_cache/__init__.py | 8 +- ddtrace/contrib/gevent/__init__.py | 3 +- ddtrace/contrib/internal/asgi/middleware.py | 2 +- ddtrace/contrib/internal/asyncio/provider.py | 2 +- .../contrib/internal/avro/schema_iterator.py | 2 +- ddtrace/contrib/internal/aws_lambda/patch.py | 2 +- ddtrace/contrib/internal/cassandra/session.py | 2 +- ddtrace/contrib/internal/celery/utils.py | 2 +- ddtrace/contrib/internal/django/utils.py | 2 +- ddtrace/contrib/internal/dramatiq/patch.py | 2 +- ddtrace/contrib/internal/falcon/patch.py | 2 +- ddtrace/contrib/internal/flask_cache/patch.py | 2 +- ddtrace/contrib/internal/futures/threading.py | 2 +- ddtrace/contrib/internal/gevent/provider.py | 2 +- ddtrace/contrib/internal/graphql/patch.py | 2 +- .../internal/grpc/aio_client_interceptor.py | 2 +- .../internal/grpc/aio_server_interceptor.py | 2 +- ddtrace/contrib/internal/langchain/patch.py | 2 +- ddtrace/contrib/internal/langgraph/patch.py | 2 +- ddtrace/contrib/internal/logging/patch.py | 2 +- ddtrace/contrib/internal/mongoengine/trace.py | 2 +- .../internal/protobuf/schema_iterator.py | 5 +- ddtrace/contrib/internal/pylibmc/client.py | 2 +- ddtrace/contrib/internal/pymemcache/patch.py | 2 +- ddtrace/contrib/internal/pytest/plugin.py | 2 +- ddtrace/contrib/internal/selenium/patch.py | 6 +- ddtrace/contrib/internal/sqlalchemy/engine.py | 6 +- ddtrace/contrib/internal/starlette/patch.py | 2 +- .../contrib/internal/tornado/application.py | 2 +- .../contrib/internal/tornado/stack_context.py | 2 +- ddtrace/contrib/internal/trace_utils.py | 10 +- ddtrace/contrib/internal/unittest/patch.py | 33 ++--- ddtrace/contrib/internal/wsgi/wsgi.py | 4 +- ddtrace/contrib/logging/__init__.py | 2 +- ddtrace/contrib/tornado/__init__.py | 2 +- ddtrace/debugging/_debugger.py | 2 +- ddtrace/debugging/_exception/replay.py | 2 +- ddtrace/debugging/_origin/span.py | 2 +- ddtrace/debugging/_signal/model.py | 4 +- ddtrace/debugging/_signal/tracing.py | 2 +- ddtrace/ext/aws.py | 2 +- ddtrace/ext/test_visibility/api.py | 4 +- ddtrace/internal/ci_visibility/api/_base.py | 6 +- ddtrace/internal/ci_visibility/coverage.py | 2 +- ddtrace/internal/ci_visibility/filters.py | 2 +- ddtrace/internal/ci_visibility/git_client.py | 2 +- ddtrace/internal/ci_visibility/recorder.py | 2 +- ddtrace/internal/ci_visibility/utils.py | 4 +- ddtrace/internal/core/__init__.py | 2 +- ddtrace/internal/debug.py | 2 +- ddtrace/internal/opentelemetry/context.py | 2 +- ddtrace/internal/opentelemetry/span.py | 2 +- ddtrace/internal/opentelemetry/trace.py | 4 +- ddtrace/internal/processor/stats.py | 2 +- ddtrace/internal/remoteconfig/_pubsub.py | 2 +- ddtrace/internal/remoteconfig/_subscribers.py | 2 +- ddtrace/internal/runtime/runtime_metrics.py | 4 +- ddtrace/internal/test_visibility/_utils.py | 2 +- ddtrace/internal/test_visibility/api.py | 4 +- ddtrace/internal/tracemethods.py | 2 +- ddtrace/internal/writer/writer.py | 2 +- ddtrace/llmobs/_evaluators/runner.py | 2 +- ddtrace/llmobs/_integrations/anthropic.py | 2 +- ddtrace/llmobs/_integrations/base.py | 2 +- ddtrace/llmobs/_integrations/bedrock.py | 2 +- ddtrace/llmobs/_integrations/gemini.py | 2 +- ddtrace/llmobs/_integrations/langchain.py | 2 +- ddtrace/llmobs/_integrations/langgraph.py | 4 +- ddtrace/llmobs/_integrations/openai.py | 2 +- ddtrace/llmobs/_integrations/vertexai.py | 2 +- ddtrace/llmobs/_llmobs.py | 6 +- ddtrace/llmobs/_utils.py | 2 +- ddtrace/opentracer/span.py | 6 +- ddtrace/opentracer/span_context.py | 2 +- ddtrace/opentracer/tracer.py | 6 +- ddtrace/profiling/collector/_lock.py | 2 +- ddtrace/profiling/collector/pytorch.py | 2 +- ddtrace/profiling/collector/stack.pyi | 2 +- ddtrace/profiling/collector/stack.pyx | 2 +- ddtrace/profiling/exporter/http.py | 2 +- ddtrace/profiling/scheduler.py | 2 +- ddtrace/propagation/_database_monitoring.py | 2 +- ddtrace/propagation/http.py | 4 +- ddtrace/runtime/__init__.py | 2 +- ddtrace/span.py | 2 +- ddtrace/trace/__init__.py | 2 + docs/advanced_usage.rst | 30 ++--- docs/api.rst | 8 +- docs/basic_usage.rst | 12 +- docs/troubleshooting.rst | 2 +- ...ated-apis-internally-fd9c9ce9c52905af.yaml | 5 + scripts/profiles/flask-simple/app/app.py | 4 +- templates/integration/__init__.py | 2 +- .../appsec/appsec/test_appsec_trace_utils.py | 2 +- tests/appsec/appsec/test_processor.py | 2 +- tests/appsec/appsec/test_telemetry.py | 2 +- .../contrib_appsec/django_app/settings.py | 2 +- .../appsec/contrib_appsec/django_app/urls.py | 2 +- .../appsec/contrib_appsec/fastapi_app/app.py | 2 +- tests/appsec/contrib_appsec/flask_app/app.py | 3 +- .../fixtures/integration/main_configure.py | 2 +- .../integration/main_configure_right.py | 2 +- .../integration/main_configure_wrong.py | 2 +- .../iast_tdd_propagation/flask_orm_app.py | 2 +- .../flask_propagation_views.py | 2 +- .../flask_taint_sinks_views.py | 2 +- .../integrations/django_tests/conftest.py | 2 +- .../django_tests/django_app/settings.py | 2 +- .../django_tests/django_app/urls.py | 2 +- .../django_tests/django_app/views.py | 2 +- .../flask_tests/test_flask_remoteconfig.py | 2 +- tests/appsec/utils.py | 4 +- tests/ci_visibility/api_client/_util.py | 2 +- tests/ci_visibility/test_ci_visibility.py | 8 +- ...st_ci_visibility_check_enabled_features.py | 2 +- tests/ci_visibility/test_encoder.py | 2 +- tests/ci_visibility/util.py | 2 +- tests/commands/ddtrace_run_disabled.py | 2 +- tests/commands/ddtrace_run_dogstatsd.py | 2 +- tests/commands/ddtrace_run_enabled.py | 2 +- tests/commands/ddtrace_run_global_tags.py | 2 +- tests/commands/ddtrace_run_hostname.py | 2 +- .../aiohttp_jinja2/test_aiohttp_jinja2.py | 2 +- tests/contrib/aiomysql/test_aiomysql.py | 2 +- tests/contrib/asyncio/test_lazyimport.py | 2 +- tests/contrib/asyncio/test_propagation.py | 2 +- tests/contrib/asyncpg/test_asyncpg.py | 2 +- tests/contrib/aws_lambda/handlers.py | 2 +- tests/contrib/celery/test_integration.py | 2 +- tests/contrib/celery/test_utils.py | 2 +- tests/contrib/dbapi/test_dbapi.py | 2 +- tests/contrib/dbapi_async/test_dbapi_async.py | 2 +- tests/contrib/django/django_app/settings.py | 2 +- tests/contrib/django/django_app/urls.py | 2 +- tests/contrib/django/views.py | 2 +- tests/contrib/flask/app.py | 4 +- tests/contrib/flask/test_flask_appsec.py | 2 +- tests/contrib/flask_cache/test_utils.py | 2 +- tests/contrib/freezegun/test_freezegun.py | 4 +- tests/contrib/gevent/test_tracer.py | 2 +- tests/contrib/graphql/test_graphql.py | 2 +- tests/contrib/grpc/test_grpc.py | 2 +- tests/contrib/gunicorn/wsgi_mw_app.py | 2 +- tests/contrib/kafka/test_kafka.py | 2 +- tests/contrib/langgraph/conftest.py | 2 +- tests/contrib/logbook/test_logbook_logging.py | 8 +- tests/contrib/loguru/test_loguru_logging.py | 14 +-- tests/contrib/openai/conftest.py | 2 +- tests/contrib/pyramid/app/app.py | 2 +- .../pyramid/pserve_app/app/__init__.py | 2 +- tests/contrib/pytest/test_pytest.py | 4 +- tests/contrib/redis/test_redis_asyncio.py | 2 +- tests/contrib/sanic/run_server.py | 2 +- tests/contrib/snowflake/test_snowflake.py | 2 +- .../structlog/test_structlog_logging.py | 12 +- tests/contrib/tornado/test_config.py | 2 +- tests/contrib/tornado/test_stack_context.py | 2 +- tests/integration/test_context_snapshots.py | 2 +- tests/integration/test_debug.py | 28 ++--- tests/integration/test_encoding.py | 2 +- tests/integration/test_integration.py | 44 +++---- .../test_integration_civisibility.py | 2 +- .../integration/test_integration_snapshots.py | 18 +-- tests/integration/test_priority_sampling.py | 8 +- tests/integration/test_propagation.py | 2 +- tests/integration/test_sampling.py | 8 +- tests/integration/test_trace_stats.py | 6 +- tests/integration/utils.py | 2 +- tests/internal/peer_service/test_processor.py | 2 +- tests/internal/service_name/test_processor.py | 2 +- tests/internal/test_database_monitoring.py | 10 +- tests/llmobs/_utils.py | 2 +- tests/llmobs/test_llmobs_evaluator_runner.py | 2 +- tests/llmobs/test_llmobs_ragas_evaluators.py | 2 +- tests/llmobs/test_llmobs_service.py | 2 +- tests/llmobs/test_propagation.py | 12 +- .../opentracer/core/test_dd_compatibility.py | 2 +- tests/opentracer/core/test_tracer.py | 2 +- tests/profiling/collector/conftest.py | 2 +- tests/profiling/collector/test_stack.py | 2 +- tests/profiling/test_profiler.py | 12 +- tests/profiling_v2/collector/conftest.py | 2 +- .../collector/test_stack_asyncio.py | 2 +- tests/telemetry/test_telemetry.py | 4 +- tests/telemetry/test_telemetry_metrics_e2e.py | 2 +- tests/tracer/runtime/test_runtime_metrics.py | 2 +- tests/tracer/test_context.py | 4 +- tests/tracer/test_correlation_log_context.py | 20 +-- tests/tracer/test_encoders.py | 8 +- tests/tracer/test_filters.py | 2 +- tests/tracer/test_gitmetadata.py | 18 +-- tests/tracer/test_memory_leak.py | 6 +- tests/tracer/test_processors.py | 6 +- tests/tracer/test_propagation.py | 18 +-- tests/tracer/test_rand.py | 4 +- tests/tracer/test_sampler.py | 6 +- .../tracer/test_single_span_sampling_rules.py | 2 +- tests/tracer/test_span.py | 2 +- tests/tracer/test_trace_utils.py | 14 +-- tests/tracer/test_tracer.py | 114 +++++++++--------- tests/tracer/test_utils.py | 2 +- tests/tracer/test_writer.py | 2 +- tests/utils.py | 22 ++-- tests/webclient.py | 2 +- 231 files changed, 522 insertions(+), 507 deletions(-) create mode 100644 releasenotes/notes/avoid-using-deprecated-apis-internally-fd9c9ce9c52905af.yaml 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/aiohttp/__init__.py b/ddtrace/contrib/aiohttp/__init__.py index 3075ca744fa..2bb498bdf9c 100644 --- a/ddtrace/contrib/aiohttp/__init__.py +++ b/ddtrace/contrib/aiohttp/__init__.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/bottle/__init__.py b/ddtrace/contrib/bottle/__init__.py index 12d046d8128..5ee1de17f3d 100644 --- a/ddtrace/contrib/bottle/__init__.py +++ b/ddtrace/contrib/bottle/__init__.py @@ -3,7 +3,7 @@ plugin to your app:: import bottle - from ddtrace import tracer + from ddtrace.trace import tracer from ddtrace.contrib.bottle import TracePlugin app = bottle.Bottle() diff --git a/ddtrace/contrib/cherrypy/__init__.py b/ddtrace/contrib/cherrypy/__init__.py index 0ae66d24918..9a78ef7b47e 100644 --- a/ddtrace/contrib/cherrypy/__init__.py +++ b/ddtrace/contrib/cherrypy/__init__.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/__init__.py b/ddtrace/contrib/falcon/__init__.py index a521689273b..d86767b9d1d 100644 --- a/ddtrace/contrib/falcon/__init__.py +++ b/ddtrace/contrib/falcon/__init__.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/__init__.py b/ddtrace/contrib/flask_cache/__init__.py index d35ab94f6e6..f35b73111fb 100644 --- a/ddtrace/contrib/flask_cache/__init__.py +++ b/ddtrace/contrib/flask_cache/__init__.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/gevent/__init__.py b/ddtrace/contrib/gevent/__init__.py index 5ee22f591b4..d02588efad9 100644 --- a/ddtrace/contrib/gevent/__init__.py +++ b/ddtrace/contrib/gevent/__init__.py @@ -46,12 +46,11 @@ def worker_function(): from . import patch as _ # noqa: F401, I001 +from ddtrace._trace.provider import DefaultContextProvider as _DefaultContextProvider from ddtrace.contrib.internal.gevent.patch import get_version #noqa: F401 from ddtrace.contrib.internal.gevent.patch import patch #noqa: F401 from ddtrace.contrib.internal.gevent.patch import unpatch #noqa: F401 -from ...provider import DefaultContextProvider as _DefaultContextProvider - context_provider = _DefaultContextProvider() 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 0d1ba2a8d47..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__) 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/logging/__init__.py b/ddtrace/contrib/logging/__init__.py index 75454ce7c55..9dcb3befe8c 100644 --- a/ddtrace/contrib/logging/__init__.py +++ b/ddtrace/contrib/logging/__init__.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/tornado/__init__.py b/ddtrace/contrib/tornado/__init__.py index 403739448be..98a3cec1fa6 100644 --- a/ddtrace/contrib/tornado/__init__.py +++ b/ddtrace/contrib/tornado/__init__.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 64e0095abb1..6c30c6b5310 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/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/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/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