From b39f33bb47c22795826eb8dc5b9ae05c9b8351d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Gonz=C3=A1lez=20Lopes?= Date: Thu, 16 Jan 2020 14:11:24 +0100 Subject: [PATCH 1/8] Remove status is missing TODO MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Daniel González Lopes --- .../src/opentelemetry/ext/jaeger/__init__.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py b/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py index e9d5c5884d0..e2a32b2fa31 100644 --- a/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py +++ b/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py @@ -153,9 +153,6 @@ def _translate_to_jaeger(spans: Span): tags = _extract_tags(span.attributes) - # TODO: status is missing: - # https://github.com/open-telemetry/opentelemetry-python/issues/98 - refs = _extract_refs_from_span(span) logs = _extract_logs_from_span(span) From e9a480f222bed1db1dbd80f7964508869c022d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Gonz=C3=A1lez=20Lopes?= Date: Wed, 22 Jan 2020 11:44:00 +0100 Subject: [PATCH 2/8] Export status to Jaeger MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Daniel González Lopes --- .../src/opentelemetry/ext/jaeger/__init__.py | 30 +++++++++++++++++++ .../tests/test_jaeger_exporter.py | 12 ++++++++ 2 files changed, 42 insertions(+) diff --git a/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py b/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py index e2a32b2fa31..3b54ec6a489 100644 --- a/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py +++ b/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py @@ -26,6 +26,7 @@ from opentelemetry.ext.jaeger.gen.agent import Agent as agent from opentelemetry.ext.jaeger.gen.jaeger import Collector as jaeger from opentelemetry.sdk.trace.export import Span, SpanExporter, SpanExportResult +from opentelemetry.trace.status import StatusCanonicalCode DEFAULT_AGENT_HOST_NAME = "localhost" DEFAULT_AGENT_PORT = 6831 @@ -145,6 +146,8 @@ def _translate_to_jaeger(spans: Span): start_time_us = _nsec_to_usec_round(span.start_time) duration_us = _nsec_to_usec_round(span.end_time - span.start_time) + status = span.status + parent_id = 0 if isinstance(span.parent, trace_api.Span): parent_id = span.parent.get_context().span_id @@ -153,6 +156,21 @@ def _translate_to_jaeger(spans: Span): tags = _extract_tags(span.attributes) + if status is not None: + if tags is None: + tags = [] + + tags.extend( + [ + _get_long_tag("status.code", status.canonical_code.value), + _get_string_tag("status.message", status.description), + ] + ) + + # Ensure that if Status.Code is not OK, that we set the "error" tag on the Jaeger span. + if status.canonical_code is not StatusCanonicalCode.OK: + tags.append(_get_bool_tag("error", True)) + refs = _extract_refs_from_span(span) logs = _extract_logs_from_span(span) @@ -262,6 +280,18 @@ def _convert_attribute_to_tag(key, attr): return None +def _get_long_tag(key, val): + return jaeger.Tag(key=key, vLong=val, vType=jaeger.TagType.LONG) + + +def _get_string_tag(key, val): + return jaeger.Tag(key=key, vStr=val, vType=jaeger.TagType.STRING) + + +def _get_bool_tag(key, val): + return jaeger.Tag(key=key, vBool=val, vType=jaeger.TagType.BOOL) + + class AgentClientUDP: """Implement a UDP client to agent. diff --git a/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py b/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py index f8ead96ef06..e0cc4e96a63 100644 --- a/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py +++ b/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py @@ -20,6 +20,7 @@ # pylint:disable=import-error import opentelemetry.ext.jaeger as jaeger_exporter from opentelemetry import trace as trace_api +from opentelemetry.trace.status import Status, StatusCanonicalCode from opentelemetry.ext.jaeger.gen.jaeger import ttypes as jaeger from opentelemetry.sdk import trace @@ -174,6 +175,9 @@ def test_translate_to_jaeger(self): otel_spans[0].set_attribute("key_bool", False) otel_spans[0].set_attribute("key_string", "hello_world") otel_spans[0].set_attribute("key_float", 111.22) + otel_spans[0].set_status( + Status(StatusCanonicalCode.OK, "Example description") + ) otel_spans[0].end(end_time=end_times[0]) otel_spans[1].start(start_time=start_times[1]) @@ -209,6 +213,14 @@ def test_translate_to_jaeger(self): vType=jaeger.TagType.DOUBLE, vDouble=111.22, ), + jaeger.Tag( + key="status.code", vType=jaeger.TagType.LONG, vLong=0, + ), + jaeger.Tag( + key="status.message", + vType=jaeger.TagType.STRING, + vStr="Example description", + ), ], references=[ jaeger.SpanRef( From 583279c9353ffc79798c9d66efcfbbaebb640c8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Gonz=C3=A1lez=20Lopes?= Date: Wed, 22 Jan 2020 13:34:20 +0100 Subject: [PATCH 3/8] Fix Jaeger status MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Based on the changes of #358 Signed-off-by: Daniel González Lopes --- .../src/opentelemetry/ext/jaeger/__init__.py | 25 +++++++++---------- .../tests/test_jaeger_exporter.py | 16 ++++++++++-- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py b/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py index 3b54ec6a489..dd58f1b7542 100644 --- a/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py +++ b/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py @@ -156,20 +156,19 @@ def _translate_to_jaeger(spans: Span): tags = _extract_tags(span.attributes) - if status is not None: - if tags is None: - tags = [] - - tags.extend( - [ - _get_long_tag("status.code", status.canonical_code.value), - _get_string_tag("status.message", status.description), - ] - ) + if tags is None: + tags = [] + + tags.extend( + [ + _get_long_tag("status.code", status.canonical_code.value), + _get_string_tag("status.message", status.description), + ] + ) - # Ensure that if Status.Code is not OK, that we set the "error" tag on the Jaeger span. - if status.canonical_code is not StatusCanonicalCode.OK: - tags.append(_get_bool_tag("error", True)) + # Ensure that if Status.Code is not OK, that we set the "error" tag on the Jaeger span. + if status.canonical_code is not StatusCanonicalCode.OK: + tags.append(_get_bool_tag("error", True)) refs = _extract_refs_from_span(span) logs = _extract_logs_from_span(span) diff --git a/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py b/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py index e0cc4e96a63..5258f634e55 100644 --- a/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py +++ b/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py @@ -156,6 +156,13 @@ def test_translate_to_jaeger(self): context=other_context, attributes=link_attributes ) + default_status_tags = [ + jaeger.Tag(key="status.code", vType=jaeger.TagType.LONG, vLong=0,), + jaeger.Tag( + key="status.message", vType=jaeger.TagType.STRING, vStr=None, + ), + ] + otel_spans = [ trace.Span( name=span_names[0], @@ -176,7 +183,7 @@ def test_translate_to_jaeger(self): otel_spans[0].set_attribute("key_string", "hello_world") otel_spans[0].set_attribute("key_float", 111.22) otel_spans[0].set_status( - Status(StatusCanonicalCode.OK, "Example description") + Status(StatusCanonicalCode.UNKNOWN, "Example description") ) otel_spans[0].end(end_time=end_times[0]) @@ -214,13 +221,16 @@ def test_translate_to_jaeger(self): vDouble=111.22, ), jaeger.Tag( - key="status.code", vType=jaeger.TagType.LONG, vLong=0, + key="status.code", vType=jaeger.TagType.LONG, vLong=2, ), jaeger.Tag( key="status.message", vType=jaeger.TagType.STRING, vStr="Example description", ), + jaeger.Tag( + key="error", vType=jaeger.TagType.BOOL, vBool=True, + ), ], references=[ jaeger.SpanRef( @@ -267,6 +277,7 @@ def test_translate_to_jaeger(self): startTime=start_times[1] // 10 ** 3, duration=durations[1] // 10 ** 3, flags=0, + tags=default_status_tags, ), jaeger.Span( operationName=span_names[2], @@ -277,6 +288,7 @@ def test_translate_to_jaeger(self): startTime=start_times[2] // 10 ** 3, duration=durations[2] // 10 ** 3, flags=0, + tags=default_status_tags, ), ] From 1c8f1980594bb9be32205600a9420e04ca970a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Gonz=C3=A1lez=20Lopes?= Date: Wed, 22 Jan 2020 13:47:48 +0100 Subject: [PATCH 4/8] Fixing linting error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Daniel González Lopes --- ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py b/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py index 5258f634e55..620b662cbad 100644 --- a/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py +++ b/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py @@ -20,9 +20,9 @@ # pylint:disable=import-error import opentelemetry.ext.jaeger as jaeger_exporter from opentelemetry import trace as trace_api -from opentelemetry.trace.status import Status, StatusCanonicalCode from opentelemetry.ext.jaeger.gen.jaeger import ttypes as jaeger from opentelemetry.sdk import trace +from opentelemetry.trace.status import Status, StatusCanonicalCode class TestJaegerSpanExporter(unittest.TestCase): From ed8cbdc74b24dd2d9b30477b054509c1f81a94f6 Mon Sep 17 00:00:00 2001 From: dgzlopes Date: Wed, 22 Jan 2020 16:51:34 +0100 Subject: [PATCH 5/8] Fix nits Signed-off-by: dgzlopes --- .../tests/test_jaeger_exporter.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py b/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py index 620b662cbad..e891393b423 100644 --- a/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py +++ b/ext/opentelemetry-ext-jaeger/tests/test_jaeger_exporter.py @@ -157,7 +157,11 @@ def test_translate_to_jaeger(self): ) default_status_tags = [ - jaeger.Tag(key="status.code", vType=jaeger.TagType.LONG, vLong=0,), + jaeger.Tag( + key="status.code", + vType=jaeger.TagType.LONG, + vLong=StatusCanonicalCode.OK.value, + ), jaeger.Tag( key="status.message", vType=jaeger.TagType.STRING, vStr=None, ), @@ -221,7 +225,9 @@ def test_translate_to_jaeger(self): vDouble=111.22, ), jaeger.Tag( - key="status.code", vType=jaeger.TagType.LONG, vLong=2, + key="status.code", + vType=jaeger.TagType.LONG, + vLong=StatusCanonicalCode.UNKNOWN.value, ), jaeger.Tag( key="status.message", From 0a1590044d72b534d9c74b637ac4420278b43912 Mon Sep 17 00:00:00 2001 From: dgzlopes Date: Wed, 22 Jan 2020 17:52:41 +0100 Subject: [PATCH 6/8] Change _extract_tags to return an empty list Signed-off-by: dgzlopes --- .../src/opentelemetry/ext/jaeger/__init__.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py b/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py index dd58f1b7542..6111a85aa09 100644 --- a/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py +++ b/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py @@ -156,9 +156,6 @@ def _translate_to_jaeger(spans: Span): tags = _extract_tags(span.attributes) - if tags is None: - tags = [] - tags.extend( [ _get_long_tag("status.code", status.canonical_code.value), @@ -255,7 +252,7 @@ def _extract_logs_from_span(span): def _extract_tags(attr): if not attr: - return None + return [] tags = [] for attribute_key, attribute_value in attr.items(): tag = _convert_attribute_to_tag(attribute_key, attribute_value) From 30bc36ac971f3d688a5173b91b005381fd469619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Gonz=C3=A1lez=20Lopes?= Date: Thu, 23 Jan 2020 00:15:54 +0100 Subject: [PATCH 7/8] Remove None check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Daniel González Lopes --- .../src/opentelemetry/ext/jaeger/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py b/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py index 6111a85aa09..e990b7d97e4 100644 --- a/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py +++ b/ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py @@ -233,9 +233,7 @@ def _extract_logs_from_span(span): logs = [] for event in span.events: - fields = [] - if event.attributes is not None: - fields = _extract_tags(event.attributes) + fields = _extract_tags(event.attributes) fields.append( jaeger.Tag( From ae7653391575ba99904431aee608232b8cb31336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mauricio=20V=C3=A1squez?= Date: Thu, 23 Jan 2020 08:31:26 -0500 Subject: [PATCH 8/8] ext/jaeger: update CHANGELOG --- ext/opentelemetry-ext-jaeger/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/opentelemetry-ext-jaeger/CHANGELOG.md b/ext/opentelemetry-ext-jaeger/CHANGELOG.md index 05ffbffe0f6..90745ada0d4 100644 --- a/ext/opentelemetry-ext-jaeger/CHANGELOG.md +++ b/ext/opentelemetry-ext-jaeger/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- Export span status ([#367](https://github.com/open-telemetry/opentelemetry-python/pull/367)) + ## 0.3a0 Released 2019-12-11