From 324c388a6bf315e8f92fd05abf5fbd02c8678980 Mon Sep 17 00:00:00 2001 From: Srikanth Chekuri Date: Tue, 5 Jan 2021 14:39:37 +0530 Subject: [PATCH 1/2] Zipkin: Update span boolean attribute conversion --- .../opentelemetry/exporter/zipkin/__init__.py | 10 ++++-- .../tests/test_zipkin_exporter.py | 36 +++++++++---------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/__init__.py b/exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/__init__.py index 6b376c203c5..1610e0a3f67 100644 --- a/exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/__init__.py +++ b/exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/__init__.py @@ -352,7 +352,9 @@ def _extract_tags_from_dict(self, tags_dict): if not tags_dict: return tags for attribute_key, attribute_value in tags_dict.items(): - if isinstance(attribute_value, (int, bool, float, str)): + if isinstance(attribute_value, bool): + value = str(attribute_value).lower() + elif isinstance(attribute_value, (int, float, str)): value = str(attribute_value) elif isinstance(attribute_value, Sequence): value = self._extract_tag_value_string_from_sequence( @@ -381,7 +383,9 @@ def _extract_tag_value_string_from_sequence(self, sequence: Sequence): defined_max_tag_value_length = self.max_tag_value_length > 0 for element in sequence: - if isinstance(element, (int, bool, float, str)): + if isinstance(element, bool): + tag_value_element = str(element).lower() + elif isinstance(element, (int, float, str)): tag_value_element = str(element) elif element is None: tag_value_element = None @@ -407,7 +411,7 @@ def _extract_tag_value_string_from_sequence(self, sequence: Sequence): return json.dumps(tag_value_elements, separators=(",", ":")) def _extract_tags_from_span(self, span: Span): - tags = self._extract_tags_from_dict(getattr(span, "attributes", None)) + tags = self._extract_tags_from_dict(span.attributes) if span.resource: tags.update(self._extract_tags_from_dict(span.resource.attributes)) return tags diff --git a/exporter/opentelemetry-exporter-zipkin/tests/test_zipkin_exporter.py b/exporter/opentelemetry-exporter-zipkin/tests/test_zipkin_exporter.py index eb3f4894c12..ee6c9f2a09c 100644 --- a/exporter/opentelemetry-exporter-zipkin/tests/test_zipkin_exporter.py +++ b/exporter/opentelemetry-exporter-zipkin/tests/test_zipkin_exporter.py @@ -243,7 +243,7 @@ def test_export_json(self): "localEndpoint": local_endpoint, "kind": span_kind, "tags": { - "key_bool": "False", + "key_bool": "false", "key_string": "hello_world", "key_float": "111.22", "otel.status_code": "ERROR", @@ -471,11 +471,11 @@ def test_export_json_max_tag_length(self): ) self.assertEqual( tags["list5"], - '["True","True","True","True","True","True","True","True","True","True","True","True","True","True","True","True","True","True"]', + '["true","true","true","true","true","true","true","true","true","true","true","true","true","true","true","true","true","true"]', ) self.assertEqual( tags["list6"], - '["True","True","True","True","True","True","True","True","True","True"]', + '["true","true","true","true","true","true","true","true","true","true"]', ) self.assertEqual( tags["tuple1"], @@ -493,11 +493,11 @@ def test_export_json_max_tag_length(self): ) self.assertEqual( tags["tuple5"], - '["True","True","True","True","True","True","True","True","True","True","True","True","True","True","True","True","True","True"]', + '["true","true","true","true","true","true","true","true","true","true","true","true","true","true","true","true","true","true"]', ) self.assertEqual( tags["tuple6"], - '["True","True","True","True","True","True","True","True","True","True"]', + '["true","true","true","true","true","true","true","true","true","true"]', ) self.assertEqual( tags["range1"], @@ -580,14 +580,14 @@ def test_export_json_max_tag_length(self): self.assertEqual(tags["list2"], '["a","a"]') self.assertEqual(tags["list3"], '["2","2"]') self.assertEqual(tags["list4"], '["2","2"]') - self.assertEqual(tags["list5"], '["True"]') - self.assertEqual(tags["list6"], '["True"]') + self.assertEqual(tags["list5"], '["true"]') + self.assertEqual(tags["list6"], '["true"]') self.assertEqual(tags["tuple1"], '["a","a"]') self.assertEqual(tags["tuple2"], '["a","a"]') self.assertEqual(tags["tuple3"], '["2","2"]') self.assertEqual(tags["tuple4"], '["2","2"]') - self.assertEqual(tags["tuple5"], '["True"]') - self.assertEqual(tags["tuple6"], '["True"]') + self.assertEqual(tags["tuple5"], '["true"]') + self.assertEqual(tags["tuple6"], '["true"]') self.assertEqual(tags["range1"], '["0","1"]') self.assertEqual(tags["range2"], '["0","1"]') @@ -606,14 +606,14 @@ def test_export_json_max_tag_length(self): self.assertEqual(tags["list2"], '["a","a"]') self.assertEqual(tags["list3"], '["2","2"]') self.assertEqual(tags["list4"], '["2","2"]') - self.assertEqual(tags["list5"], '["True"]') - self.assertEqual(tags["list6"], '["True"]') + self.assertEqual(tags["list5"], '["true"]') + self.assertEqual(tags["list6"], '["true"]') self.assertEqual(tags["tuple1"], '["a","a"]') self.assertEqual(tags["tuple2"], '["a","a"]') self.assertEqual(tags["tuple3"], '["2","2"]') self.assertEqual(tags["tuple4"], '["2","2"]') - self.assertEqual(tags["tuple5"], '["True"]') - self.assertEqual(tags["tuple6"], '["True"]') + self.assertEqual(tags["tuple5"], '["true"]') + self.assertEqual(tags["tuple6"], '["true"]') self.assertEqual(tags["range1"], '["0","1"]') self.assertEqual(tags["range2"], '["0","1"]') @@ -632,14 +632,14 @@ def test_export_json_max_tag_length(self): self.assertEqual(tags["list2"], '["a","a"]') self.assertEqual(tags["list3"], '["2","2"]') self.assertEqual(tags["list4"], '["2","2"]') - self.assertEqual(tags["list5"], '["True"]') - self.assertEqual(tags["list6"], '["True"]') + self.assertEqual(tags["list5"], '["true"]') + self.assertEqual(tags["list6"], '["true"]') self.assertEqual(tags["tuple1"], '["a","a"]') self.assertEqual(tags["tuple2"], '["a","a"]') self.assertEqual(tags["tuple3"], '["2","2"]') self.assertEqual(tags["tuple4"], '["2","2"]') - self.assertEqual(tags["tuple5"], '["True"]') - self.assertEqual(tags["tuple6"], '["True"]') + self.assertEqual(tags["tuple5"], '["true"]') + self.assertEqual(tags["tuple6"], '["true"]') self.assertEqual(tags["range1"], '["0","1"]') self.assertEqual(tags["range2"], '["0","1"]') @@ -768,7 +768,7 @@ def test_export_protobuf(self): local_endpoint=local_endpoint, kind=span_kind, tags={ - "key_bool": "False", + "key_bool": "false", "key_string": "hello_world", "key_float": "111.22", "otel.status_code": "ERROR", From 94c3de84b9815c18dcbab3a9b7b90bb917a898f1 Mon Sep 17 00:00:00 2001 From: Srikanth Chekuri Date: Tue, 5 Jan 2021 14:47:58 +0530 Subject: [PATCH 2/2] Add CHANGELOG entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55541fd137b..5517806192e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#1486](https://github.com/open-telemetry/opentelemetry-python/pull/1486)) - Recreate span on every run of a `start_as_current_span`-decorated function ([#1451](https://github.com/open-telemetry/opentelemetry-python/pull/1451)) +- `opentelemetry-exporter-zipkin` Update boolean attribute value transformation + ([#1509](https://github.com/open-telemetry/opentelemetry-python/pull/1509)) ## [0.16b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.16b1) - 2020-11-26 ### Added