| import inspect |
| import warnings |
| from contextlib import contextmanager |
|
|
| from sentry_sdk import tracing_utils, Client |
| from sentry_sdk._init_implementation import init |
| from sentry_sdk.consts import INSTRUMENTER |
| from sentry_sdk.scope import Scope, _ScopeManager, new_scope, isolation_scope |
| from sentry_sdk.tracing import NoOpSpan, Transaction, trace |
| from sentry_sdk.crons import monitor |
|
|
| from typing import TYPE_CHECKING |
|
|
| if TYPE_CHECKING: |
| from collections.abc import Mapping |
|
|
| from typing import Any |
| from typing import Dict |
| from typing import Generator |
| from typing import Optional |
| from typing import overload |
| from typing import Callable |
| from typing import TypeVar |
| from typing import ContextManager |
| from typing import Union |
|
|
| from typing_extensions import Unpack |
|
|
| from sentry_sdk.client import BaseClient |
| from sentry_sdk._types import ( |
| Event, |
| Hint, |
| Breadcrumb, |
| BreadcrumbHint, |
| ExcInfo, |
| MeasurementUnit, |
| LogLevelStr, |
| SamplingContext, |
| ) |
| from sentry_sdk.tracing import Span, TransactionKwargs |
|
|
| T = TypeVar("T") |
| F = TypeVar("F", bound=Callable[..., Any]) |
| else: |
|
|
| def overload(x): |
| |
| return x |
|
|
|
|
| |
| __all__ = [ |
| "init", |
| "add_breadcrumb", |
| "capture_event", |
| "capture_exception", |
| "capture_message", |
| "configure_scope", |
| "continue_trace", |
| "flush", |
| "get_baggage", |
| "get_client", |
| "get_global_scope", |
| "get_isolation_scope", |
| "get_current_scope", |
| "get_current_span", |
| "get_traceparent", |
| "is_initialized", |
| "isolation_scope", |
| "last_event_id", |
| "new_scope", |
| "push_scope", |
| "set_context", |
| "set_extra", |
| "set_level", |
| "set_measurement", |
| "set_tag", |
| "set_tags", |
| "set_user", |
| "start_span", |
| "start_transaction", |
| "trace", |
| "monitor", |
| ] |
|
|
|
|
| def scopemethod(f): |
| |
| f.__doc__ = "%s\n\n%s" % ( |
| "Alias for :py:meth:`sentry_sdk.Scope.%s`" % f.__name__, |
| inspect.getdoc(getattr(Scope, f.__name__)), |
| ) |
| return f |
|
|
|
|
| def clientmethod(f): |
| |
| f.__doc__ = "%s\n\n%s" % ( |
| "Alias for :py:meth:`sentry_sdk.Client.%s`" % f.__name__, |
| inspect.getdoc(getattr(Client, f.__name__)), |
| ) |
| return f |
|
|
|
|
| @scopemethod |
| def get_client(): |
| |
| return Scope.get_client() |
|
|
|
|
| def is_initialized(): |
| |
| """ |
| .. versionadded:: 2.0.0 |
| |
| Returns whether Sentry has been initialized or not. |
| |
| If a client is available and the client is active |
| (meaning it is configured to send data) then |
| Sentry is initialized. |
| """ |
| return get_client().is_active() |
|
|
|
|
| @scopemethod |
| def get_global_scope(): |
| |
| return Scope.get_global_scope() |
|
|
|
|
| @scopemethod |
| def get_isolation_scope(): |
| |
| return Scope.get_isolation_scope() |
|
|
|
|
| @scopemethod |
| def get_current_scope(): |
| |
| return Scope.get_current_scope() |
|
|
|
|
| @scopemethod |
| def last_event_id(): |
| |
| """ |
| See :py:meth:`sentry_sdk.Scope.last_event_id` documentation regarding |
| this method's limitations. |
| """ |
| return Scope.last_event_id() |
|
|
|
|
| @scopemethod |
| def capture_event( |
| event, |
| hint=None, |
| scope=None, |
| **scope_kwargs, |
| ): |
| |
| return get_current_scope().capture_event(event, hint, scope=scope, **scope_kwargs) |
|
|
|
|
| @scopemethod |
| def capture_message( |
| message, |
| level=None, |
| scope=None, |
| **scope_kwargs, |
| ): |
| |
| return get_current_scope().capture_message( |
| message, level, scope=scope, **scope_kwargs |
| ) |
|
|
|
|
| @scopemethod |
| def capture_exception( |
| error=None, |
| scope=None, |
| **scope_kwargs, |
| ): |
| |
| return get_current_scope().capture_exception(error, scope=scope, **scope_kwargs) |
|
|
|
|
| @scopemethod |
| def add_breadcrumb( |
| crumb=None, |
| hint=None, |
| **kwargs, |
| ): |
| |
| return get_isolation_scope().add_breadcrumb(crumb, hint, **kwargs) |
|
|
|
|
| @overload |
| def configure_scope(): |
| |
| pass |
|
|
|
|
| @overload |
| def configure_scope( |
| callback, |
| ): |
| |
| pass |
|
|
|
|
| def configure_scope( |
| callback=None, |
| ): |
| |
| """ |
| Reconfigures the scope. |
| |
| :param callback: If provided, call the callback with the current scope. |
| |
| :returns: If no callback is provided, returns a context manager that returns the scope. |
| """ |
| warnings.warn( |
| "sentry_sdk.configure_scope is deprecated and will be removed in the next major version. " |
| "Please consult our migration guide to learn how to migrate to the new API: " |
| "https://docs.sentry.io/platforms/python/migration/1.x-to-2.x#scope-configuring", |
| DeprecationWarning, |
| stacklevel=2, |
| ) |
|
|
| scope = get_isolation_scope() |
| scope.generate_propagation_context() |
|
|
| if callback is not None: |
| |
| callback(scope) |
|
|
| return None |
|
|
| @contextmanager |
| def inner(): |
| |
| yield scope |
|
|
| return inner() |
|
|
|
|
| @overload |
| def push_scope(): |
| |
| pass |
|
|
|
|
| @overload |
| def push_scope( |
| callback, |
| ): |
| |
| pass |
|
|
|
|
| def push_scope( |
| callback=None, |
| ): |
| |
| """ |
| Pushes a new layer on the scope stack. |
| |
| :param callback: If provided, this method pushes a scope, calls |
| `callback`, and pops the scope again. |
| |
| :returns: If no `callback` is provided, a context manager that should |
| be used to pop the scope again. |
| """ |
| warnings.warn( |
| "sentry_sdk.push_scope is deprecated and will be removed in the next major version. " |
| "Please consult our migration guide to learn how to migrate to the new API: " |
| "https://docs.sentry.io/platforms/python/migration/1.x-to-2.x#scope-pushing", |
| DeprecationWarning, |
| stacklevel=2, |
| ) |
|
|
| if callback is not None: |
| with warnings.catch_warnings(): |
| warnings.simplefilter("ignore", DeprecationWarning) |
| with push_scope() as scope: |
| callback(scope) |
| return None |
|
|
| return _ScopeManager() |
|
|
|
|
| @scopemethod |
| def set_tag(key, value): |
| |
| return get_isolation_scope().set_tag(key, value) |
|
|
|
|
| @scopemethod |
| def set_tags(tags): |
| |
| return get_isolation_scope().set_tags(tags) |
|
|
|
|
| @scopemethod |
| def set_context(key, value): |
| |
| return get_isolation_scope().set_context(key, value) |
|
|
|
|
| @scopemethod |
| def set_extra(key, value): |
| |
| return get_isolation_scope().set_extra(key, value) |
|
|
|
|
| @scopemethod |
| def set_user(value): |
| |
| return get_isolation_scope().set_user(value) |
|
|
|
|
| @scopemethod |
| def set_level(value): |
| |
| return get_isolation_scope().set_level(value) |
|
|
|
|
| @clientmethod |
| def flush( |
| timeout=None, |
| callback=None, |
| ): |
| |
| return get_client().flush(timeout=timeout, callback=callback) |
|
|
|
|
| @scopemethod |
| def start_span( |
| **kwargs, |
| ): |
| |
| return get_current_scope().start_span(**kwargs) |
|
|
|
|
| @scopemethod |
| def start_transaction( |
| transaction=None, |
| instrumenter=INSTRUMENTER.SENTRY, |
| custom_sampling_context=None, |
| **kwargs, |
| ): |
| |
| """ |
| Start and return a transaction on the current scope. |
| |
| Start an existing transaction if given, otherwise create and start a new |
| transaction with kwargs. |
| |
| This is the entry point to manual tracing instrumentation. |
| |
| A tree structure can be built by adding child spans to the transaction, |
| and child spans to other spans. To start a new child span within the |
| transaction or any span, call the respective `.start_child()` method. |
| |
| Every child span must be finished before the transaction is finished, |
| otherwise the unfinished spans are discarded. |
| |
| When used as context managers, spans and transactions are automatically |
| finished at the end of the `with` block. If not using context managers, |
| call the `.finish()` method. |
| |
| When the transaction is finished, it will be sent to Sentry with all its |
| finished child spans. |
| |
| :param transaction: The transaction to start. If omitted, we create and |
| start a new transaction. |
| :param instrumenter: This parameter is meant for internal use only. It |
| will be removed in the next major version. |
| :param custom_sampling_context: The transaction's custom sampling context. |
| :param kwargs: Optional keyword arguments to be passed to the Transaction |
| constructor. See :py:class:`sentry_sdk.tracing.Transaction` for |
| available arguments. |
| """ |
| return get_current_scope().start_transaction( |
| transaction, instrumenter, custom_sampling_context, **kwargs |
| ) |
|
|
|
|
| def set_measurement(name, value, unit=""): |
| |
| transaction = get_current_scope().transaction |
| if transaction is not None: |
| transaction.set_measurement(name, value, unit) |
|
|
|
|
| def get_current_span(scope=None): |
| |
| """ |
| Returns the currently active span if there is one running, otherwise `None` |
| """ |
| return tracing_utils.get_current_span(scope) |
|
|
|
|
| def get_traceparent(): |
| |
| """ |
| Returns the traceparent either from the active span or from the scope. |
| """ |
| return get_current_scope().get_traceparent() |
|
|
|
|
| def get_baggage(): |
| |
| """ |
| Returns Baggage either from the active span or from the scope. |
| """ |
| baggage = get_current_scope().get_baggage() |
| if baggage is not None: |
| return baggage.serialize() |
|
|
| return None |
|
|
|
|
| def continue_trace( |
| environ_or_headers, op=None, name=None, source=None, origin="manual" |
| ): |
| |
| """ |
| Sets the propagation context from environment or headers and returns a transaction. |
| """ |
| return get_isolation_scope().continue_trace( |
| environ_or_headers, op, name, source, origin |
| ) |
|
|