From 18061915a6b12808b8b4b7b9eaeb44f70a44a65d Mon Sep 17 00:00:00 2001 From: Andrew Xue Date: Wed, 20 May 2020 15:39:10 -0400 Subject: [PATCH 1/4] deep copy empty attributes --- opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py index 66e13d9cc8d..3115c610a82 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py @@ -253,7 +253,6 @@ class Span(trace_api.Span): """ # Initialize these lazily assuming most spans won't have them. - _empty_attributes = BoundedDict(MAX_NUM_ATTRIBUTES) _empty_events = BoundedList(MAX_NUM_EVENTS) _empty_links = BoundedList(MAX_NUM_LINKS) @@ -289,7 +288,7 @@ def __init__( self._filter_attribute_values(attributes) if not attributes: - self.attributes = Span._empty_attributes + self.attributes = BoundedDict(MAX_NUM_ATTRIBUTES) else: self.attributes = BoundedDict.from_map( MAX_NUM_ATTRIBUTES, attributes @@ -407,9 +406,6 @@ def set_attribute(self, key: str, value: types.AttributeValue) -> None: if not self.is_recording_events(): return has_ended = self.end_time is not None - if not has_ended: - if self.attributes is Span._empty_attributes: - self.attributes = BoundedDict(MAX_NUM_ATTRIBUTES) if has_ended: logger.warning("Setting attribute on ended span.") return @@ -458,7 +454,7 @@ def add_event( ) -> None: self._filter_attribute_values(attributes) if not attributes: - attributes = Span._empty_attributes + attributes = BoundedDict(MAX_NUM_ATTRIBUTES) self._add_event( Event( name=name, From e458319878ae37f9fe1d5e27df77e6c744fbe2c7 Mon Sep 17 00:00:00 2001 From: Andrew Xue Date: Wed, 20 May 2020 15:46:35 -0400 Subject: [PATCH 2/4] update events and links --- .../src/opentelemetry/sdk/trace/__init__.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py index 3115c610a82..9f92148e9bf 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py @@ -252,10 +252,6 @@ class Span(trace_api.Span): this `Span`. """ - # Initialize these lazily assuming most spans won't have them. - _empty_events = BoundedList(MAX_NUM_EVENTS) - _empty_links = BoundedList(MAX_NUM_LINKS) - def __init__( self, name: str, @@ -295,7 +291,7 @@ def __init__( ) if events is None: - self.events = Span._empty_events + self.events = BoundedList(MAX_NUM_EVENTS) else: self.events = BoundedList(MAX_NUM_EVENTS) for event in events: @@ -303,7 +299,7 @@ def __init__( self.events.append(event) if links is None: - self.links = Span._empty_links + self.links = BoundedList(MAX_NUM_LINKS) else: self.links = BoundedList.from_seq(MAX_NUM_LINKS, links) @@ -438,9 +434,7 @@ def _add_event(self, event: EventBase) -> None: if not self.is_recording_events(): return has_ended = self.end_time is not None - if not has_ended: - if self.events is Span._empty_events: - self.events = BoundedList(MAX_NUM_EVENTS) + if has_ended: logger.warning("Calling add_event() on an ended span.") return From 481a03a47c134502da71ea2cf447181d85b892e3 Mon Sep 17 00:00:00 2001 From: Andrew Xue Date: Mon, 25 May 2020 12:44:13 -0400 Subject: [PATCH 3/4] address comments --- .../src/opentelemetry/sdk/trace/__init__.py | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py index 9f92148e9bf..20c50a849fd 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py @@ -284,22 +284,20 @@ def __init__( self._filter_attribute_values(attributes) if not attributes: - self.attributes = BoundedDict(MAX_NUM_ATTRIBUTES) + self.attributes = self._new_attributes() else: self.attributes = BoundedDict.from_map( MAX_NUM_ATTRIBUTES, attributes ) - if events is None: - self.events = BoundedList(MAX_NUM_EVENTS) - else: - self.events = BoundedList(MAX_NUM_EVENTS) + self.events = self._new_events() + if events: for event in events: self._filter_attribute_values(event.attributes) self.events.append(event) if links is None: - self.links = BoundedList(MAX_NUM_LINKS) + self.links = self._new_links() else: self.links = BoundedList.from_seq(MAX_NUM_LINKS, links) @@ -320,6 +318,18 @@ def __repr__(self): type(self).__name__, self.name, self.context ) + @staticmethod + def _new_attributes(): + return BoundedDict(MAX_NUM_ATTRIBUTES) + + @staticmethod + def _new_events(): + return BoundedList(MAX_NUM_EVENTS) + + @staticmethod + def _new_links(): + return BoundedList(MAX_NUM_LINKS) + @staticmethod def _format_context(context): x_ctx = OrderedDict() @@ -448,7 +458,7 @@ def add_event( ) -> None: self._filter_attribute_values(attributes) if not attributes: - attributes = BoundedDict(MAX_NUM_ATTRIBUTES) + attributes = self._new_attributes() self._add_event( Event( name=name, From e35b7ca05abeebc966aab691aa40709fa68a8b9b Mon Sep 17 00:00:00 2001 From: Andrew Xue Date: Wed, 27 May 2020 12:19:27 -0400 Subject: [PATCH 4/4] update changelog --- opentelemetry-sdk/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/opentelemetry-sdk/CHANGELOG.md b/opentelemetry-sdk/CHANGELOG.md index bece33dfca7..c4f09760d94 100644 --- a/opentelemetry-sdk/CHANGELOG.md +++ b/opentelemetry-sdk/CHANGELOG.md @@ -10,6 +10,8 @@ ([#724](https://github.com/open-telemetry/opentelemetry-python/pull/724)) - bugfix: Fix error message ([#729](https://github.com/open-telemetry/opentelemetry-python/pull/729)) +- deep copy empty attributes + ([#714](https://github.com/open-telemetry/opentelemetry-python/pull/714)) ## 0.7b1