Skip to content

Commit 22f7d47

Browse files
authored
chore(integrations): avoids using deprecated apis in ddtrace.patch(…) [backports 2.20] (#12153)
Backports: #12107 # Checklist 1 - [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)) # Checklist 2 - [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)
1 parent d40de8a commit 22f7d47

File tree

21 files changed

+48
-62
lines changed

21 files changed

+48
-62
lines changed

ddtrace/_monkey.py

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,6 @@
157157
}
158158

159159

160-
DEFAULT_MODULES_PREFIX = "ddtrace.contrib"
161-
162-
163160
class PatchException(Exception):
164161
"""Wraps regular `Exception` class when patching modules"""
165162

@@ -170,19 +167,14 @@ class ModuleNotFoundException(PatchException):
170167
pass
171168

172169

173-
def _on_import_factory(module, prefix="ddtrace.contrib", raise_errors=True, patch_indicator=True):
170+
def _on_import_factory(module, path_f, raise_errors=True, patch_indicator=True):
174171
# type: (str, str, bool, Union[bool, List[str]]) -> Callable[[Any], None]
175172
"""Factory to create an import hook for the provided module name"""
176173

177174
def on_import(hook):
178175
# Import and patch module
179176
try:
180-
try:
181-
imported_module = importlib.import_module("%s.internal.%s.patch" % (prefix, module))
182-
except ImportError:
183-
# Some integrations do not have an internal patch module, so we use the public one
184-
# FIXME: This is a temporary solution until we refactor the patching logic.
185-
imported_module = importlib.import_module("%s.%s" % (prefix, module))
177+
imported_module = importlib.import_module(path_f % (module,))
186178
imported_module.patch()
187179
if hasattr(imported_module, "patch_submodules"):
188180
imported_module.patch_submodules(patch_indicator)
@@ -209,7 +201,7 @@ def on_import(hook):
209201
name, True, PATCH_MODULES.get(module) is True, "", version=v
210202
)
211203
elif hasattr(imported_module, "get_version"):
212-
# TODO: Ensure every integration defines either get_version or get_versions in their patch.py module
204+
# Some integrations/iast patchers do not define get_version
213205
version = imported_module.get_version()
214206
telemetry.telemetry_writer.add_integration(
215207
module, True, PATCH_MODULES.get(module) is True, "", version=version
@@ -258,8 +250,8 @@ def patch_all(**patch_modules):
258250
load_common_appsec_modules()
259251

260252

261-
def patch(raise_errors=True, patch_modules_prefix=DEFAULT_MODULES_PREFIX, **patch_modules):
262-
# type: (bool, str, Union[List[str], bool]) -> None
253+
def patch(raise_errors=True, **patch_modules):
254+
# type: (bool, Union[List[str], bool]) -> None
263255
"""Patch only a set of given modules.
264256
265257
:param bool raise_errors: Raise error if one patch fail.
@@ -270,17 +262,22 @@ def patch(raise_errors=True, patch_modules_prefix=DEFAULT_MODULES_PREFIX, **patc
270262
contribs = {c: patch_indicator for c, patch_indicator in patch_modules.items() if patch_indicator}
271263
for contrib, patch_indicator in contribs.items():
272264
# Check if we have the requested contrib.
273-
if not os.path.isfile(os.path.join(os.path.dirname(__file__), "contrib", contrib, "__init__.py")):
265+
if not os.path.isfile(os.path.join(os.path.dirname(__file__), "contrib", "internal", contrib, "patch.py")):
274266
if raise_errors:
275267
raise ModuleNotFoundException(
276-
"integration module ddtrace.contrib.%s does not exist, "
277-
"module will not have tracing available" % contrib
268+
"integration module ddtrace.contrib.internal.%s.patch does not exist, "
269+
"automatic instrumentation is disabled for this library" % contrib
278270
)
279271
modules_to_patch = _MODULES_FOR_CONTRIB.get(contrib, (contrib,))
280272
for module in modules_to_patch:
281273
# Use factory to create handler to close over `module` and `raise_errors` values from this loop
282274
when_imported(module)(
283-
_on_import_factory(contrib, raise_errors=raise_errors, patch_indicator=patch_indicator)
275+
_on_import_factory(
276+
contrib,
277+
"ddtrace.contrib.internal.%s.patch",
278+
raise_errors=raise_errors,
279+
patch_indicator=patch_indicator,
280+
)
284281
)
285282

286283
# manually add module to patched modules

ddtrace/appsec/_iast/_patch_modules.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@ def patch_iast(patch_modules=IAST_PATCH):
1919
from ddtrace._monkey import _on_import_factory
2020

2121
for module in (m for m, e in patch_modules.items() if e):
22-
when_imported("hashlib")(
23-
_on_import_factory(module, prefix="ddtrace.appsec._iast.taint_sinks", raise_errors=False)
24-
)
22+
when_imported("hashlib")(_on_import_factory(module, "ddtrace.appsec._iast.taint_sinks.%s", raise_errors=False))
2523

26-
when_imported("json")(
27-
_on_import_factory("json_tainting", prefix="ddtrace.appsec._iast._patches", raise_errors=False)
28-
)
24+
when_imported("json")(_on_import_factory("json_tainting", "ddtrace.appsec._iast._patches.%s", raise_errors=False))

ddtrace/contrib/cherrypy/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ def index(self):
5454
"""
5555

5656

57-
from ddtrace.contrib.internal.cherrypy.middleware import TraceMiddleware
58-
from ddtrace.contrib.internal.cherrypy.middleware import get_version # noqa: F401
57+
from ddtrace.contrib.internal.cherrypy.patch import TraceMiddleware
58+
from ddtrace.contrib.internal.cherrypy.patch import get_version # noqa: F401
5959
from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning
6060
from ddtrace.vendor.debtcollector import deprecate
6161

ddtrace/contrib/flask_cache/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ def counter():
4545
"""
4646

4747

48-
from ddtrace.contrib.internal.flask_cache.tracers import get_traced_cache
49-
from ddtrace.contrib.internal.flask_cache.tracers import get_version # noqa: F401
48+
from ddtrace.contrib.internal.flask_cache.patch import get_traced_cache
49+
from ddtrace.contrib.internal.flask_cache.patch import get_version # noqa: F401
5050
from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning
5151
from ddtrace.vendor.debtcollector import deprecate
5252

ddtrace/contrib/internal/aioredis/patch.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
from ddtrace.constants import _SPAN_MEASURED_KEY
1313
from ddtrace.constants import SPAN_KIND
1414
from ddtrace.contrib import trace_utils
15+
from ddtrace.contrib.internal.redis_utils import ROW_RETURNING_COMMANDS
1516
from ddtrace.contrib.internal.redis_utils import _run_redis_command_async
16-
from ddtrace.contrib.redis_utils import ROW_RETURNING_COMMANDS
17-
from ddtrace.contrib.redis_utils import determine_row_count
17+
from ddtrace.contrib.internal.redis_utils import determine_row_count
1818
from ddtrace.ext import SpanKind
1919
from ddtrace.ext import SpanTypes
2020
from ddtrace.ext import db
Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,2 @@
1-
from ddtrace.internal.utils.deprecations import DDTraceDeprecationWarning
2-
from ddtrace.vendor.debtcollector import deprecate
3-
41
from .session import patch # noqa: F401
52
from .session import unpatch # noqa: F401
6-
7-
8-
deprecate(
9-
("%s is deprecated" % (__name__)),
10-
message="Avoid using this package directly. "
11-
"Use ``import ddtrace.auto`` or the ``ddtrace-run`` command to enable and configure this integration.",
12-
category=DDTraceDeprecationWarning,
13-
removal_version="3.0.0",
14-
)

ddtrace/contrib/internal/fastapi/patch.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from ddtrace.contrib.internal.asgi.middleware import TraceMiddleware
1111
from ddtrace.contrib.internal.starlette.patch import _trace_background_tasks
1212
from ddtrace.contrib.internal.starlette.patch import traced_handler
13-
from ddtrace.contrib.starlette.patch import traced_route_init
13+
from ddtrace.contrib.internal.starlette.patch import traced_route_init
1414
from ddtrace.internal.logger import get_logger
1515
from ddtrace.internal.schema import schematize_service_name
1616
from ddtrace.internal.utils.wrappers import unwrap as _u

ddtrace/contrib/internal/pytest/_plugin_v2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
from ddtrace import DDTraceDeprecationWarning
88
from ddtrace import config as dd_config
99
from ddtrace._monkey import patch
10-
from ddtrace.contrib.coverage import patch as patch_coverage
1110
from ddtrace.contrib.internal.coverage.constants import PCT_COVERED_KEY
1211
from ddtrace.contrib.internal.coverage.data import _coverage_data
12+
from ddtrace.contrib.internal.coverage.patch import patch as patch_coverage
1313
from ddtrace.contrib.internal.coverage.patch import run_coverage_report
1414
from ddtrace.contrib.internal.coverage.utils import _is_coverage_invoked_by_coverage_run
1515
from ddtrace.contrib.internal.coverage.utils import _is_coverage_patched

0 commit comments

Comments
 (0)