diff --git a/.github/workflows/test_frameworks.yml b/.github/workflows/test_frameworks.yml index 809dee38234..2e1502b4d3d 100644 --- a/.github/workflows/test_frameworks.yml +++ b/.github/workflows/test_frameworks.yml @@ -111,68 +111,6 @@ jobs: if: needs.needs-run.outputs.outcome == 'success' run: cat debugger-expl.txt - sanic-testsuite: - strategy: - matrix: - include: - # TODO: profiling fails with a timeout error - #- suffix: Profiling - # profiling: 1 - # iast: 0 - # appsec: 0 - - suffix: IAST - profiling: 0 - iast: 1 - appsec: 0 - - suffix: APPSEC - profiling: 0 - iast: 0 - appsec: 1 - - suffix: Tracer only - profiling: 0 - iast: 0 - appsec: 0 - name: Sanic 24.6 (with ${{ matrix.suffix }}) - runs-on: ubuntu-20.04 - needs: needs-run - timeout-minutes: 15 - env: - DD_PROFILING_ENABLED: ${{ matrix.profiling }} - DD_IAST_ENABLED: ${{ matrix.iast }} - DD_APPSEC_ENABLED: ${{ matrix.appsec }} - DD_TESTING_RAISE: true - CMAKE_BUILD_PARALLEL_LEVEL: 12 - DD_DEBUGGER_EXPL_OUTPUT_FILE: debugger-expl.txt - defaults: - run: - working-directory: sanic - steps: - - uses: actions/checkout@v4 - if: needs.needs-run.outputs.outcome == 'success' - with: - persist-credentials: false - path: ddtrace - - uses: actions/checkout@v4 - if: needs.needs-run.outputs.outcome == 'success' - with: - persist-credentials: false - repository: sanic-org/sanic - ref: v24.6.0 - path: sanic - - uses: actions/setup-python@v5 - if: needs.needs-run.outputs.outcome == 'success' - with: - python-version: "3.11" - - name: Install sanic and dependencies required to run tests - if: needs.needs-run.outputs.outcome == 'success' - run: pip3 install '.[test]' aioquic - - name: Install ddtrace - if: needs.needs-run.outputs.outcome == 'success' - run: pip3 install ../ddtrace - - name: Run tests - if: needs.needs-run.outputs.outcome == 'success' - run: ddtrace-run pytest -k "not test_reloader and not test_reload_listeners and not test_no_exceptions_when_cancel_pending_request and not test_add_signal and not test_ode_removes and not test_skip_touchup and not test_dispatch_signal_triggers and not test_keep_alive_connection_context and not test_redirect_with_params and not test_keep_alive_client_timeout and not test_logger_vhosts and not test_ssl_in_multiprocess_mode" - django-testsuite: strategy: matrix: @@ -963,58 +901,3 @@ jobs: - name: Debugger exploration results if: needs.needs-run.outputs.outcome == 'success' run: cat debugger-expl.txt - - beautifulsoup-testsuite-4_12_3: - strategy: - matrix: - include: - # TODO: profiling is disabled due to a bug in the profiler paths - # - suffix: Profiling - # profiling: 1 - # iast: 0 - # appsec: 0 - - suffix: IAST - profiling: 0 - iast: 1 - appsec: 0 - - suffix: APPSEC - profiling: 0 - iast: 0 - appsec: 1 - - suffix: Tracer only - profiling: 0 - iast: 0 - appsec: 0 - name: Beautifulsoup 4.12.3 (with ${{ matrix.suffix }}) - runs-on: "ubuntu-latest" - needs: needs-run - env: - DD_TESTING_RAISE: true - DD_PROFILING_ENABLED: ${{ matrix.profiling }} - DD_IAST_ENABLED: ${{ matrix.iast }} - DD_APPSEC_ENABLED: ${{ matrix.appsec }} - CMAKE_BUILD_PARALLEL_LEVEL: 12 - DD_DEBUGGER_EXPL_OUTPUT_FILE: debugger-expl.txt - steps: - - uses: actions/setup-python@v5 - if: needs.needs-run.outputs.outcome == 'success' - with: - python-version: '3.9' - - uses: actions/checkout@v4 - if: needs.needs-run.outputs.outcome == 'success' - with: - persist-credentials: false - path: ddtrace - - name: Checkout beautifulsoup - if: needs.needs-run.outputs.outcome == 'success' - run: | - git clone -b 4.12.3 https://git.launchpad.net/beautifulsoup - - name: Install ddtrace - if: needs.needs-run.outputs.outcome == 'success' - run: pip3 install ./ddtrace - - name: Pytest fix - if: needs.needs-run.outputs.outcome == 'success' - run: pip install pytest==8.2.1 - - name: Run tests - if: needs.needs-run.outputs.outcome == 'success' - run: cd beautifulsoup && ddtrace-run pytest diff --git a/ddtrace/internal/compat.py b/ddtrace/internal/compat.py index 457618dc393..6ebe450583e 100644 --- a/ddtrace/internal/compat.py +++ b/ddtrace/internal/compat.py @@ -56,32 +56,16 @@ def ensure_text(s, encoding="utf-8", errors="ignore") -> str: if isinstance(s, str): return s - if isinstance(s, bytes): return s.decode(encoding, errors) - - # Skip the check for Mock objects as they are used in tests - from unittest.mock import Mock - - if isinstance(s, Mock): - return str(s) - raise TypeError("Expected str or bytes but received %r" % (s.__class__)) def ensure_binary(s, encoding="utf-8", errors="ignore") -> bytes: if isinstance(s, bytes): return s - - # Skip the check for Mock objects as they are used in tests - from unittest.mock import Mock - - if isinstance(s, Mock): - return bytes(s) - if not isinstance(s, str): raise TypeError("Expected str or bytes but received %r" % (s.__class__)) - return s.encode(encoding, errors) diff --git a/releasenotes/notes/resolves-gevent-asyncio-incompatiblities-246028676b10bea9.yaml b/releasenotes/notes/resolves-gevent-asyncio-incompatiblities-246028676b10bea9.yaml new file mode 100644 index 00000000000..08a5448b3dc --- /dev/null +++ b/releasenotes/notes/resolves-gevent-asyncio-incompatiblities-246028676b10bea9.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + asyncio: Resolves an issue where asyncio event loops fail to register when ``ddtrace-run``/``import ddtrace.auto`` is used and gevent is installed. diff --git a/tests/contrib/asyncio/test_lazyimport.py b/tests/contrib/asyncio/test_lazyimport.py index adca84973db..07c96bc799f 100644 --- a/tests/contrib/asyncio/test_lazyimport.py +++ b/tests/contrib/asyncio/test_lazyimport.py @@ -16,3 +16,16 @@ def test_lazy_import(): assert tracer.context_provider.active() is span span.finish() assert tracer.context_provider.active() is None + + +@pytest.mark.subprocess() +def test_asyncio_not_imported_by_auto_instrumentation(): + # Module unloading is not supported for asyncio, a simple workaround + # is to ensure asyncio is not imported by ddtrace.auto or ddtrace-run. + # If asyncio is imported by ddtrace.auto the asyncio event loop with fail + # to register new loops in some platforms (e.g. Ubuntuu). + import sys + + import ddtrace.auto # noqa: F401 + + assert "asyncio" not in sys.modules