Skip to content

Commit 6f4428d

Browse files
authored
Improve omitting circular references (#28)
1 parent 79134b5 commit 6f4428d

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

logtail/frame.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ def _parse_custom_events(record, include_extra_attributes):
6060
def _remove_circular_dependencies(obj, memo=None):
6161
if memo is None:
6262
memo = set()
63+
# Skip immutable types, which can't contain circular dependencies
64+
if isinstance(obj, (str, int, float, bool)):
65+
return obj
6366
if id(obj) in memo:
6467
return "<omitted circular reference>"
6568
memo.add(id(obj))
@@ -69,8 +72,11 @@ def _remove_circular_dependencies(obj, memo=None):
6972
new_dict[key] = _remove_circular_dependencies(value, memo)
7073
return new_dict
7174
elif isinstance(obj, list):
72-
new_list = [_remove_circular_dependencies(item, memo) for item in obj]
73-
return new_list
75+
return [_remove_circular_dependencies(item, memo) for item in obj]
76+
elif isinstance(obj, tuple):
77+
return tuple(_remove_circular_dependencies(item, memo) for item in obj)
78+
elif isinstance(obj, set):
79+
return {_remove_circular_dependencies(item, memo) for item in obj}
7480
else:
7581
return obj
7682

tests/test_handler.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,26 @@ def test_can_send_circular_dependency_in_extra_data(self, MockWorker):
203203
self.assertEqual(log_entry['data']['egg']['chicken'], "<omitted circular reference>")
204204
self.assertTrue(handler.pipe.empty())
205205

206+
@patch('logtail.handler.FlushWorker')
207+
def test_can_have_multiple_instance_of_same_string_in_extra_data(self, MockWorker):
208+
buffer_capacity = 1
209+
handler = LogtailHandler(
210+
source_token=self.source_token,
211+
buffer_capacity=buffer_capacity
212+
)
213+
214+
logger = logging.getLogger(__name__)
215+
logger.handlers = []
216+
logger.addHandler(handler)
217+
test_string = 'this is a test string'
218+
logger.info('hello', extra={'test1': test_string, 'test2': test_string})
219+
220+
log_entry = handler.pipe.get()
221+
222+
self.assertEqual(log_entry['message'], 'hello')
223+
self.assertEqual(log_entry['test1'], 'this is a test string')
224+
self.assertEqual(log_entry['test2'], 'this is a test string')
225+
self.assertTrue(handler.pipe.empty())
206226

207227
@patch('logtail.handler.FlushWorker')
208228
def test_can_send_circular_dependency_in_context(self, MockWorker):

0 commit comments

Comments
 (0)