""" Patch for OpenTelemetry context detach method to handle None tokens gracefully. This patch addresses the issue where OpenTelemetry's context.detach() method raises a TypeError when called with a None token. The error occurs in the contextvars_context.py file where it tries to call reset() on a None token. Related GitHub issue: https://github.com/langgenius/dify/issues/18496 Error being fixed: ``` Traceback (most recent call last): File "opentelemetry/context/__init__.py", line 154, in detach _RUNTIME_CONTEXT.detach(token) File "opentelemetry/context/contextvars_context.py", line 50, in detach self._current_context.reset(token) # type: ignore ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: expected an instance of Token, got None ``` Instead of modifying the third-party package directly, this patch monkey-patches the context.detach method to gracefully handle None tokens. """ import logging from functools import wraps from opentelemetry import context logger = logging.getLogger(__name__) # Store the original detach method original_detach = context.detach # Create a patched version that handles None tokens @wraps(original_detach) def patched_detach(token): """ A patched version of context.detach that handles None tokens gracefully. """ if token is None: logger.debug("Attempted to detach a None token, skipping") return return original_detach(token) def is_enabled(): """ Check if the extension is enabled. Always enable this patch to prevent errors even when OpenTelemetry is disabled. """ return True def init_app(app): """ Initialize the OpenTelemetry context patch. """ # Replace the original detach method with our patched version context.detach = patched_detach logger.info("OpenTelemetry context.detach patched to handle None tokens")