From d9cc74eee1ed0fdc57b46ab4de403476fd188c5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20De=20Ara=C3=BAjo?= Date: Fri, 18 Jul 2025 14:49:28 +0000 Subject: [PATCH 1/5] fix(ci_visibility): ensure test suite span is reactivated when test span finishes --- ddtrace/internal/ci_visibility/api/_base.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ddtrace/internal/ci_visibility/api/_base.py b/ddtrace/internal/ci_visibility/api/_base.py index 6eb5a95e35b..e44be457c57 100644 --- a/ddtrace/internal/ci_visibility/api/_base.py +++ b/ddtrace/internal/ci_visibility/api/_base.py @@ -235,6 +235,10 @@ def _finish_span(self, override_finish_time: Optional[float] = None) -> None: self._add_all_tags_to_span() self._span.finish(finish_time=override_finish_time) + parent_span = self.get_parent_span() + if parent_span: + self._tracer.context_provider.activate(parent_span) + def _set_default_tags(self) -> None: """Applies the tags that should be on every span regardless of the item type From cbac02ef14b319af617383e3d5cc7b39d556d965 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20De=20Ara=C3=BAjo?= Date: Fri, 18 Jul 2025 15:16:37 +0000 Subject: [PATCH 2/5] may the force be with you --- ddtrace/internal/ci_visibility/api/_base.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/ddtrace/internal/ci_visibility/api/_base.py b/ddtrace/internal/ci_visibility/api/_base.py index e44be457c57..e5fc8be02a0 100644 --- a/ddtrace/internal/ci_visibility/api/_base.py +++ b/ddtrace/internal/ci_visibility/api/_base.py @@ -621,18 +621,19 @@ def finish( # Respect override status no matter what self.set_status(override_status) + if force: + # Finish all children regardless of their status + for child in self._children.values(): + if not child.is_finished(): + child.finish(force=force) + self.set_status(self.get_raw_status()) + item_status = self.get_status() if item_status == SPECIAL_STATUS.UNFINISHED: - if force: - # Finish all children regardless of their status - for child in self._children.values(): - if not child.is_finished(): - child.finish(force=force) - self.set_status(self.get_raw_status()) - else: - return - elif not isinstance(item_status, SPECIAL_STATUS): + return + + if not isinstance(item_status, SPECIAL_STATUS): self.set_status(item_status) super().finish(force=force, override_status=override_status, override_finish_time=override_finish_time) From fdd00abf15285380dc219783a08cd3740948ec1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20De=20Ara=C3=BAjo?= Date: Fri, 18 Jul 2025 15:38:05 +0000 Subject: [PATCH 3/5] finish harder --- ddtrace/internal/ci_visibility/api/_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddtrace/internal/ci_visibility/api/_base.py b/ddtrace/internal/ci_visibility/api/_base.py index e5fc8be02a0..a60003c204b 100644 --- a/ddtrace/internal/ci_visibility/api/_base.py +++ b/ddtrace/internal/ci_visibility/api/_base.py @@ -630,7 +630,7 @@ def finish( item_status = self.get_status() - if item_status == SPECIAL_STATUS.UNFINISHED: + if item_status == SPECIAL_STATUS.UNFINISHED and not force: return if not isinstance(item_status, SPECIAL_STATUS): From d89cbe0b9dde4941b256ad6b35d6e74ad4ac40ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20De=20Ara=C3=BAjo?= Date: Mon, 21 Jul 2025 14:34:38 +0000 Subject: [PATCH 4/5] force spans to finish --- ddtrace/internal/ci_visibility/api/_base.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ddtrace/internal/ci_visibility/api/_base.py b/ddtrace/internal/ci_visibility/api/_base.py index a60003c204b..49db9cf120e 100644 --- a/ddtrace/internal/ci_visibility/api/_base.py +++ b/ddtrace/internal/ci_visibility/api/_base.py @@ -233,6 +233,11 @@ def _finish_span(self, override_finish_time: Optional[float] = None) -> None: self._set_span_tags() self._add_all_tags_to_span() + + while (current_span := self._tracer.current_span()) and current_span is not self._span: + # Force nested spans to finish. + current_span.finish(finish_time=override_finish_time) + self._span.finish(finish_time=override_finish_time) parent_span = self.get_parent_span() From bcddbea39136d1fdc3ce033a50dbdc95b04bcdad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20De=20Ara=C3=BAjo?= Date: Mon, 21 Jul 2025 14:46:19 +0000 Subject: [PATCH 5/5] Revert "force spans to finish" This reverts commit d89cbe0b9dde4941b256ad6b35d6e74ad4ac40ad. --- ddtrace/internal/ci_visibility/api/_base.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ddtrace/internal/ci_visibility/api/_base.py b/ddtrace/internal/ci_visibility/api/_base.py index 49db9cf120e..a60003c204b 100644 --- a/ddtrace/internal/ci_visibility/api/_base.py +++ b/ddtrace/internal/ci_visibility/api/_base.py @@ -233,11 +233,6 @@ def _finish_span(self, override_finish_time: Optional[float] = None) -> None: self._set_span_tags() self._add_all_tags_to_span() - - while (current_span := self._tracer.current_span()) and current_span is not self._span: - # Force nested spans to finish. - current_span.finish(finish_time=override_finish_time) - self._span.finish(finish_time=override_finish_time) parent_span = self.get_parent_span()