Skip to content

Commit 93e63b2

Browse files
committed
chore: extract helper function
1 parent ab78a70 commit 93e63b2

File tree

1 file changed

+47
-29
lines changed

1 file changed

+47
-29
lines changed

packages/testing/src/xray-traces-utils.ts

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
BatchGetTracesCommand,
33
GetTraceSummariesCommand,
4+
type Trace,
45
XRayClient,
56
} from '@aws-sdk/client-xray';
67
import promiseRetry from 'promise-retry';
@@ -87,10 +88,49 @@ const retriableGetTraceIds = (options: GetXRayTraceIdsOptions) =>
8788
}
8889
});
8990

91+
/**
92+
* Parse and sort the trace segments by start time
93+
*
94+
* @param trace - The trace to parse and sort
95+
* @param expectedSegmentsCount - The expected segments count for the trace
96+
*/
97+
const parseAndSortTrace = (trace: Trace, expectedSegmentsCount: number) => {
98+
const { Id: id, Segments: segments } = trace;
99+
if (segments === undefined || segments.length !== expectedSegmentsCount) {
100+
throw new Error(
101+
`Expected ${expectedSegmentsCount} segments, got ${segments ? segments.length : 0} for traceId ${trace.Id}`
102+
);
103+
}
104+
105+
const parsedSegments: XRaySegmentParsed[] = [];
106+
for (const segment of segments) {
107+
const { Id, Document } = segment;
108+
if (Document === undefined || Id === undefined) {
109+
throw new Error(
110+
`Segment document or id are missing for traceId ${trace.Id}`
111+
);
112+
}
113+
114+
parsedSegments.push({
115+
Id,
116+
Document: JSON.parse(Document) as XRayTraceDocumentParsed,
117+
});
118+
}
119+
const sortedSegments = parsedSegments.sort(
120+
(a, b) => a.Document.start_time - b.Document.start_time
121+
);
122+
123+
return {
124+
Id: id as string,
125+
Segments: sortedSegments,
126+
};
127+
};
128+
90129
/**
91130
* Get the trace details for a given trace ID from the AWS X-Ray API.
92131
*
93-
* When the trace is returned, the segments are parsed, since the document is returned as a string.
132+
* When the trace is returned, the segments are parsed, since the document is returned
133+
* stringified, and then sorted by start time.
94134
*
95135
* @param options - The options to get trace details, including the trace IDs and expected segments count
96136
*/
@@ -112,37 +152,15 @@ const getTraceDetails = async (
112152
);
113153
}
114154

115-
const parsedTraces: XRayTraceParsed[] = [];
155+
const parsedAndSortedTraces: XRayTraceParsed[] = [];
116156
for (const trace of traces) {
117-
const { Id: id, Segments: segments } = trace;
118-
if (segments === undefined || segments.length !== expectedSegmentsCount) {
119-
throw new Error(
120-
`Expected ${expectedSegmentsCount} segments, got ${segments ? segments.length : 0} for traceId ${trace.Id}`
121-
);
122-
}
123-
124-
const parsedSegments: XRaySegmentParsed[] = [];
125-
for (const segment of segments) {
126-
const { Id, Document } = segment;
127-
if (Document === undefined || Id === undefined) {
128-
throw new Error(
129-
`Segment document or id are missing for traceId ${trace.Id}`
130-
);
131-
}
132-
133-
parsedSegments.push({
134-
Id,
135-
Document: JSON.parse(Document) as XRayTraceDocumentParsed,
136-
});
137-
}
138-
139-
parsedTraces.push({
140-
Id: id as string,
141-
Segments: parsedSegments,
142-
});
157+
parsedAndSortedTraces.push(parseAndSortTrace(trace, expectedSegmentsCount));
143158
}
144159

145-
return parsedTraces;
160+
return parsedAndSortedTraces.sort(
161+
(a, b) =>
162+
a.Segments[0].Document.start_time - b.Segments[0].Document.start_time
163+
);
146164
};
147165

148166
/**

0 commit comments

Comments
 (0)