aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/azure/core/tracing/common.py
diff options
context:
space:
mode:
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)