diff --git a/packages/runtime-sdk/src/_workers_sdk_entropy_import_context.py b/packages/runtime-sdk/src/_workers_sdk_entropy_import_context.py index fc4f84c1..acece4cd 100644 --- a/packages/runtime-sdk/src/_workers_sdk_entropy_import_context.py +++ b/packages/runtime-sdk/src/_workers_sdk_entropy_import_context.py @@ -4,6 +4,7 @@ import sys from contextlib import contextmanager +from importlib.metadata import PackageNotFoundError, version from _cloudflare.allow_entropy import ( allow_bad_entropy_calls, @@ -17,6 +18,29 @@ ) +@contextmanager +def allow_bad_entropy_calls_for_version( + package_name: str, + num_calls: int, + min_version: tuple[int, ...], + max_version: tuple[int, ...] | None = None, +): + try: + package_version = tuple(map(int, version(package_name).split("."))) + except PackageNotFoundError: + yield + return + + if package_version < min_version or ( + max_version is not None and package_version > max_version + ): + yield + return + + with allow_bad_entropy_calls(num_calls): + yield + + class STATE: imported_rust_package = False numpy_random = None @@ -180,6 +204,30 @@ def langchain_openai_chat_models_base_context(module): yield +@register_exec_patch("opentelemetry.context") +@contextmanager +def opentelemetry_context(module): + # OpenTelemetry creates three UUID-backed keys. + with allow_bad_entropy_calls_for_version("opentelemetry-api", 3, (1, 40, 0)): + yield + + +@register_exec_patch("opentelemetry.trace.propagation") +@contextmanager +def opentelemetry_trace_propagation_context(module): + # OpenTelemetry creates a UUID-backed key. + with allow_bad_entropy_calls(1): + yield + + +@register_exec_patch("opentelemetry.baggage") +@contextmanager +def opentelemetry_baggage_context(module): + # OpenTelemetry creates a UUID-backed key. + with allow_bad_entropy_calls(1): + yield + + @register_exec_patch("litestar.openapi.controller") @register_exec_patch("litestar.constants") @contextmanager diff --git a/packages/runtime-sdk/tests/test_in_workerd.py b/packages/runtime-sdk/tests/test_in_workerd.py index 0b45f58a..cbfce3b7 100644 --- a/packages/runtime-sdk/tests/test_in_workerd.py +++ b/packages/runtime-sdk/tests/test_in_workerd.py @@ -103,11 +103,6 @@ def test_in_workerd( # noqa: PLR0913, PLR0917 (too-many-arguments) "wsgi requires pyodide.ffi.run_sync (JSPI), unavailable before 2026-01-01" ) - if test_dir.name == "entropy-patches" and python_version == "3.14": - pytest.skip( - "TODO: enable me after https://github.com/cloudflare/workerd/pull/7200 lands in wrangler" - ) - if test_dir.name == "http-client" and python_version < "3.14": pytest.skip("HTTP client compatibility tests require Python 3.14 or newer") diff --git a/packages/runtime-sdk/tests/workerd-test/entropy-patches/pyproject.toml b/packages/runtime-sdk/tests/workerd-test/entropy-patches/pyproject.toml index 90a8b3d9..ff72ddb6 100644 --- a/packages/runtime-sdk/tests/workerd-test/entropy-patches/pyproject.toml +++ b/packages/runtime-sdk/tests/workerd-test/entropy-patches/pyproject.toml @@ -18,4 +18,6 @@ dependencies = [ # "langchain-openai", # "openai", "litestar", + "opentelemetry-api", + "mcp; python_version >= '3.14'", ] diff --git a/packages/runtime-sdk/tests/workerd-test/entropy-patches/tests/test_mcp.py b/packages/runtime-sdk/tests/workerd-test/entropy-patches/tests/test_mcp.py new file mode 100644 index 00000000..69f5c106 --- /dev/null +++ b/packages/runtime-sdk/tests/workerd-test/entropy-patches/tests/test_mcp.py @@ -0,0 +1,10 @@ +# ruff: noqa: F401 +import sys + +if sys.version_info >= (3, 14): + import mcp + + +def test_import(): + # make sure this file is collected by pytest + pass diff --git a/packages/runtime-sdk/tests/workerd-test/entropy-patches/tests/test_opentelemetry.py b/packages/runtime-sdk/tests/workerd-test/entropy-patches/tests/test_opentelemetry.py new file mode 100644 index 00000000..99cd0ea1 --- /dev/null +++ b/packages/runtime-sdk/tests/workerd-test/entropy-patches/tests/test_opentelemetry.py @@ -0,0 +1,8 @@ +# ruff: noqa: F401 +import opentelemetry.context +import opentelemetry.trace + + +def test_import(): + # make sure this file is collected by pytest + pass diff --git a/packages/runtime-sdk/tests/workerd-test/entropy-patches/worker.py b/packages/runtime-sdk/tests/workerd-test/entropy-patches/worker.py index 9673e784..3b3d41d7 100644 --- a/packages/runtime-sdk/tests/workerd-test/entropy-patches/worker.py +++ b/packages/runtime-sdk/tests/workerd-test/entropy-patches/worker.py @@ -4,7 +4,9 @@ test_aiohttp_websocket, test_langsmith, test_litestar, + test_mcp, test_numpy, + test_opentelemetry, test_pydantic, test_rust_packages, test_ssl_avoidance,