diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py index 7a1594db63c..033e5855e5b 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py @@ -236,6 +236,9 @@ def set_attribute(self, key: str, value: types.AttributeValue) -> None: if error_message is not None: logger.warning("%s in attribute value sequence", error_message) return + if not isinstance(value, str): + # convert value : sequence into immutable tuple lest client changes it. + value = tuple(value) elif not isinstance(value, (bool, str, Number, Sequence)): logger.warning("invalid type for attribute value") return @@ -261,6 +264,7 @@ def _check_attribute_value_sequence(sequence: Sequence) -> Optional[str]: for element in sequence: if not isinstance(element, first_element_type): return "different type" + return None def add_event( diff --git a/opentelemetry-sdk/tests/trace/test_trace.py b/opentelemetry-sdk/tests/trace/test_trace.py index a62f91a7e35..79d59a4f776 100644 --- a/opentelemetry-sdk/tests/trace/test_trace.py +++ b/opentelemetry-sdk/tests/trace/test_trace.py @@ -390,12 +390,12 @@ def test_attributes(self): self.assertEqual(root.attributes["http.status_text"], "OK") self.assertEqual(root.attributes["misc.pi"], 3.14) self.assertEqual(root.attributes["attr-key"], "attr-value2") - self.assertEqual(root.attributes["empty-list"], []) + self.assertEqual(root.attributes["empty-list"], ()) self.assertEqual( - root.attributes["list-of-bools"], [True, True, False] + root.attributes["list-of-bools"], (True, True, False) ) self.assertEqual( - root.attributes["list-of-numerics"], [123, 3.14, 0] + root.attributes["list-of-numerics"], (123, 3.14, 0) ) attributes = {