Skip to content

Commit 3b27258

Browse files
committed
prevent deadlock
1 parent 34db73e commit 3b27258

File tree

3 files changed

+18
-3
lines changed

3 files changed

+18
-3
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111
1212
## Unreleased
1313

14+
### Fixed
15+
16+
- `opentelemetry-instrumentation-richconsole`: Prevent deadlock when parent span is not part of the batch
17+
1418
## Version 1.38.0/0.59b0 (2025-10-16)
1519

1620
### Fixed

exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,14 +173,15 @@ def spans_to_tree(spans: typing.Sequence[ReadableSpan]) -> Dict[str, Tree]:
173173
trees = {}
174174
parents = {}
175175
spans = list(spans)
176+
span_ids = {s.context.span_id for s in spans}
176177
while spans:
177178
for span in spans:
178-
if not span.parent:
179+
if not span.parent or span.parent.span_id not in span_ids:
179180
trace_id = opentelemetry.trace.format_trace_id(
180181
span.context.trace_id
181182
)
182-
trees[trace_id] = Tree(label=f"Trace {trace_id}")
183-
child = trees[trace_id].add(
183+
tree = trees.setdefault(trace_id, Tree(label=f"Trace {trace_id}"))
184+
child = tree.add(
184185
label=Text.from_markup(
185186
f"[blue][{_ns_to_time(span.start_time)}][/blue] [bold]{span.name}[/bold], span {opentelemetry.trace.format_span_id(span.context.span_id)}"
186187
)

exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,13 @@ def test_multiple_traces(tracer_provider):
9696
parent_2.name in child.label
9797
for child in trees[traceid_1].children[0].children
9898
)
99+
100+
def test_no_deadlock(tracer_provider):
101+
# non-regression test for https://github.com/open-telemetry/opentelemetry-python-contrib/issues/3254
102+
103+
tracer = tracer_provider.get_tracer(__name__)
104+
with tracer.start_as_current_span("parent"):
105+
with tracer.start_as_current_span("child") as child:
106+
pass
107+
108+
RichConsoleSpanExporter.spans_to_tree((child,))

0 commit comments

Comments
 (0)