@@ -10,6 +10,7 @@ const kinds = require('../../../../../ext/kinds')
10
10
const urlFilter = require ( './urlfilter' )
11
11
const { extractIp } = require ( './ip_extractor' )
12
12
const { ERROR_MESSAGE , ERROR_TYPE , ERROR_STACK } = require ( '../../constants' )
13
+ const { createInferredProxySpan, finishInferredProxySpan } = require ( './inferred_proxy' )
13
14
14
15
const WEB = types . WEB
15
16
const SERVER = kinds . SERVER
@@ -97,7 +98,7 @@ const web = {
97
98
context . span . context ( ) . _name = name
98
99
span = context . span
99
100
} else {
100
- span = web . startChildSpan ( tracer , name , req . headers )
101
+ span = web . startChildSpan ( tracer , name , req )
101
102
}
102
103
103
104
context . tracer = tracer
@@ -253,8 +254,19 @@ const web = {
253
254
} ,
254
255
255
256
// Extract the parent span from the headers and start a new span as its child
256
- startChildSpan ( tracer , name , headers ) {
257
- const childOf = tracer . extract ( FORMAT_HTTP_HEADERS , headers )
257
+ startChildSpan ( tracer , name , req ) {
258
+ const headers = req . headers
259
+ const context = contexts . get ( req )
260
+ let childOf = tracer . extract ( FORMAT_HTTP_HEADERS , headers )
261
+
262
+ // we may have headers signaling a router proxy span should be created (such as for AWS API Gateway)
263
+ if ( tracer . _config ?. inferredProxyServicesEnabled ) {
264
+ const proxySpan = createInferredProxySpan ( headers , childOf , tracer , context )
265
+ if ( proxySpan ) {
266
+ childOf = proxySpan
267
+ }
268
+ }
269
+
258
270
const span = tracer . startSpan ( name , { childOf } )
259
271
260
272
return span
@@ -263,13 +275,21 @@ const web = {
263
275
// Validate a request's status code and then add error tags if necessary
264
276
addStatusError ( req , statusCode ) {
265
277
const context = contexts . get ( req )
266
- const span = context . span
267
- const error = context . error
268
- const hasExistingError = span . context ( ) . _tags . error || span . context ( ) . _tags [ ERROR_MESSAGE ]
278
+ const { span, inferredProxySpan, error } = context
279
+
280
+ const spanHasExistingError = span . context ( ) . _tags . error || span . context ( ) . _tags [ ERROR_MESSAGE ]
281
+ const inferredSpanContext = inferredProxySpan ?. context ( )
282
+ const inferredSpanHasExistingError = inferredSpanContext ?. _tags . error || inferredSpanContext ?. _tags [ ERROR_MESSAGE ]
269
283
270
- if ( ! hasExistingError && ! context . config . validateStatus ( statusCode ) ) {
284
+ const isValidStatusCode = context . config . validateStatus ( statusCode )
285
+
286
+ if ( ! spanHasExistingError && ! isValidStatusCode ) {
271
287
span . setTag ( ERROR , error || true )
272
288
}
289
+
290
+ if ( inferredProxySpan && ! inferredSpanHasExistingError && ! isValidStatusCode ) {
291
+ inferredProxySpan . setTag ( ERROR , error || true )
292
+ }
273
293
} ,
274
294
275
295
// Add an error to the request
@@ -316,6 +336,8 @@ const web = {
316
336
web . finishMiddleware ( context )
317
337
318
338
web . finishSpan ( context )
339
+
340
+ finishInferredProxySpan ( context )
319
341
} ,
320
342
321
343
obfuscateQs ( config , url ) {
@@ -426,7 +448,7 @@ function reactivate (req, fn) {
426
448
}
427
449
428
450
function addRequestTags ( context , spanType ) {
429
- const { req, span, config } = context
451
+ const { req, span, inferredProxySpan , config } = context
430
452
const url = extractURL ( req )
431
453
432
454
span . addTags ( {
@@ -443,14 +465,15 @@ function addRequestTags (context, spanType) {
443
465
444
466
if ( clientIp ) {
445
467
span . setTag ( HTTP_CLIENT_IP , clientIp )
468
+ inferredProxySpan ?. setTag ( HTTP_CLIENT_IP , clientIp )
446
469
}
447
470
}
448
471
449
472
addHeaders ( context )
450
473
}
451
474
452
475
function addResponseTags ( context ) {
453
- const { req, res, paths, span } = context
476
+ const { req, res, paths, span, inferredProxySpan } = context
454
477
455
478
if ( paths . length > 0 ) {
456
479
span . setTag ( HTTP_ROUTE , paths . join ( '' ) )
@@ -459,6 +482,9 @@ function addResponseTags (context) {
459
482
span . addTags ( {
460
483
[ HTTP_STATUS_CODE ] : res . statusCode
461
484
} )
485
+ inferredProxySpan ?. addTags ( {
486
+ [ HTTP_STATUS_CODE ] : res . statusCode
487
+ } )
462
488
463
489
web . addStatusError ( req , res . statusCode )
464
490
}
@@ -477,18 +503,20 @@ function addResourceTag (context) {
477
503
}
478
504
479
505
function addHeaders ( context ) {
480
- const { req, res, config, span } = context
506
+ const { req, res, config, span, inferredProxySpan } = context
481
507
482
508
config . headers . forEach ( ( [ key , tag ] ) => {
483
509
const reqHeader = req . headers [ key ]
484
510
const resHeader = res . getHeader ( key )
485
511
486
512
if ( reqHeader ) {
487
513
span . setTag ( tag || `${ HTTP_REQUEST_HEADERS } .${ key } ` , reqHeader )
514
+ inferredProxySpan ?. setTag ( tag || `${ HTTP_REQUEST_HEADERS } .${ key } ` , reqHeader )
488
515
}
489
516
490
517
if ( resHeader ) {
491
518
span . setTag ( tag || `${ HTTP_RESPONSE_HEADERS } .${ key } ` , resHeader )
519
+ inferredProxySpan ?. setTag ( tag || `${ HTTP_RESPONSE_HEADERS } .${ key } ` , resHeader )
492
520
}
493
521
} )
494
522
}
0 commit comments