From 28dcc5772df4f451de265a56105d5187bd9eda70 Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Wed, 30 Nov 2022 14:45:22 +0100 Subject: [PATCH 1/2] Add parameter to set and on Span creation or finishing --- sentry_sdk/tracing.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/sentry_sdk/tracing.py b/sentry_sdk/tracing.py index 5b9fbdfd0d..b6b57b1e2a 100644 --- a/sentry_sdk/tracing.py +++ b/sentry_sdk/tracing.py @@ -126,6 +126,7 @@ def __init__( status=None, # type: Optional[str] transaction=None, # type: Optional[str] # deprecated containing_transaction=None, # type: Optional[Transaction] + start_timestamp=None, # type: Optional[datetime] instrumenter=None, # type: Optional[str] ): # type: (...) -> None @@ -141,7 +142,7 @@ def __init__( self._tags = {} # type: Dict[str, str] self._data = {} # type: Dict[str, Any] self._containing_transaction = containing_transaction - self.start_timestamp = datetime.utcnow() + self.start_timestamp = start_timestamp or datetime.utcnow() try: # TODO: For Python 3.7+, we could use a clock with ns resolution: # self._start_timestamp_monotonic = time.perf_counter_ns() @@ -472,8 +473,8 @@ def is_success(self): # type: () -> bool return self.status == "ok" - def finish(self, hub=None): - # type: (Optional[sentry_sdk.Hub]) -> Optional[str] + def finish(self, hub=None, **kwargs): + # type: (Optional[sentry_sdk.Hub], Optional[datetime]) -> Optional[str] # XXX: would be type: (Optional[sentry_sdk.Hub]) -> None, but that leads # to incompatible return types for Span.finish and Transaction.finish. if self.timestamp is not None: @@ -483,8 +484,14 @@ def finish(self, hub=None): hub = hub or self.hub or sentry_sdk.Hub.current try: - duration_seconds = time.perf_counter() - self._start_timestamp_monotonic - self.timestamp = self.start_timestamp + timedelta(seconds=duration_seconds) + end_timestamp = kwargs.get("end_timestamp", None) + if end_timestamp: + self.timestamp = end_timestamp + else: + duration_seconds = time.perf_counter() - self._start_timestamp_monotonic + self.timestamp = self.start_timestamp + timedelta( + seconds=duration_seconds + ) except AttributeError: self.timestamp = datetime.utcnow() @@ -630,8 +637,8 @@ def containing_transaction(self): # reference. return self - def finish(self, hub=None): - # type: (Optional[sentry_sdk.Hub]) -> Optional[str] + def finish(self, hub=None, **kwargs): + # type: (Optional[sentry_sdk.Hub], Optional[datetime]) -> Optional[str] if self.timestamp is not None: # This transaction is already finished, ignore. return None @@ -663,7 +670,7 @@ def finish(self, hub=None): ) self.name = "" - Span.finish(self, hub) + Span.finish(self, hub, **kwargs) if not self.sampled: # At this point a `sampled = None` should have already been resolved From c89fd9be0d80acb22a15743abdb8b7d6dd07068f Mon Sep 17 00:00:00 2001 From: Anton Pirker Date: Wed, 30 Nov 2022 16:38:03 +0100 Subject: [PATCH 2/2] Made end_timestamp parameter explicit --- sentry_sdk/tracing.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/sentry_sdk/tracing.py b/sentry_sdk/tracing.py index b6b57b1e2a..94c5837e43 100644 --- a/sentry_sdk/tracing.py +++ b/sentry_sdk/tracing.py @@ -473,7 +473,7 @@ def is_success(self): # type: () -> bool return self.status == "ok" - def finish(self, hub=None, **kwargs): + def finish(self, hub=None, end_timestamp=None): # type: (Optional[sentry_sdk.Hub], Optional[datetime]) -> Optional[str] # XXX: would be type: (Optional[sentry_sdk.Hub]) -> None, but that leads # to incompatible return types for Span.finish and Transaction.finish. @@ -484,7 +484,6 @@ def finish(self, hub=None, **kwargs): hub = hub or self.hub or sentry_sdk.Hub.current try: - end_timestamp = kwargs.get("end_timestamp", None) if end_timestamp: self.timestamp = end_timestamp else: @@ -637,7 +636,7 @@ def containing_transaction(self): # reference. return self - def finish(self, hub=None, **kwargs): + def finish(self, hub=None, end_timestamp=None): # type: (Optional[sentry_sdk.Hub], Optional[datetime]) -> Optional[str] if self.timestamp is not None: # This transaction is already finished, ignore. @@ -670,7 +669,7 @@ def finish(self, hub=None, **kwargs): ) self.name = "" - Span.finish(self, hub, **kwargs) + Span.finish(self, hub, end_timestamp) if not self.sampled: # At this point a `sampled = None` should have already been resolved @@ -883,8 +882,8 @@ def set_http_status(self, http_status): # type: (Any) -> Any pass - def finish(self, hub=None, **kwargs): - # type: (Any, **Any) -> Any + def finish(self, hub=None, end_timestamp=None): + # type: (Any, Any) -> Any pass