From e97868dc43bed45d29438af5e91b11096f5a7752 Mon Sep 17 00:00:00 2001 From: Gyeongjae Choi Date: Tue, 8 Sep 2026 15:28:31 +0900 Subject: [PATCH 1/3] fix(runtime-sdk): add entropy patch for opentelemetry --- .../src/_workers_sdk_entropy_import_context.py | 8 ++++++++ .../tests/workerd-test/entropy-patches/pyproject.toml | 1 + .../entropy-patches/tests/test_opentelemetry.py | 7 +++++++ .../tests/workerd-test/entropy-patches/worker.py | 1 + 4 files changed, 17 insertions(+) create mode 100644 packages/runtime-sdk/tests/workerd-test/entropy-patches/tests/test_opentelemetry.py 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..b3e22560 100644 --- a/packages/runtime-sdk/src/_workers_sdk_entropy_import_context.py +++ b/packages/runtime-sdk/src/_workers_sdk_entropy_import_context.py @@ -180,6 +180,14 @@ def langchain_openai_chat_models_base_context(module): yield +@register_exec_patch("opentelemetry.context") +@contextmanager +def opentelemetry_context(module): + # OpenTelemetry creates three UUID-backed context keys at import time. + with allow_bad_entropy_calls(3): + yield + + @register_exec_patch("litestar.openapi.controller") @register_exec_patch("litestar.constants") @contextmanager 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..0b09ac02 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,5 @@ dependencies = [ # "langchain-openai", # "openai", "litestar", + "opentelemetry-sdk", ] 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..9ab1eb28 --- /dev/null +++ b/packages/runtime-sdk/tests/workerd-test/entropy-patches/tests/test_opentelemetry.py @@ -0,0 +1,7 @@ +# ruff: noqa: F401 +import opentelemetry.context + + +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..dbb90d72 100644 --- a/packages/runtime-sdk/tests/workerd-test/entropy-patches/worker.py +++ b/packages/runtime-sdk/tests/workerd-test/entropy-patches/worker.py @@ -5,6 +5,7 @@ test_langsmith, test_litestar, test_numpy, + test_opentelemetry, test_pydantic, test_rust_packages, test_ssl_avoidance, From 6a1adf815881152aab3be5ec2030422f46bf4fe4 Mon Sep 17 00:00:00 2001 From: Gyeongjae Choi Date: Tue, 8 Sep 2026 16:25:40 +0900 Subject: [PATCH 2/3] chore: add trace as well --- .../src/_workers_sdk_entropy_import_context.py | 8 ++++++++ .../entropy-patches/tests/test_opentelemetry.py | 1 + 2 files changed, 9 insertions(+) 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 b3e22560..61e648a3 100644 --- a/packages/runtime-sdk/src/_workers_sdk_entropy_import_context.py +++ b/packages/runtime-sdk/src/_workers_sdk_entropy_import_context.py @@ -188,6 +188,14 @@ def opentelemetry_context(module): yield +@register_exec_patch("opentelemetry.trace.propagation") +@contextmanager +def opentelemetry_trace_propagation_context(module): + # OpenTelemetry creates a UUID-backed span key while importing tracing. + 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/workerd-test/entropy-patches/tests/test_opentelemetry.py b/packages/runtime-sdk/tests/workerd-test/entropy-patches/tests/test_opentelemetry.py index 9ab1eb28..99cd0ea1 100644 --- 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 @@ -1,5 +1,6 @@ # ruff: noqa: F401 import opentelemetry.context +import opentelemetry.trace def test_import(): From 0200848b14da7265bef96ef01519b3f9d542774b Mon Sep 17 00:00:00 2001 From: Gyeongjae Choi Date: Thu, 17 Sep 2026 16:57:15 +0900 Subject: [PATCH 3/3] chore: add version-aware entropy patch helper --- .../_workers_sdk_entropy_import_context.py | 38 +++++++++++++++++-- packages/runtime-sdk/tests/test_in_workerd.py | 5 --- .../entropy-patches/pyproject.toml | 3 +- .../entropy-patches/tests/test_mcp.py | 10 +++++ .../workerd-test/entropy-patches/worker.py | 1 + 5 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 packages/runtime-sdk/tests/workerd-test/entropy-patches/tests/test_mcp.py 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 61e648a3..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 @@ -183,15 +207,23 @@ def langchain_openai_chat_models_base_context(module): @register_exec_patch("opentelemetry.context") @contextmanager def opentelemetry_context(module): - # OpenTelemetry creates three UUID-backed context keys at import time. - with allow_bad_entropy_calls(3): + # 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 span key while importing tracing. + # 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 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 0b09ac02..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,5 +18,6 @@ dependencies = [ # "langchain-openai", # "openai", "litestar", - "opentelemetry-sdk", + "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/worker.py b/packages/runtime-sdk/tests/workerd-test/entropy-patches/worker.py index dbb90d72..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,6 +4,7 @@ test_aiohttp_websocket, test_langsmith, test_litestar, + test_mcp, test_numpy, test_opentelemetry, test_pydantic,