1
1
import json
2
2
from datetime import datetime , timedelta
3
- from typing import Any , Dict , List , Optional
3
+ from typing import Any , Dict , Generator , List , Optional
4
4
5
5
import boto3
6
6
from botocore .paginate import PageIterator
@@ -122,29 +122,34 @@ def get_metadata(self, key: str, namespace: str = "") -> List[Dict[str, Any]]:
122
122
def get_subsegment (self , name : str ) -> List :
123
123
return [seg for seg in self .subsegments if seg .name == name ]
124
124
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.
127
127
128
128
It excludes any subsegments contained in exclude_segment_name.
129
129
Since these are nested, subsegment name might be '## lambda_handler'.
130
130
131
+ It also populates annotations and metadata nested in subsegments.
132
+
131
133
Parameters
132
134
----------
133
135
subsegment : TraceSubsegment
134
136
subsegment to traverse
135
137
seen : List
136
138
list of subsegments to be updated
137
139
"""
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 :
142
142
if seg .annotations :
143
143
self .annotations .append (seg .annotations )
144
+
144
145
if seg .metadata :
145
146
self .metadata .append (seg .metadata )
146
147
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 )
148
153
149
154
def _get_subsegments (self ) -> List [TraceSubsegment ]:
150
155
"""Find subsegments and potentially any nested subsegments
@@ -160,10 +165,7 @@ def _get_subsegments(self) -> List[TraceSubsegment]:
160
165
seen = []
161
166
for document in self .trace_documents .values ():
162
167
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 ))
167
169
168
170
return seen
169
171
@@ -215,7 +217,7 @@ def _get_trace_documents(self, trace_ids: List[str]) -> Dict[str, TraceDocument]
215
217
return documents
216
218
217
219
218
- @retry (ValueError , delay = 10 , jitter = 1.5 , tries = 10 )
220
+ @retry (ValueError , delay = 5 , jitter = 1.5 , tries = 10 )
219
221
def get_traces (
220
222
filter_expression : str ,
221
223
start_date : datetime ,
0 commit comments