From 1b92c00d1472ee3a80bd5ad1d6633472b555b2ac Mon Sep 17 00:00:00 2001 From: Raphael Bizos Date: Fri, 16 Sep 2022 17:46:36 +0200 Subject: [PATCH 01/13] Fixing RichConsoleExporter to allow for multiple traces at once With a batch exporter this would make all span originate with the first trace Also it would print any span twice which would make the output a bit difficult to read --- .../exporter/richconsole/__init__.py | 73 ++++++++++--------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py index 494857bcab..5e4970db17 100644 --- a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py +++ b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py @@ -73,9 +73,7 @@ def _ns_to_time(nanoseconds): def _child_to_tree(child: Tree, span: ReadableSpan): - child.add( - Text.from_markup(f"[bold cyan]Kind :[/bold cyan] {span.kind.name}") - ) + child.add(Text.from_markup(f"[bold cyan]Kind :[/bold cyan] {span.kind.name}")) if not span.status.is_unset: if not span.status.is_ok: child.add( @@ -97,9 +95,7 @@ def _child_to_tree(child: Tree, span: ReadableSpan): ) if span.events: - events = child.add( - label=Text.from_markup("[bold cyan]Events :[/bold cyan] ") - ) + events = child.add(label=Text.from_markup("[bold cyan]Events :[/bold cyan] ")) for event in span.events: event_node = events.add(Text(event.name)) for key, val in event.attributes.items(): @@ -122,6 +118,16 @@ def _child_to_tree(child: Tree, span: ReadableSpan): f"[bold cyan]{attribute} :[/bold cyan] {span.attributes[attribute]}" ) ) + if span.resource: + resources = child.add( + label=Text.from_markup("[bold cyan]Resources :[/bold cyan] ") + ) + for resource in span.resource.attributes: + resources.add( + Text.from_markup( + f"[bold cyan]{resource} :[/bold cyan] {span.resource.attributes[resource]}" + ) + ) class RichConsoleSpanExporter(SpanExporter): @@ -141,35 +147,36 @@ def __init__( def export(self, spans: typing.Sequence[ReadableSpan]) -> SpanExportResult: if not spans: return SpanExportResult.SUCCESS - tree = Tree( - label=f"Trace {opentelemetry.trace.format_trace_id(spans[0].context.trace_id)}" - ) + + trees = dict() + all_parent_ids = {span.context.span_id for span in spans} parents = {} - for span in spans: - child = tree.add( - label=Text.from_markup( - f"[blue][{_ns_to_time(span.start_time)}][/blue] [bold]{span.name}[/bold], span {opentelemetry.trace.format_span_id(span.context.span_id)}" - ) - ) - parents[span.context.span_id] = child - _child_to_tree(child, span) - - for span in spans: - if span.parent and span.parent.span_id in parents: - child = parents[span.parent.span_id].add( - label=Text.from_markup( - f"[blue][{_ns_to_time(span.start_time)}][/blue] [bold]{span.name}[/bold], span {opentelemetry.trace.format_span_id(span.context.span_id)}" + spans = list(spans) + while spans: + for span in spans: + if not span.parent: + trace_id = opentelemetry.trace.format_trace_id( + span.context.trace_id ) - ) - else: - child = tree.add( - label=Text.from_markup( - f"[blue][{_ns_to_time(span.start_time)}][/blue] [bold]{span.name}[/bold], span {opentelemetry.trace.format_span_id(span.context.span_id)}" + trees[trace_id] = Tree(label=f"Trace {trace_id}") + child = trees[trace_id].add( + label=Text.from_markup( + f"[blue][{_ns_to_time(span.start_time)}][/blue] [bold]{span.name}[/bold], span {opentelemetry.trace.format_span_id(span.context.span_id)}" + ) ) - ) - - parents[span.context.span_id] = child - _child_to_tree(child, span) + parents[span.context.span_id] = child + _child_to_tree(child, span) + spans.remove(span) + elif span.parent and span.parent.span_id in parents: + child = parents[span.parent.span_id].add( + label=Text.from_markup( + f"[blue][{_ns_to_time(span.start_time)}][/blue] [bold]{span.name}[/bold], span {opentelemetry.trace.format_span_id(span.context.span_id)}" + ) + ) + parents[span.context.span_id] = child + _child_to_tree(child, span) + spans.remove(span) - self.console.print(tree) + for tree in trees.values(): + self.console.print(tree) return SpanExportResult.SUCCESS From 213e3f17e2e1429af135a26387b0c53c52c029a7 Mon Sep 17 00:00:00 2001 From: rbizos <58781501+rbizos@users.noreply.github.com> Date: Wed, 21 Sep 2022 10:39:00 +0200 Subject: [PATCH 02/13] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c07bbb7444..9516cea7da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,7 +47,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix uninstrumentation of existing app instances in FastAPI ([#1258](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1258)) - Fix uninstrumentation of existing app instances in falcon - ([#1341]https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1341) + ([#1336]https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1336) +- `opentelemetry-exporter-richconsole` Fixing RichConsoleExpoter to allow multiple traces, fixing duplicate spans and include resources ## [1.12.0-0.33b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.12.0-0.33b0) - 2022-08-08 From 732a9790bed6a25eddf46f10e80716e1ca0e9705 Mon Sep 17 00:00:00 2001 From: rbizos <58781501+rbizos@users.noreply.github.com> Date: Wed, 21 Sep 2022 10:40:47 +0200 Subject: [PATCH 03/13] Update CHANGELOG.md --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9516cea7da..6eb0258395 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,9 +46,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#1313](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1313)) - Fix uninstrumentation of existing app instances in FastAPI ([#1258](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1258)) -- Fix uninstrumentation of existing app instances in falcon - ([#1336]https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1336) -- `opentelemetry-exporter-richconsole` Fixing RichConsoleExpoter to allow multiple traces, fixing duplicate spans and include resources +- `opentelemetry-exporter-richconsole` Fixing RichConsoleExpoter to allow multiple traces, fixing duplicate spans and include resources ([#1336](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1336)) ## [1.12.0-0.33b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.12.0-0.33b0) - 2022-08-08 From 030998dd54ef18f1b33eeb2e13bd398742ba31bf Mon Sep 17 00:00:00 2001 From: Raphael Bizos Date: Mon, 26 Sep 2022 17:02:22 +0200 Subject: [PATCH 04/13] adding tests --- .../exporter/richconsole/__init__.py | 13 ++++---- .../tests/test_rich_exporter.py | 30 +++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py index 5e4970db17..9d42785a84 100644 --- a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py +++ b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py @@ -54,7 +54,7 @@ import datetime import typing -from typing import Optional +from typing import Optional, List, Dict from rich.console import Console from rich.syntax import Syntax @@ -148,6 +148,12 @@ def export(self, spans: typing.Sequence[ReadableSpan]) -> SpanExportResult: if not spans: return SpanExportResult.SUCCESS + for tree in self.spans_to_tree(spans): + self.console.print(tree) + + return SpanExportResult.SUCCESS + + def spans_to_tree(self, spans: typing.Sequence[ReadableSpan]) -> Dict[str, Tree]: trees = dict() all_parent_ids = {span.context.span_id for span in spans} parents = {} @@ -176,7 +182,4 @@ def export(self, spans: typing.Sequence[ReadableSpan]) -> SpanExportResult: parents[span.context.span_id] = child _child_to_tree(child, span) spans.remove(span) - - for tree in trees.values(): - self.console.print(tree) - return SpanExportResult.SUCCESS + return trees diff --git a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py index fe897537e7..e6eac1c266 100644 --- a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py +++ b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py @@ -16,7 +16,10 @@ from opentelemetry.exporter.richconsole import RichConsoleSpanExporter from opentelemetry.sdk import trace +from opentelemetry.sdk.trace import ReadableSpan from opentelemetry.sdk.trace.export import BatchSpanProcessor +import opentelemetry.trace +from rich.tree import Tree @pytest.fixture(name="span_processor") @@ -45,3 +48,30 @@ def test_span_exporter(tracer_provider, span_processor, capsys): span_processor.force_flush() captured = capsys.readouterr() assert "V4LuE" in captured.out + + +def walk_tree(root: Tree) -> int: + # counts the amount of spans in a tree that contains a span + return sum([walk_tree(child) for child in root.children]) + int( + "span" in root.label + ) + + +def test_multiple_traces(tracer_provider): + exporter = RichConsoleSpanExporter() + tracer = tracer_provider.get_tracer(__name__) + with tracer.start_as_current_span("parent_1") as parent_1: + with tracer.start_as_current_span("child_1") as child_1: + pass + + with tracer.start_as_current_span("parent_2") as parent_2: + pass + + trees = exporter.spans_to_tree((parent_2, parent_1, child_1)) + # asserts that we have all traces + assert len(trees) == 2 + assert opentelemetry.trace.format_trace_id(parent_1.context.trace_id) in trees + assert opentelemetry.trace.format_trace_id(parent_2.context.trace_id) in trees + + # asserts that we have exactly the number of spans we exported + assert sum([walk_tree(tree) for tree in trees.values()]) == 3 From 92c18a2b108ba537ee7dcaea1cbea2e49ca77823 Mon Sep 17 00:00:00 2001 From: Raphael Bizos Date: Mon, 26 Sep 2022 17:03:35 +0200 Subject: [PATCH 05/13] spans_to_tree to static method --- .../src/opentelemetry/exporter/richconsole/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py index 9d42785a84..5aa916201c 100644 --- a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py +++ b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py @@ -153,6 +153,7 @@ def export(self, spans: typing.Sequence[ReadableSpan]) -> SpanExportResult: return SpanExportResult.SUCCESS + @staticmethod def spans_to_tree(self, spans: typing.Sequence[ReadableSpan]) -> Dict[str, Tree]: trees = dict() all_parent_ids = {span.context.span_id for span in spans} From 4dbd9ca4a34b2ba47ba2f55266ccdb86f60059da Mon Sep 17 00:00:00 2001 From: Raphael Bizos Date: Tue, 27 Sep 2022 10:25:04 +0200 Subject: [PATCH 06/13] fixing format using project config --- .../opentelemetry/exporter/richconsole/__init__.py | 12 +++++++++--- .../tests/test_rich_exporter.py | 8 ++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py index 5aa916201c..19e79ec407 100644 --- a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py +++ b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py @@ -73,7 +73,9 @@ def _ns_to_time(nanoseconds): def _child_to_tree(child: Tree, span: ReadableSpan): - child.add(Text.from_markup(f"[bold cyan]Kind :[/bold cyan] {span.kind.name}")) + child.add( + Text.from_markup(f"[bold cyan]Kind :[/bold cyan] {span.kind.name}") + ) if not span.status.is_unset: if not span.status.is_ok: child.add( @@ -95,7 +97,9 @@ def _child_to_tree(child: Tree, span: ReadableSpan): ) if span.events: - events = child.add(label=Text.from_markup("[bold cyan]Events :[/bold cyan] ")) + events = child.add( + label=Text.from_markup("[bold cyan]Events :[/bold cyan] ") + ) for event in span.events: event_node = events.add(Text(event.name)) for key, val in event.attributes.items(): @@ -154,7 +158,9 @@ def export(self, spans: typing.Sequence[ReadableSpan]) -> SpanExportResult: return SpanExportResult.SUCCESS @staticmethod - def spans_to_tree(self, spans: typing.Sequence[ReadableSpan]) -> Dict[str, Tree]: + def spans_to_tree( + self, spans: typing.Sequence[ReadableSpan] + ) -> Dict[str, Tree]: trees = dict() all_parent_ids = {span.context.span_id for span in spans} parents = {} diff --git a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py index e6eac1c266..a444360802 100644 --- a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py +++ b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py @@ -70,8 +70,12 @@ def test_multiple_traces(tracer_provider): trees = exporter.spans_to_tree((parent_2, parent_1, child_1)) # asserts that we have all traces assert len(trees) == 2 - assert opentelemetry.trace.format_trace_id(parent_1.context.trace_id) in trees - assert opentelemetry.trace.format_trace_id(parent_2.context.trace_id) in trees + assert ( + opentelemetry.trace.format_trace_id(parent_1.context.trace_id) in trees + ) + assert ( + opentelemetry.trace.format_trace_id(parent_2.context.trace_id) in trees + ) # asserts that we have exactly the number of spans we exported assert sum([walk_tree(tree) for tree in trees.values()]) == 3 From c5173feeb1d5b18221524c6276a91cd224263a11 Mon Sep 17 00:00:00 2001 From: Raphael Bizos Date: Tue, 27 Sep 2022 17:44:10 +0200 Subject: [PATCH 07/13] adding relationship assertion --- .../exporter/richconsole/__init__.py | 7 ++-- .../tests/test_rich_exporter.py | 37 +++++++++++++++++-- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py index 19e79ec407..ebefb7c559 100644 --- a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py +++ b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py @@ -73,6 +73,7 @@ def _ns_to_time(nanoseconds): def _child_to_tree(child: Tree, span: ReadableSpan): + print(span.name) child.add( Text.from_markup(f"[bold cyan]Kind :[/bold cyan] {span.kind.name}") ) @@ -152,15 +153,13 @@ def export(self, spans: typing.Sequence[ReadableSpan]) -> SpanExportResult: if not spans: return SpanExportResult.SUCCESS - for tree in self.spans_to_tree(spans): + for tree in self.spans_to_tree(spans).values(): self.console.print(tree) return SpanExportResult.SUCCESS @staticmethod - def spans_to_tree( - self, spans: typing.Sequence[ReadableSpan] - ) -> Dict[str, Tree]: + def spans_to_tree(spans: typing.Sequence[ReadableSpan]) -> Dict[str, Tree]: trees = dict() all_parent_ids = {span.context.span_id for span in spans} parents = {} diff --git a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py index a444360802..1f862ffbe9 100644 --- a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py +++ b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py @@ -17,7 +17,10 @@ from opentelemetry.exporter.richconsole import RichConsoleSpanExporter from opentelemetry.sdk import trace from opentelemetry.sdk.trace import ReadableSpan -from opentelemetry.sdk.trace.export import BatchSpanProcessor +from opentelemetry.sdk.trace.export import ( + BatchSpanProcessor, + SimpleSpanProcessor, +) import opentelemetry.trace from rich.tree import Tree @@ -43,10 +46,12 @@ def fixture_tracer_provider(span_processor): def test_span_exporter(tracer_provider, span_processor, capsys): tracer = tracer_provider.get_tracer(__name__) span = tracer.start_span("test_span") + span.set_attribute("key", "V4LuE") span.end() span_processor.force_flush() captured = capsys.readouterr() + assert "V4LuE" in captured.out @@ -70,12 +75,36 @@ def test_multiple_traces(tracer_provider): trees = exporter.spans_to_tree((parent_2, parent_1, child_1)) # asserts that we have all traces assert len(trees) == 2 - assert ( - opentelemetry.trace.format_trace_id(parent_1.context.trace_id) in trees - ) + traceid_1 = opentelemetry.trace.format_trace_id(parent_1.context.trace_id) + + assert traceid_1 in trees + assert ( opentelemetry.trace.format_trace_id(parent_2.context.trace_id) in trees ) # asserts that we have exactly the number of spans we exported assert sum([walk_tree(tree) for tree in trees.values()]) == 3 + + # assert that the relationship is correct + assert parent_1.name in trees[traceid_1].children[0].label + assert any( + [ + child_1.name in child.label + for child in trees[traceid_1].children[0].children + ] + ) + assert not any( + [ + parent_1.name in child.label + for child in trees[traceid_1].children[0].children + ] + ) + assert not any( + [ + parent_2.name in child.label + for child in trees[traceid_1].children[0].children + ] + ) + + assert trees[traceid_1].children From 5d1a735d2060458cce923bb8a267c5e3430e78ca Mon Sep 17 00:00:00 2001 From: Raphael Bizos Date: Thu, 29 Sep 2022 10:04:39 +0200 Subject: [PATCH 08/13] ordering imports --- .../src/opentelemetry/exporter/richconsole/__init__.py | 3 +-- .../tests/test_rich_exporter.py | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py index ebefb7c559..5a88fe8d8b 100644 --- a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py +++ b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py @@ -54,7 +54,7 @@ import datetime import typing -from typing import Optional, List, Dict +from typing import Dict, List, Optional from rich.console import Console from rich.syntax import Syntax @@ -73,7 +73,6 @@ def _ns_to_time(nanoseconds): def _child_to_tree(child: Tree, span: ReadableSpan): - print(span.name) child.add( Text.from_markup(f"[bold cyan]Kind :[/bold cyan] {span.kind.name}") ) diff --git a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py index 1f862ffbe9..bb37055d59 100644 --- a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py +++ b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py @@ -13,16 +13,15 @@ # limitations under the License. import pytest +from rich.tree import Tree +import opentelemetry.trace from opentelemetry.exporter.richconsole import RichConsoleSpanExporter from opentelemetry.sdk import trace -from opentelemetry.sdk.trace import ReadableSpan from opentelemetry.sdk.trace.export import ( BatchSpanProcessor, SimpleSpanProcessor, ) -import opentelemetry.trace -from rich.tree import Tree @pytest.fixture(name="span_processor") From 925aec7196ab298a964d09abb58e45b2a8fd9793 Mon Sep 17 00:00:00 2001 From: Raphael Bizos Date: Fri, 30 Sep 2022 08:58:01 +0200 Subject: [PATCH 09/13] removing useless assert --- .../tests/test_rich_exporter.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py index bb37055d59..4e50bc5a3c 100644 --- a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py +++ b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py @@ -105,5 +105,3 @@ def test_multiple_traces(tracer_provider): for child in trees[traceid_1].children[0].children ] ) - - assert trees[traceid_1].children From d2c6b5065ecfb9adff5577928c823a2322806279 Mon Sep 17 00:00:00 2001 From: Raphael Bizos Date: Thu, 6 Oct 2022 14:45:17 +0200 Subject: [PATCH 10/13] removing unused variable --- .../src/opentelemetry/exporter/richconsole/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py index 5a88fe8d8b..621f453a3c 100644 --- a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py +++ b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py @@ -160,7 +160,6 @@ def export(self, spans: typing.Sequence[ReadableSpan]) -> SpanExportResult: @staticmethod def spans_to_tree(spans: typing.Sequence[ReadableSpan]) -> Dict[str, Tree]: trees = dict() - all_parent_ids = {span.context.span_id for span in spans} parents = {} spans = list(spans) while spans: From a518e10c7857e62e31a48d58e5356115de11bd86 Mon Sep 17 00:00:00 2001 From: Raphael Bizos Date: Fri, 7 Oct 2022 17:44:47 +0200 Subject: [PATCH 11/13] fixing lint --- .../src/opentelemetry/exporter/richconsole/__init__.py | 2 +- .../tests/test_rich_exporter.py | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py index 621f453a3c..b9605979e0 100644 --- a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py +++ b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py @@ -54,7 +54,7 @@ import datetime import typing -from typing import Dict, List, Optional +from typing import Dict, Optional from rich.console import Console from rich.syntax import Syntax diff --git a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py index 4e50bc5a3c..7c7fae4eb0 100644 --- a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py +++ b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py @@ -18,10 +18,7 @@ import opentelemetry.trace from opentelemetry.exporter.richconsole import RichConsoleSpanExporter from opentelemetry.sdk import trace -from opentelemetry.sdk.trace.export import ( - BatchSpanProcessor, - SimpleSpanProcessor, -) +from opentelemetry.sdk.trace.export import BatchSpanProcessor @pytest.fixture(name="span_processor") From ed7314a2693a2c8ca12cb212312cf59a3feb30c3 Mon Sep 17 00:00:00 2001 From: Raphael Bizos Date: Mon, 10 Oct 2022 11:27:57 +0200 Subject: [PATCH 12/13] fixing pylint --- .../exporter/richconsole/__init__.py | 9 +++++++- .../tests/test_rich_exporter.py | 22 +++++++------------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py index b9605979e0..1e96df877b 100644 --- a/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py +++ b/exporter/opentelemetry-exporter-richconsole/src/opentelemetry/exporter/richconsole/__init__.py @@ -76,6 +76,11 @@ def _child_to_tree(child: Tree, span: ReadableSpan): child.add( Text.from_markup(f"[bold cyan]Kind :[/bold cyan] {span.kind.name}") ) + _add_status(child, span) + _child_add_optional_attributes(child, span) + + +def _add_status(child: Tree, span: ReadableSpan): if not span.status.is_unset: if not span.status.is_ok: child.add( @@ -96,6 +101,8 @@ def _child_to_tree(child: Tree, span: ReadableSpan): ) ) + +def _child_add_optional_attributes(child: Tree, span: ReadableSpan): if span.events: events = child.add( label=Text.from_markup("[bold cyan]Events :[/bold cyan] ") @@ -159,7 +166,7 @@ def export(self, spans: typing.Sequence[ReadableSpan]) -> SpanExportResult: @staticmethod def spans_to_tree(spans: typing.Sequence[ReadableSpan]) -> Dict[str, Tree]: - trees = dict() + trees = {} parents = {} spans = list(spans) while spans: diff --git a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py index 7c7fae4eb0..f4dcd49fe9 100644 --- a/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py +++ b/exporter/opentelemetry-exporter-richconsole/tests/test_rich_exporter.py @@ -53,7 +53,7 @@ def test_span_exporter(tracer_provider, span_processor, capsys): def walk_tree(root: Tree) -> int: # counts the amount of spans in a tree that contains a span - return sum([walk_tree(child) for child in root.children]) + int( + return sum(walk_tree(child) for child in root.children) + int( "span" in root.label ) @@ -80,25 +80,19 @@ def test_multiple_traces(tracer_provider): ) # asserts that we have exactly the number of spans we exported - assert sum([walk_tree(tree) for tree in trees.values()]) == 3 + assert sum(walk_tree(tree) for tree in trees.values()) == 3 # assert that the relationship is correct assert parent_1.name in trees[traceid_1].children[0].label assert any( - [ - child_1.name in child.label - for child in trees[traceid_1].children[0].children - ] + child_1.name in child.label + for child in trees[traceid_1].children[0].children ) assert not any( - [ - parent_1.name in child.label - for child in trees[traceid_1].children[0].children - ] + parent_1.name in child.label + for child in trees[traceid_1].children[0].children ) assert not any( - [ - parent_2.name in child.label - for child in trees[traceid_1].children[0].children - ] + parent_2.name in child.label + for child in trees[traceid_1].children[0].children ) From 9bbf8e1f7bd1819b07f0e73f9ffc0f6b39222fc2 Mon Sep 17 00:00:00 2001 From: Raphael Bizos Date: Mon, 10 Oct 2022 11:54:15 +0200 Subject: [PATCH 13/13] fixing changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2070606e0..b18ef49518 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-instrumentation-django` Fixed bug where auto-instrumentation fails when django is installed and settings are not configured. ([#1369](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1369)) - `opentelemetry-instrumentation-system-metrics` add supports to collect system thread count. ([#1339](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1339)) +- `opentelemetry-exporter-richconsole` Fixing RichConsoleExpoter to allow multiple traces, fixing duplicate spans and include resources ([#1336](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1336)) ## [1.13.0-0.34b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.13.0-0.34b0) - 2022-09-26 @@ -51,7 +52,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#1313](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1313)) - Fix uninstrumentation of existing app instances in FastAPI ([#1258](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1258)) -- `opentelemetry-exporter-richconsole` Fixing RichConsoleExpoter to allow multiple traces, fixing duplicate spans and include resources ([#1336](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1336)) +- Fix uninstrumentation of existing app instances in falcon + ([#1341]https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1341) ## [1.12.0-0.33b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.12.0-0.33b0) - 2022-08-08