about summary refs log tree commit diff
path: root/.venv/lib/python3.12/site-packages/azure/core/tracing/common.py
diff options
context:
space:
mode:
authorS. Solomon Darnell2025-03-28 21:52:21 -0500
committerS. Solomon Darnell2025-03-28 21:52:21 -0500
commit4a52a71956a8d46fcb7294ac71734504bb09bcc2 (patch)
treeee3dc5af3b6313e921cd920906356f5d4febc4ed /.venv/lib/python3.12/site-packages/azure/core/tracing/common.py
parentcc961e04ba734dd72309fb548a2f97d67d578813 (diff)
downloadgn-ai-master.tar.gz
two version of R2R are here HEAD master
Diffstat (limited to '.venv/lib/python3.12/site-packages/azure/core/tracing/common.py')
-rw-r--r--.venv/lib/python3.12/site-packages/azure/core/tracing/common.py108
1 files changed, 108 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/azure/core/tracing/common.py b/.venv/lib/python3.12/site-packages/azure/core/tracing/common.py
new file mode 100644
index 00000000..a74d67df
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/azure/core/tracing/common.py
@@ -0,0 +1,108 @@
+# --------------------------------------------------------------------------
+#
+# Copyright (c) Microsoft Corporation. All rights reserved.
+#
+# The MIT License (MIT)
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the ""Software""), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+# --------------------------------------------------------------------------
+"""Common functions shared by both the sync and the async decorators."""
+from contextlib import contextmanager
+from typing import Any, Optional, Callable, Type, Generator
+import warnings
+
+from ._abstract_span import AbstractSpan
+from ..settings import settings
+
+
+__all__ = [
+    "change_context",
+    "with_current_context",
+]
+
+
+def get_function_and_class_name(func: Callable, *args: object) -> str:
+    """
+    Given a function and its unamed arguments, returns class_name.function_name. It assumes the first argument
+    is `self`. If there are no arguments then it only returns the function name.
+
+    :param func: the function passed in
+    :type func: callable
+    :param args: List of arguments passed into the function
+    :type args: list
+    :return: The function name with the class name
+    :rtype: str
+    """
+    try:
+        return func.__qualname__
+    except AttributeError:
+        if args:
+            return "{}.{}".format(args[0].__class__.__name__, func.__name__)
+        return func.__name__
+
+
+@contextmanager
+def change_context(span: Optional[AbstractSpan]) -> Generator:
+    """Execute this block inside the given context and restore it afterwards.
+
+    This does not start and ends the span, but just make sure all code is executed within
+    that span.
+
+    If span is None, no-op.
+
+    :param span: A span
+    :type span: AbstractSpan
+    :rtype: contextmanager
+    :return: A context manager that will run the given span in the new context
+    """
+    span_impl_type: Optional[Type[AbstractSpan]] = settings.tracing_implementation()
+    if span_impl_type is None or span is None:
+        yield
+    else:
+        try:
+            with span_impl_type.change_context(span):
+                yield
+        except AttributeError:
+            # This plugin does not support "change_context"
+            warnings.warn(
+                'Your tracing plugin should be updated to support "change_context"',
+                DeprecationWarning,
+            )
+            original_span = span_impl_type.get_current_span()
+            try:
+                span_impl_type.set_current_span(span)
+                yield
+            finally:
+                span_impl_type.set_current_span(original_span)
+
+
+def with_current_context(func: Callable) -> Any:
+    """Passes the current spans to the new context the function will be run in.
+
+    :param func: The function that will be run in the new context
+    :type func: callable
+    :return: The func wrapped with correct context
+    :rtype: callable
+    """
+    span_impl_type: Optional[Type[AbstractSpan]] = settings.tracing_implementation()
+    if span_impl_type is None:
+        return func
+
+    return span_impl_type.with_current_context(func)