- Notifications
You must be signed in to change notification settings - Fork 569
ref(am): Introduce start_transaction #715
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
2e37add 2756487 153b5a9 bdfc417 7ce76f0 a488d1e dc8ffc3 80275ef 63a4681 e8349ea 5036f28 429c842 af2b1e3 986c9f1 a32e2d0 a845863 File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| | @@ -8,7 +8,7 @@ | |
| from sentry_sdk._compat import with_metaclass | ||
| from sentry_sdk.scope import Scope | ||
| from sentry_sdk.client import Client | ||
| from sentry_sdk.tracing import Span | ||
| from sentry_sdk.tracing import Span, Transaction | ||
| from sentry_sdk.sessions import Session | ||
| from sentry_sdk.utils import ( | ||
| exc_info_from_error, | ||
| | @@ -445,10 +445,9 @@ def start_span( | |
| span, if any. The return value is the span object that can | ||
| be used as a context manager to start and stop timing. | ||
| | ||
| Note that you will not see any span that is not contained | ||
| within a transaction. Create a transaction with | ||
| ``start_span(transaction="my transaction")`` if an | ||
| integration doesn't already do this for you. | ||
| Note that you will not see any span that is not contained within a | ||
| transaction. Most integrations already do this for you, but create a | ||
| transaction with `start_transaction` otherwise. | ||
| """ | ||
| | ||
| client, scope = self._stack[-1] | ||
| | @@ -462,17 +461,56 @@ def start_span( | |
| else: | ||
| span = Span(**kwargs) | ||
| | ||
| if span.sampled is None and span.transaction is not None: | ||
| elif isinstance(span, Transaction): | ||
| raise ValueError("Pass transactions to start_transaction instead") | ||
| Contributor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In JS there is a fallback that calls | ||
| | ||
| return span | ||
| | ||
| def start_transaction( | ||
| self, | ||
| span_or_name=None, # type: Optional[Union[Span, str]] | ||
rhcarvalho marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
| **kwargs # type: Any | ||
| ): | ||
| # type: (...) -> Transaction | ||
| """ | ||
| Create a new transaction detached from the current span. The return | ||
| value is the `Transaction` object which for the most part works like a | ||
| span. | ||
| ||
| """ | ||
| | ||
| kwargs.setdefault("hub", self) | ||
| | ||
| if isinstance(span_or_name, str): | ||
| if "name" in kwargs: | ||
| raise ValueError("Cannot specify transaction name twice.") | ||
| kwargs["name"] = span_or_name | ||
| transaction = Transaction(**kwargs) | ||
| | ||
| elif span_or_name is None and "name" in kwargs: | ||
| transaction = Transaction(**kwargs) | ||
| | ||
| elif isinstance(span_or_name, Transaction): | ||
| transaction = span_or_name | ||
rhcarvalho marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
| | ||
| elif span_or_name is None and "span" in kwargs: | ||
| transaction = kwargs.pop("span") | ||
rhcarvalho marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
| | ||
| else: | ||
| raise ValueError("transaction object or name required.") | ||
| | ||
| client, scope = self._stack[-1] | ||
| | ||
| if transaction.sampled is None: | ||
| sample_rate = client and client.options["traces_sample_rate"] or 0 | ||
| span.sampled = random.random() < sample_rate | ||
| transaction.sampled = random.random() < sample_rate | ||
rhcarvalho marked this conversation as resolved. Show resolved Hide resolved | ||
| | ||
| if span.sampled: | ||
| if transaction.sampled: | ||
| max_spans = ( | ||
| client and client.options["_experiments"].get("max_spans") or 1000 | ||
| ) | ||
| span.init_finished_spans(maxlen=max_spans) | ||
| transaction.init_span_recorder(maxlen=max_spans) | ||
| | ||
| return span | ||
| return transaction | ||
| | ||
| @overload # noqa | ||
| def push_scope( | ||
| | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| | @@ -4,7 +4,7 @@ | |
| | ||
| from sentry_sdk.hub import Hub | ||
| from sentry_sdk.utils import capture_internal_exceptions, event_from_exception | ||
| from sentry_sdk.tracing import Span | ||
| from sentry_sdk.tracing import Transaction | ||
| from sentry_sdk._compat import reraise | ||
| from sentry_sdk.integrations import Integration, DidNotEnable | ||
| from sentry_sdk.integrations.logging import ignore_logger | ||
| | @@ -130,19 +130,21 @@ def _inner(*args, **kwargs): | |
| scope.clear_breadcrumbs() | ||
| scope.add_event_processor(_make_event_processor(task, *args, **kwargs)) | ||
| | ||
| span = Span.continue_from_headers(args[3].get("headers") or {}) | ||
| span.op = "celery.task" | ||
| span.transaction = "unknown celery task" | ||
| span = Transaction.continue_from_headers( | ||
rhcarvalho marked this conversation as resolved. Outdated Show resolved Hide resolved | ||
| args[3].get("headers") or {}, | ||
| Contributor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see this was already there. What is | ||
| op="celery.task", | ||
| name="unknown celery task", | ||
| ) | ||
| | ||
| # Could possibly use a better hook than this one | ||
| span.set_status("ok") | ||
| | ||
| with capture_internal_exceptions(): | ||
| # Celery task objects are not a thing to be trusted. Even | ||
| # something such as attribute access can fail. | ||
| span.transaction = task.name | ||
| span.name = task.name | ||
| | ||
| with hub.start_span(span): | ||
| with hub.start_transaction(span): | ||
| return f(*args, **kwargs) | ||
| | ||
| return _inner # type: ignore | ||
| | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| | @@ -5,6 +5,7 @@ | |
| from sentry_sdk._functools import wraps | ||
| from sentry_sdk._types import MYPY | ||
| from sentry_sdk.utils import logger, capture_internal_exceptions | ||
| from sentry_sdk.tracing import Transaction | ||
| | ||
| if MYPY: | ||
| from typing import Any | ||
| | @@ -140,8 +141,8 @@ def transaction(self, value): | |
| """When set this forces a specific transaction name to be set.""" | ||
| self._transaction = value | ||
| span = self._span | ||
| if span: | ||
| span.transaction = value | ||
| if span and isinstance(span, Transaction) and value: | ||
| span.name = value | ||
| Comment on lines +144 to +145 Contributor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would it make sense to store the whole transaction in Code reading it that expects a string (e.g. to set Contributor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The current state at JS is that we have a single slot for a "span" that can be a transaction or a span. Let's leave this for later. | ||
| | ||
| @_attr_setter | ||
| def user(self, value): | ||
| | @@ -166,8 +167,8 @@ def span(self): | |
| def span(self, span): | ||
| # type: (Optional[Span]) -> None | ||
| self._span = span | ||
| if span is not None: | ||
| span_transaction = span.transaction | ||
| if isinstance(span, Transaction): | ||
| span_transaction = span.name | ||
| if span_transaction: | ||
| self._transaction = span_transaction | ||
| | ||
| | ||
Uh oh!
There was an error while loading. Please reload this page.