Skip to content

Commit 2aee48f

Browse files
author
Andrew Xue
committed
improve attribute filtering logic
1 parent 7dffbe7 commit 2aee48f

File tree

2 files changed

+22
-27
lines changed

2 files changed

+22
-27
lines changed

opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -248,30 +248,16 @@ def __init__(
248248
if attributes is None:
249249
self.attributes = Span._empty_attributes
250250
else:
251-
self.attributes = BoundedDict(MAX_NUM_ATTRIBUTES)
252-
for attr_key, attr_value in attributes.items():
253-
error_message = self._check_attribute_value(attr_value)
254-
if error_message:
255-
logger.warning(error_message)
256-
else:
257-
self.attributes[attr_key] = attr_value
251+
self._filter_attribute_values(attributes)
252+
self.attributes = BoundedDict.from_map(MAX_NUM_ATTRIBUTES, attributes)
258253

259254
if events is None:
260255
self.events = Span._empty_events
261256
else:
262257
self.events = BoundedList(MAX_NUM_EVENTS)
263258
for event in events:
264-
good_event = True
265-
for attr_key, attr_value in list(event.attributes.items()):
266-
error_message = self._check_attribute_value(attr_value)
267-
if error_message:
268-
logger.warning(error_message)
269-
good_event = False
270-
break
271-
if isinstance(attr_value, MutableSequence):
272-
attributes[attr_key] = tuple(attr_value)
273-
if good_event:
274-
self.events.append(event)
259+
self._filter_attribute_values(event.attributes)
260+
self.events.append(event)
275261

276262
if links is None:
277263
self.links = Span._empty_links
@@ -428,6 +414,17 @@ def _check_attribute_value(value: types.AttributeValue) -> Optional[str]:
428414
[valid_type.__name__ for valid_type in valid_types],
429415
)
430416

417+
def _filter_attribute_values(self, attributes: types.Attributes):
418+
for attr_key, attr_value in list(attributes.items()):
419+
error_message = self._check_attribute_value(attr_value)
420+
if error_message:
421+
attributes.pop(attr_key)
422+
logger.warning(error_message)
423+
elif isinstance(attr_value, MutableSequence):
424+
attributes[attr_key] = tuple(attr_value)
425+
else:
426+
attributes[attr_key] = attr_value
427+
431428
def _add_event(self, event: EventBase) -> None:
432429
with self._lock:
433430
if not self.is_recording_events():
@@ -450,13 +447,7 @@ def add_event(
450447
if attributes is None:
451448
attributes = Span._empty_attributes
452449
else:
453-
for attr_key, attr_value in list(attributes.items()):
454-
error_message = self._check_attribute_value(attr_value)
455-
if error_message:
456-
logger.warning(error_message)
457-
return
458-
if isinstance(attr_value, MutableSequence):
459-
attributes[attr_key] = tuple(attr_value)
450+
self._filter_attribute_values(attributes)
460451
self._add_event(
461452
Event(
462453
name=name,

opentelemetry-sdk/tests/trace/test_trace.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -619,9 +619,13 @@ def test_invalid_event_attributes(self):
619619
root.add_event("event0", {"attr1": True, "attr2": ["hi", False]})
620620
root.add_event("event0", {"attr1": dict()})
621621
root.add_event("event0", {"attr1": [[True]]})
622-
root.add_event("event0", {"attr1": [dict()]})
622+
root.add_event("event0", {"attr1": [dict()], "attr2": [1, 2]})
623623

624-
self.assertEqual(len(root.events), 0)
624+
self.assertEqual(len(root.events), 4)
625+
self.assertEqual(root.events[0].attributes, {"attr1": True})
626+
self.assertEqual(root.events[1].attributes, {})
627+
self.assertEqual(root.events[2].attributes, {})
628+
self.assertEqual(root.events[3].attributes, {"attr2": (1, 2)})
625629

626630
def test_links(self):
627631
other_context1 = trace_api.SpanContext(

0 commit comments

Comments
 (0)