| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- """
- 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")
|