Skip to content

Commit 15b3285

Browse files
committed
feat: use generator for memory efficient recursion
1 parent c1c71d1 commit 15b3285

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

tests/e2e/utils/data_fetcher/traces.py

+15-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import json
22
from datetime import datetime, timedelta
3-
from typing import Any, Dict, List, Optional
3+
from typing import Any, Dict, Generator, List, Optional
44

55
import boto3
66
from botocore.paginate import PageIterator
@@ -122,29 +122,34 @@ def get_metadata(self, key: str, namespace: str = "") -> List[Dict[str, Any]]:
122122
def get_subsegment(self, name: str) -> List:
123123
return [seg for seg in self.subsegments if seg.name == name]
124124

125-
def _find_nested_subsegments(self, subsegment: TraceSubsegment, seen: List):
126-
"""Recursively add any subsegment that we might be interested.
125+
def _find_nested_subsegments(self, subsegments: List[TraceSubsegment]) -> Generator[TraceSubsegment, None, None]:
126+
"""Recursively yield any subsegment that we might be interested.
127127
128128
It excludes any subsegments contained in exclude_segment_name.
129129
Since these are nested, subsegment name might be '## lambda_handler'.
130130
131+
It also populates annotations and metadata nested in subsegments.
132+
131133
Parameters
132134
----------
133135
subsegment : TraceSubsegment
134136
subsegment to traverse
135137
seen : List
136138
list of subsegments to be updated
137139
"""
138-
if subsegment.subsegments is not None:
139-
for seg in subsegment.subsegments:
140-
if seg.name not in self.exclude_segment_name:
141-
seen.append(seg)
140+
for seg in subsegments:
141+
if seg.name not in self.exclude_segment_name:
142142
if seg.annotations:
143143
self.annotations.append(seg.annotations)
144+
144145
if seg.metadata:
145146
self.metadata.append(seg.metadata)
146147

147-
return seen
148+
yield seg
149+
150+
if seg.subsegments:
151+
# recursively iterate over any arbitrary number of subsegments
152+
yield from self._find_nested_subsegments(seg.subsegments)
148153

149154
def _get_subsegments(self) -> List[TraceSubsegment]:
150155
"""Find subsegments and potentially any nested subsegments
@@ -160,10 +165,7 @@ def _get_subsegments(self) -> List[TraceSubsegment]:
160165
seen = []
161166
for document in self.trace_documents.values():
162167
if document.subsegments:
163-
for subsegment in document.subsegments:
164-
if subsegment.name not in self.exclude_segment_name:
165-
seen.append(subsegment)
166-
self._find_nested_subsegments(subsegment, seen)
168+
seen.extend(self._find_nested_subsegments(document.subsegments))
167169

168170
return seen
169171

@@ -215,7 +217,7 @@ def _get_trace_documents(self, trace_ids: List[str]) -> Dict[str, TraceDocument]
215217
return documents
216218

217219

218-
@retry(ValueError, delay=10, jitter=1.5, tries=10)
220+
@retry(ValueError, delay=5, jitter=1.5, tries=10)
219221
def get_traces(
220222
filter_expression: str,
221223
start_date: datetime,

0 commit comments

Comments
 (0)