@@ -19,6 +19,7 @@ const {
19
19
20
20
const region = process . env . REGION || 'us-east-1' ;
21
21
const released = process . env . RELEASED ? Boolean ( process . env . RELEASED ) : false ;
22
+ const filterTimedOuts = process . env . FILTER_TIMED_OUTS ? Boolean ( process . env . FILTER_TIMED_OUTS ) : false ;
22
23
const functionName = released ? 'teamnodejstracer-released-many-spans' : 'teamnodejstracer-many-spans' ;
23
24
const cloudWatchLogsClient = new CloudWatchLogsClient ( { region } ) ;
24
25
@@ -28,7 +29,7 @@ async function getFunctionUrl() {
28
29
return functionUrl ;
29
30
}
30
31
31
- const requests = 2 ;
32
+ const requests = process . env . REQUESTS ? parseInt ( process . env . REQUESTS , 10 ) : 10 ;
32
33
let logStreamsResponse ;
33
34
34
35
async function getBilledDurationByRequestId ( logGroupName , requestId ) {
@@ -49,9 +50,13 @@ async function getBilledDurationByRequestId(logGroupName, requestId) {
49
50
}
50
51
51
52
let billedDuration ;
53
+ let timeoutErrorFound = false ;
54
+ let requestIdStart = false ;
55
+ let requestIdEnd = false ;
56
+
52
57
for ( const obj of logStreamsResponse . logStreams ) {
53
58
const logStreamName = obj . logStreamName ;
54
- console . log ( `Log Stream Name: ${ logStreamName } ` ) ;
59
+ // console.log(`Log Stream Name: ${logStreamName}`);
55
60
56
61
const getLogEventsCommand = new GetLogEventsCommand ( {
57
62
logGroupName,
@@ -62,15 +67,34 @@ async function getBilledDurationByRequestId(logGroupName, requestId) {
62
67
const logEventsResponse = await cloudWatchLogsClient . send ( getLogEventsCommand ) ;
63
68
64
69
for ( const event of logEventsResponse . events ) {
70
+ if ( filterTimedOuts ) {
71
+ if ( requestIdStart && ! requestIdEnd ) {
72
+ if ( event . message . includes ( 'request failed' ) ) {
73
+ timeoutErrorFound = true ;
74
+ }
75
+ }
76
+ }
77
+
65
78
if ( event . message . includes ( requestId ) ) {
79
+ requestIdStart = true ;
66
80
const match = event . message . match ( / B i l l e d D u r a t i o n : ( \d + ) m s / ) ;
67
81
if ( match ) {
68
82
billedDuration = parseInt ( match [ 1 ] , 10 ) ;
69
83
}
84
+ } else if ( requestIdStart ) {
85
+ requestIdEnd = true ;
70
86
}
71
87
}
72
88
}
73
89
90
+ if ( filterTimedOuts ) {
91
+ if ( timeoutErrorFound ) {
92
+ return billedDuration ;
93
+ }
94
+
95
+ return null ;
96
+ }
97
+
74
98
if ( billedDuration ) {
75
99
return billedDuration ;
76
100
}
@@ -81,12 +105,16 @@ async function getBilledDurationByRequestId(logGroupName, requestId) {
81
105
async function loadTest ( ) {
82
106
const functionUrl = await getFunctionUrl ( ) ;
83
107
const logGroupName = `/aws/lambda/${ functionName } ` ;
84
- const requestIds = [ ] ;
85
- const responseTimes = [ ] ;
108
+ const requestIds = { } ;
86
109
87
110
console . log ( `Function Name: ${ functionName } ` ) ;
88
111
console . log ( `Function URL: ${ functionUrl } ` ) ;
89
- console . log ( 'Starting...' ) ;
112
+
113
+ if ( filterTimedOuts ) {
114
+ console . log ( 'Filtering requests by timed out.' ) ;
115
+ }
116
+
117
+ console . log ( `Executing ${ requests } ...` ) ;
90
118
91
119
// Avoid cold start
92
120
let response = await fetch ( functionUrl ) ;
@@ -97,36 +125,50 @@ async function loadTest() {
97
125
98
126
response = await fetch ( functionUrl ) ;
99
127
const requestId = response . headers . get ( 'x-amzn-requestid' ) ;
100
- requestIds . push ( requestId ) ;
101
128
102
129
const end = process . hrtime . bigint ( ) ;
103
-
104
130
const durationMs = Number ( end - start ) / 1e6 ;
105
- console . log ( `${ requestId } http response: ${ durationMs . toFixed ( 3 ) } ms` ) ;
106
131
107
- responseTimes . push ( durationMs ) ;
132
+ requestIds [ requestId ] = { durationMs } ;
108
133
109
134
await new Promise ( resolve => setTimeout ( resolve , 1000 ) ) ;
110
135
}
111
136
112
- // log the average response time for all requests responseTimes
113
- const averageResponseTime = responseTimes . reduce ( ( a , b ) => a + b , 0 ) / responseTimes . length ;
114
- console . log ( `Average Response Time: ${ averageResponseTime . toFixed ( 3 ) } ms` ) ;
137
+ console . log ( `Executed ${ requests } ...` ) ;
115
138
116
- console . log ( ` Fetching billed duration for ${ requestIds . length } requests...` ) ;
139
+ console . log ( ' Fetching billed duration...' ) ;
117
140
await new Promise ( resolve => setTimeout ( resolve , 1000 * 120 ) ) ;
118
141
119
142
const billedDurations = [ ] ;
120
- for ( const id of requestIds ) {
143
+ for ( const id of Object . keys ( requestIds ) ) {
121
144
try {
122
145
const billedDuration = await getBilledDurationByRequestId ( logGroupName , id ) ;
146
+
147
+ if ( ! billedDuration ) {
148
+ delete requestIds [ id ] ;
149
+ continue ;
150
+ }
151
+
152
+ console . log ( `${ id } HTTP Response Time: ${ requestIds [ id ] . durationMs } ms` ) ;
123
153
console . log ( `${ id } Billed: ${ billedDuration } ms` ) ;
124
154
billedDurations . push ( billedDuration ) ;
125
155
} catch ( error ) {
126
156
console . error ( `Failed to get billed duration for Request ${ id } :` , error . message ) ;
127
157
}
128
158
}
129
159
160
+ if ( Object . keys ( requestIds ) . length === 0 ) {
161
+ console . error ( 'No results.' ) ;
162
+ return ;
163
+ }
164
+
165
+ console . log ( `Total Requests: ${ Object . keys ( requestIds ) . length } ` ) ;
166
+
167
+ // log the average response time for all requests responseTimes
168
+ const averageResponseTime =
169
+ Object . values ( requestIds ) . reduce ( ( a , b ) => a + b . durationMs , 0 ) / Object . keys ( requestIds ) . length ;
170
+ console . log ( `Average Response Time: ${ averageResponseTime . toFixed ( 3 ) } ms` ) ;
171
+
130
172
// log the average billed duration for all requests billedDurations
131
173
const averageBilledDuration = billedDurations . reduce ( ( a , b ) => a + b , 0 ) / billedDurations . length ;
132
174
console . log ( `Average Billed Duration: ${ averageBilledDuration . toFixed ( 3 ) } ms` ) ;
0 commit comments