From d4cc87798423d140d9e73bfa34e5bc64981cfb86 Mon Sep 17 00:00:00 2001 From: Carles Capell Date: Sun, 4 Jan 2026 19:37:07 +0100 Subject: [PATCH 1/6] Standarize Span type with 'web' value --- src/trace/span-inferrer.spec.ts | 32 ++++++++++++++++---------------- src/trace/span-inferrer.ts | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/trace/span-inferrer.spec.ts b/src/trace/span-inferrer.spec.ts index 19eb5709..84ac2b86 100644 --- a/src/trace/span-inferrer.spec.ts +++ b/src/trace/span-inferrer.spec.ts @@ -899,7 +899,7 @@ describe("SpanInferrer", () => { service: "08se3mvh28.execute-api.eu-west-1.amazonaws.com", "service.name": "08se3mvh28.execute-api.eu-west-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", }, }); }); @@ -926,7 +926,7 @@ describe("SpanInferrer", () => { service: "id.execute-api.us-east-1.amazonaws.com", "service.name": "id.execute-api.us-east-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", stage: "$default", }, }); @@ -954,7 +954,7 @@ describe("SpanInferrer", () => { service: "r3pmxmplak.execute-api.us-east-2.amazonaws.com", "service.name": "r3pmxmplak.execute-api.us-east-2.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", stage: "default", }, }); @@ -982,7 +982,7 @@ describe("SpanInferrer", () => { service: "mcwkra0ya4.execute-api.sa-east-1.amazonaws.com", "service.name": "mcwkra0ya4.execute-api.sa-east-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", stage: "dev", }, }); @@ -1010,7 +1010,7 @@ describe("SpanInferrer", () => { service: "9vj54we5ih.execute-api.sa-east-1.amazonaws.com", "service.name": "9vj54we5ih.execute-api.sa-east-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", stage: "$default", }, }); @@ -1126,7 +1126,7 @@ describe("Authorizer Spans", () => { service: "3gsxz7lha4.execute-api.eu-west-1.amazonaws.com", "service.name": "3gsxz7lha4.execute-api.eu-west-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", stage: "dev", }, }, @@ -1151,7 +1151,7 @@ describe("Authorizer Spans", () => { service: "3gsxz7lha4.execute-api.eu-west-1.amazonaws.com", "service.name": "3gsxz7lha4.execute-api.eu-west-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", stage: "dev", }, }, @@ -1181,7 +1181,7 @@ describe("Authorizer Spans", () => { service: "3gsxz7lha4.execute-api.eu-west-1.amazonaws.com", "service.name": "3gsxz7lha4.execute-api.eu-west-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", stage: "dev", }, }, @@ -1211,7 +1211,7 @@ describe("Authorizer Spans", () => { service: "4dyr9xqip7.execute-api.eu-west-1.amazonaws.com", "service.name": "4dyr9xqip7.execute-api.eu-west-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", stage: "dev", }, }, @@ -1236,7 +1236,7 @@ describe("Authorizer Spans", () => { service: "4dyr9xqip7.execute-api.eu-west-1.amazonaws.com", "service.name": "4dyr9xqip7.execute-api.eu-west-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", stage: "dev", }, }, @@ -1266,7 +1266,7 @@ describe("Authorizer Spans", () => { service: "4dyr9xqip7.execute-api.eu-west-1.amazonaws.com", "service.name": "4dyr9xqip7.execute-api.eu-west-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", stage: "dev", }, }, @@ -1296,7 +1296,7 @@ describe("Authorizer Spans", () => { service: "l9flvsey83.execute-api.eu-west-1.amazonaws.com", "service.name": "l9flvsey83.execute-api.eu-west-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", stage: "$default", }, }, @@ -1326,7 +1326,7 @@ describe("Authorizer Spans", () => { service: "l9flvsey83.execute-api.eu-west-1.amazonaws.com", "service.name": "l9flvsey83.execute-api.eu-west-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", stage: "$default", }, }, @@ -1357,7 +1357,7 @@ describe("Authorizer Spans", () => { service: "85fj5nw29d.execute-api.eu-west-1.amazonaws.com", "service.name": "85fj5nw29d.execute-api.eu-west-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", }, }, ]); @@ -1382,7 +1382,7 @@ describe("Authorizer Spans", () => { service: "85fj5nw29d.execute-api.eu-west-1.amazonaws.com", "service.name": "85fj5nw29d.execute-api.eu-west-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", }, }, ]); @@ -1412,7 +1412,7 @@ describe("Authorizer Spans", () => { service: "85fj5nw29d.execute-api.eu-west-1.amazonaws.com", "service.name": "85fj5nw29d.execute-api.eu-west-1.amazonaws.com", "span.kind": "server", - "span.type": "http", + "span.type": "web", }, }, ]); diff --git a/src/trace/span-inferrer.ts b/src/trace/span-inferrer.ts index 34466006..c9d1f82c 100644 --- a/src/trace/span-inferrer.ts +++ b/src/trace/span-inferrer.ts @@ -127,7 +127,7 @@ export class SpanInferrer { request_id: context?.awsRequestId, service: serviceName, "service.name": serviceName, - "span.type": "http", + "span.type": "web", "resource.name": resourceName, "peer.service": this.service, "span.kind": "server", From b0e1346dba248fdbb02dd03ac2c6c172d97a0050 Mon Sep 17 00:00:00 2001 From: Carles Capell Date: Sun, 4 Jan 2026 19:52:09 +0100 Subject: [PATCH 2/6] Remove operation_name for API GW inferred spans --- src/trace/span-inferrer.spec.ts | 16 ---------------- src/trace/span-inferrer.ts | 4 +--- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/src/trace/span-inferrer.spec.ts b/src/trace/span-inferrer.spec.ts index 84ac2b86..d5b22ca7 100644 --- a/src/trace/span-inferrer.spec.ts +++ b/src/trace/span-inferrer.spec.ts @@ -891,7 +891,6 @@ describe("SpanInferrer", () => { event_type: "CONNECT", "http.url": "https://08se3mvh28.execute-api.eu-west-1.amazonaws.com$connect", message_direction: "IN", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "resource.name": "08se3mvh28.execute-api.eu-west-1.amazonaws.com $connect", @@ -917,7 +916,6 @@ describe("SpanInferrer", () => { endpoint: "/my/path", "http.url": "https://id.execute-api.us-east-1.amazonaws.com/my/path", domain_name: "id.execute-api.us-east-1.amazonaws.com", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "http.method": "GET", @@ -945,7 +943,6 @@ describe("SpanInferrer", () => { endpoint: "/default/nodejs-apig-function-1G3XMPLZXVXYI", "http.url": "https://r3pmxmplak.execute-api.us-east-2.amazonaws.com/default/nodejs-apig-function-1G3XMPLZXVXYI", domain_name: "r3pmxmplak.execute-api.us-east-2.amazonaws.com", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "http.method": "GET", @@ -973,7 +970,6 @@ describe("SpanInferrer", () => { endpoint: "/dev/user/42", "http.url": "https://mcwkra0ya4.execute-api.sa-east-1.amazonaws.com/dev/user/42", domain_name: "mcwkra0ya4.execute-api.sa-east-1.amazonaws.com", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "http.method": "GET", @@ -1001,7 +997,6 @@ describe("SpanInferrer", () => { endpoint: "/user/42", "http.url": "https://9vj54we5ih.execute-api.sa-east-1.amazonaws.com/user/42", domain_name: "9vj54we5ih.execute-api.sa-east-1.amazonaws.com", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "http.method": "GET", @@ -1118,7 +1113,6 @@ describe("Authorizer Spans", () => { endpoint: "/dev/hello", "http.method": "POST", "http.url": "https://3gsxz7lha4.execute-api.eu-west-1.amazonaws.com/dev/hello", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "resource.name": "POST /hello", @@ -1143,7 +1137,6 @@ describe("Authorizer Spans", () => { endpoint: "/dev/hello", "http.method": "POST", "http.url": "https://3gsxz7lha4.execute-api.eu-west-1.amazonaws.com/dev/hello", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "resource.name": "POST /hello", @@ -1173,7 +1166,6 @@ describe("Authorizer Spans", () => { endpoint: "/dev/hello", "http.method": "POST", "http.url": "https://3gsxz7lha4.execute-api.eu-west-1.amazonaws.com/dev/hello", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "resource.name": "POST /hello", @@ -1203,7 +1195,6 @@ describe("Authorizer Spans", () => { endpoint: "/dev/hi", "http.method": "GET", "http.url": "https://4dyr9xqip7.execute-api.eu-west-1.amazonaws.com/dev/hi", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "resource.name": "GET /hi", @@ -1228,7 +1219,6 @@ describe("Authorizer Spans", () => { endpoint: "/dev/hi", "http.method": "GET", "http.url": "https://4dyr9xqip7.execute-api.eu-west-1.amazonaws.com/dev/hi", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "resource.name": "GET /hi", @@ -1258,7 +1248,6 @@ describe("Authorizer Spans", () => { endpoint: "/dev/hi", "http.method": "GET", "http.url": "https://4dyr9xqip7.execute-api.eu-west-1.amazonaws.com/dev/hi", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "resource.name": "GET /hi", @@ -1288,7 +1277,6 @@ describe("Authorizer Spans", () => { endpoint: "/hello", "http.method": "GET", "http.url": "https://l9flvsey83.execute-api.eu-west-1.amazonaws.com/hello", - operation_name: "aws.httpapi", "peer.service": "mock-lambda-service", request_id: undefined, "resource.name": "GET /hello", @@ -1318,7 +1306,6 @@ describe("Authorizer Spans", () => { endpoint: "/hello", "http.method": "GET", "http.url": "https://l9flvsey83.execute-api.eu-west-1.amazonaws.com/hello", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "resource.name": "GET /hello", @@ -1349,7 +1336,6 @@ describe("Authorizer Spans", () => { event_type: "CONNECT", "http.url": "https://85fj5nw29d.execute-api.eu-west-1.amazonaws.com$connect", message_direction: "IN", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "resource.name": "85fj5nw29d.execute-api.eu-west-1.amazonaws.com $connect", @@ -1374,7 +1360,6 @@ describe("Authorizer Spans", () => { event_type: "CONNECT", "http.url": "https://85fj5nw29d.execute-api.eu-west-1.amazonaws.com$connect", message_direction: "IN", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "resource.name": "85fj5nw29d.execute-api.eu-west-1.amazonaws.com $connect", @@ -1404,7 +1389,6 @@ describe("Authorizer Spans", () => { event_type: "MESSAGE", "http.url": "https://85fj5nw29d.execute-api.eu-west-1.amazonaws.comhello", message_direction: "IN", - operation_name: "aws.apigateway", "peer.service": "mock-lambda-service", request_id: undefined, "resource.name": "85fj5nw29d.execute-api.eu-west-1.amazonaws.com hello", diff --git a/src/trace/span-inferrer.ts b/src/trace/span-inferrer.ts index c9d1f82c..649f5804 100644 --- a/src/trace/span-inferrer.ts +++ b/src/trace/span-inferrer.ts @@ -120,7 +120,6 @@ export class SpanInferrer { const serviceName = SpanInferrer.determineServiceName(apiId, "lambda_api_gateway", domain, domain); options.tags = { - operation_name: "aws.apigateway", "http.url": httpUrl, endpoint: path, resource_names: resourceName, @@ -160,12 +159,11 @@ export class SpanInferrer { // getting an approximated endTime if (eventSourceSubType === HTTPEventSubType.ApiGatewayV2) { options.startTime = startTime; // not inserting authorizer span - options.tags.operation_name = "aws.httpapi"; } else { upstreamSpanOptions = { startTime, childOf: parentSpanContext, - tags: { operation_name: "aws.apigateway.authorizer", ...options.tags }, + tags: { ...options.tags }, }; upstreamAuthorizerSpan = new SpanWrapper( this.traceWrapper.startSpan("aws.apigateway.authorizer", upstreamSpanOptions), From 0934046f471598391533081b2b6d9d9de827e9f9 Mon Sep 17 00:00:00 2001 From: Carles Capell Date: Wed, 21 Jan 2026 21:53:05 +0100 Subject: [PATCH 3/6] Update integration tests snapshots --- integration_tests/snapshots/logs/esm_node18.log | 3 +-- integration_tests/snapshots/logs/esm_node20.log | 3 +-- integration_tests/snapshots/logs/esm_node22.log | 3 +-- integration_tests/snapshots/logs/esm_node24.log | 3 +-- .../snapshots/logs/process-input-traced_node18.log | 3 +-- .../snapshots/logs/process-input-traced_node20.log | 3 +-- .../snapshots/logs/process-input-traced_node22.log | 3 +-- .../snapshots/logs/process-input-traced_node24.log | 3 +-- integration_tests/snapshots/logs/status-code-500s_node18.log | 3 +-- integration_tests/snapshots/logs/status-code-500s_node20.log | 3 +-- integration_tests/snapshots/logs/status-code-500s_node22.log | 3 +-- integration_tests/snapshots/logs/status-code-500s_node24.log | 3 +-- 12 files changed, 12 insertions(+), 24 deletions(-) diff --git a/integration_tests/snapshots/logs/esm_node18.log b/integration_tests/snapshots/logs/esm_node18.log index 7e97d980..6fb522b6 100644 --- a/integration_tests/snapshots/logs/esm_node18.log +++ b/integration_tests/snapshots/logs/esm_node18.log @@ -31,7 +31,6 @@ START "_dd.origin": "lambda", "service": "remappedApiGatewayServiceName", "runtime-id":"XXXX", - "operation_name": "aws.apigateway", "http.url": "https://undefined", "resource_names": "GET /{proxy+}", "request_id":"XXXX", @@ -58,7 +57,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", diff --git a/integration_tests/snapshots/logs/esm_node20.log b/integration_tests/snapshots/logs/esm_node20.log index 5ba9f569..7e9b3816 100644 --- a/integration_tests/snapshots/logs/esm_node20.log +++ b/integration_tests/snapshots/logs/esm_node20.log @@ -31,7 +31,6 @@ START "_dd.origin": "lambda", "service": "remappedApiGatewayServiceName", "runtime-id":"XXXX", - "operation_name": "aws.apigateway", "http.url": "https://undefined", "resource_names": "GET /{proxy+}", "request_id":"XXXX", @@ -58,7 +57,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", diff --git a/integration_tests/snapshots/logs/esm_node22.log b/integration_tests/snapshots/logs/esm_node22.log index 24cc90b7..dc8461e8 100644 --- a/integration_tests/snapshots/logs/esm_node22.log +++ b/integration_tests/snapshots/logs/esm_node22.log @@ -31,7 +31,6 @@ START "_dd.origin": "lambda", "service": "remappedApiGatewayServiceName", "runtime-id":"XXXX", - "operation_name": "aws.apigateway", "http.url": "https://undefined", "resource_names": "GET /{proxy+}", "request_id":"XXXX", @@ -58,7 +57,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", diff --git a/integration_tests/snapshots/logs/esm_node24.log b/integration_tests/snapshots/logs/esm_node24.log index 795981b9..ce75219f 100644 --- a/integration_tests/snapshots/logs/esm_node24.log +++ b/integration_tests/snapshots/logs/esm_node24.log @@ -31,7 +31,6 @@ START "_dd.origin": "lambda", "service": "remappedApiGatewayServiceName", "runtime-id":"XXXX", - "operation_name": "aws.apigateway", "http.url": "https://undefined", "resource_names": "GET /{proxy+}", "request_id":"XXXX", @@ -58,7 +57,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", diff --git a/integration_tests/snapshots/logs/process-input-traced_node18.log b/integration_tests/snapshots/logs/process-input-traced_node18.log index e09dca39..23dd6c32 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node18.log +++ b/integration_tests/snapshots/logs/process-input-traced_node18.log @@ -39,7 +39,6 @@ START "_dd.p.dm": "-0", "service": "remappedApiGatewayServiceName", "runtime-id":"XXXX", - "operation_name": "aws.apigateway", "http.url": "https://undefined", "resource_names": "GET /{proxy+}", "request_id":"XXXX", @@ -66,7 +65,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", diff --git a/integration_tests/snapshots/logs/process-input-traced_node20.log b/integration_tests/snapshots/logs/process-input-traced_node20.log index 5bb896f7..da814a0b 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node20.log +++ b/integration_tests/snapshots/logs/process-input-traced_node20.log @@ -39,7 +39,6 @@ START "_dd.p.dm": "-0", "service": "remappedApiGatewayServiceName", "runtime-id":"XXXX", - "operation_name": "aws.apigateway", "http.url": "https://undefined", "resource_names": "GET /{proxy+}", "request_id":"XXXX", @@ -66,7 +65,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", diff --git a/integration_tests/snapshots/logs/process-input-traced_node22.log b/integration_tests/snapshots/logs/process-input-traced_node22.log index c2ff6932..c9c1dc0c 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node22.log +++ b/integration_tests/snapshots/logs/process-input-traced_node22.log @@ -39,7 +39,6 @@ START "_dd.p.dm": "-0", "service": "remappedApiGatewayServiceName", "runtime-id":"XXXX", - "operation_name": "aws.apigateway", "http.url": "https://undefined", "resource_names": "GET /{proxy+}", "request_id":"XXXX", @@ -66,7 +65,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", diff --git a/integration_tests/snapshots/logs/process-input-traced_node24.log b/integration_tests/snapshots/logs/process-input-traced_node24.log index 5c953471..e48c351b 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node24.log +++ b/integration_tests/snapshots/logs/process-input-traced_node24.log @@ -39,7 +39,6 @@ START "_dd.p.dm": "-0", "service": "remappedApiGatewayServiceName", "runtime-id":"XXXX", - "operation_name": "aws.apigateway", "http.url": "https://undefined", "resource_names": "GET /{proxy+}", "request_id":"XXXX", @@ -66,7 +65,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", diff --git a/integration_tests/snapshots/logs/status-code-500s_node18.log b/integration_tests/snapshots/logs/status-code-500s_node18.log index 7476d1b1..63d2eecb 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node18.log +++ b/integration_tests/snapshots/logs/status-code-500s_node18.log @@ -45,7 +45,6 @@ START "_dd.p.dm": "-0", "service": "remappedApiGatewayServiceName", "runtime-id":"XXXX", - "operation_name": "aws.apigateway", "http.url": "https://undefined", "resource_names": "GET /{proxy+}", "request_id":"XXXX", @@ -72,7 +71,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", diff --git a/integration_tests/snapshots/logs/status-code-500s_node20.log b/integration_tests/snapshots/logs/status-code-500s_node20.log index 913972aa..1c807dbf 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node20.log +++ b/integration_tests/snapshots/logs/status-code-500s_node20.log @@ -45,7 +45,6 @@ START "_dd.p.dm": "-0", "service": "remappedApiGatewayServiceName", "runtime-id":"XXXX", - "operation_name": "aws.apigateway", "http.url": "https://undefined", "resource_names": "GET /{proxy+}", "request_id":"XXXX", @@ -72,7 +71,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", diff --git a/integration_tests/snapshots/logs/status-code-500s_node22.log b/integration_tests/snapshots/logs/status-code-500s_node22.log index 5a2badea..0800402b 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node22.log +++ b/integration_tests/snapshots/logs/status-code-500s_node22.log @@ -45,7 +45,6 @@ START "_dd.p.dm": "-0", "service": "remappedApiGatewayServiceName", "runtime-id":"XXXX", - "operation_name": "aws.apigateway", "http.url": "https://undefined", "resource_names": "GET /{proxy+}", "request_id":"XXXX", @@ -72,7 +71,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", diff --git a/integration_tests/snapshots/logs/status-code-500s_node24.log b/integration_tests/snapshots/logs/status-code-500s_node24.log index 0c450fb2..d04918a8 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node24.log +++ b/integration_tests/snapshots/logs/status-code-500s_node24.log @@ -45,7 +45,6 @@ START "_dd.p.dm": "-0", "service": "remappedApiGatewayServiceName", "runtime-id":"XXXX", - "operation_name": "aws.apigateway", "http.url": "https://undefined", "resource_names": "GET /{proxy+}", "request_id":"XXXX", @@ -72,7 +71,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", From 03e39767cede2352210629e050d6eeebff4bda9d Mon Sep 17 00:00:00 2001 From: Carles Capell Date: Wed, 4 Feb 2026 10:50:52 +0100 Subject: [PATCH 4/6] Update span name for API Gateway v2 --- src/trace/span-inferrer.spec.ts | 8 ++++---- src/trace/span-inferrer.ts | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/trace/span-inferrer.spec.ts b/src/trace/span-inferrer.spec.ts index d5b22ca7..33125925 100644 --- a/src/trace/span-inferrer.spec.ts +++ b/src/trace/span-inferrer.spec.ts @@ -934,7 +934,7 @@ describe("SpanInferrer", () => { const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); inferrer.createInferredSpan(apiGatewayV2, {} as any, {} as SpanContext); - expect(mockWrapper.startSpan).toBeCalledWith("aws.apigateway", { + expect(mockWrapper.startSpan).toBeCalledWith("aws.httpapi", { childOf: {}, startTime: 1583817383220, tags: { @@ -988,7 +988,7 @@ describe("SpanInferrer", () => { const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); inferrer.createInferredSpan(apiGatewayV2Parametrized, {} as any, {} as SpanContext); - expect(mockWrapper.startSpan).toBeCalledWith("aws.apigateway", { + expect(mockWrapper.startSpan).toBeCalledWith("aws.httpapi", { childOf: {}, startTime: 1710529905066, tags: { @@ -1266,7 +1266,7 @@ describe("Authorizer Spans", () => { const inferrer = new SpanInferrer(mockWrapperWithFinish as unknown as TracerWrapper); inferrer.createInferredSpan(apiGatewayV2RequestAuthorizer, {} as any, {} as SpanContext); expect(mockWrapperWithFinish.startSpan.mock.calls[0]).toEqual([ - "aws.apigateway", + "aws.httpapi", { childOf: {}, startTime: 1665596771812, @@ -1295,7 +1295,7 @@ describe("Authorizer Spans", () => { const inferrer = new SpanInferrer(mockWrapperWithFinish as unknown as TracerWrapper); inferrer.createInferredSpan(apiGatewayV2TokenAuthorizerCached, {} as any, {} as SpanContext); expect(mockWrapperWithFinish.startSpan.mock.calls[0]).toEqual([ - "aws.apigateway", + "aws.httpapi", { childOf: {}, startTime: 1665596856876, diff --git a/src/trace/span-inferrer.ts b/src/trace/span-inferrer.ts index 649f5804..3846bb24 100644 --- a/src/trace/span-inferrer.ts +++ b/src/trace/span-inferrer.ts @@ -194,7 +194,8 @@ export class SpanInferrer { const spanWrapperOptions = { isAsync: this.isApiGatewayAsync(event) === "async", }; - return new SpanWrapper(this.traceWrapper.startSpan("aws.apigateway", options), spanWrapperOptions); + const spanName = eventSourceSubType === HTTPEventSubType.ApiGatewayV2 ? "aws.httpapi" : "aws.apigateway"; + return new SpanWrapper(this.traceWrapper.startSpan(spanName, options), spanWrapperOptions); } createInferredSpanForLambdaUrl( From 22c988ced7e4c84a07b1918cd998e565e41a5e0d Mon Sep 17 00:00:00 2001 From: Carles Capell Date: Wed, 4 Feb 2026 10:56:28 +0100 Subject: [PATCH 5/6] Add dd_resource_key with API Gateway ARN to inferred spans --- src/trace/span-inferrer.spec.ts | 41 +++++++++++++++++++++++++++++++++ src/trace/span-inferrer.ts | 14 +++++++++++ 2 files changed, 55 insertions(+) diff --git a/src/trace/span-inferrer.spec.ts b/src/trace/span-inferrer.spec.ts index 33125925..8fe458bd 100644 --- a/src/trace/span-inferrer.spec.ts +++ b/src/trace/span-inferrer.spec.ts @@ -1011,6 +1011,47 @@ describe("SpanInferrer", () => { }); }); + it("sets dd_resource_key with restapis ARN for API Gateway V1 events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + const mockContext = { + invokedFunctionArn: "arn:aws:lambda:us-east-1:123456789012:function:my-function", + }; + inferrer.createInferredSpan(apiGatewayV1, mockContext as any, {} as SpanContext); + + const callArgs = mockWrapper.startSpan.mock.calls[0]; + expect(callArgs[1].tags.dd_resource_key).toBe("arn:aws:apigateway:us-east-1::/restapis/id"); + }); + + it("sets dd_resource_key with apis ARN for API Gateway V2 events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + const mockContext = { + invokedFunctionArn: "arn:aws:lambda:us-east-2:123456789012:function:my-function", + }; + inferrer.createInferredSpan(apiGatewayV2, mockContext as any, {} as SpanContext); + + const callArgs = mockWrapper.startSpan.mock.calls[0]; + expect(callArgs[1].tags.dd_resource_key).toBe("arn:aws:apigateway:us-east-2::/apis/r3pmxmplak"); + }); + + it("sets dd_resource_key with restapis ARN for WebSocket events", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + const mockContext = { + invokedFunctionArn: "arn:aws:lambda:us-east-1:123456789012:function:my-function", + }; + inferrer.createInferredSpan(webSocketEvent, mockContext as any, {} as SpanContext); + + const callArgs = mockWrapper.startSpan.mock.calls[0]; + expect(callArgs[1].tags.dd_resource_key).toBe("arn:aws:apigateway:us-east-1::/restapis/08se3mvh28"); + }); + + it("does not set dd_resource_key when context is missing invokedFunctionArn", () => { + const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); + inferrer.createInferredSpan(apiGatewayV1, {} as any, {} as SpanContext); + + const callArgs = mockWrapper.startSpan.mock.calls[0]; + expect(callArgs[1].tags.dd_resource_key).toBeUndefined(); + }); + it("creates an inferred span for Lambda Function URL Events", () => { const inferrer = new SpanInferrer(mockWrapper as unknown as TracerWrapper); inferrer.createInferredSpan(functionUrlEvent, {} as any, {} as SpanContext); diff --git a/src/trace/span-inferrer.ts b/src/trace/span-inferrer.ts index 3846bb24..88a62579 100644 --- a/src/trace/span-inferrer.ts +++ b/src/trace/span-inferrer.ts @@ -13,6 +13,7 @@ import { eventTypes, parseEventSource } from "./trigger"; import { SpanWrapper } from "./span-wrapper"; import { DD_SERVICE_ENV_VAR, parentSpanFinishTimeHeader } from "./constants"; import { logDebug } from "../utils"; +import { parseLambdaARN } from "../utils/arn"; import { HTTPEventTraceExtractor } from "./context/extractors"; import { HTTPEventSubType } from "./context/extractors/http"; @@ -189,6 +190,19 @@ export class SpanInferrer { options.startTime = event.requestContext.timeEpoch; } } + + // Compute API Gateway ARN for dd_resource_key + if (context?.invokedFunctionArn && apiId) { + const { region } = parseLambdaARN(context.invokedFunctionArn); + if (region) { + const apiGatewayArn = + eventSourceSubType === HTTPEventSubType.ApiGatewayV2 + ? `arn:aws:apigateway:${region}::/apis/${apiId}` + : `arn:aws:apigateway:${region}::/restapis/${apiId}`; + options.tags.dd_resource_key = apiGatewayArn; + } + } + options.childOf = upstreamAuthorizerSpan ? upstreamAuthorizerSpan.span : parentSpanContext; const spanWrapperOptions = { From 4e72af59b6e5eb45de69f7213ea9a4e0a67a7d66 Mon Sep 17 00:00:00 2001 From: Carles Capell Date: Wed, 4 Feb 2026 11:51:27 +0100 Subject: [PATCH 6/6] Update integration tests snapshots --- integration_tests/snapshots/logs/esm_node18.log | 1 + integration_tests/snapshots/logs/esm_node20.log | 1 + integration_tests/snapshots/logs/esm_node22.log | 1 + integration_tests/snapshots/logs/esm_node24.log | 1 + .../snapshots/logs/process-input-traced_node18.log | 1 + .../snapshots/logs/process-input-traced_node20.log | 1 + .../snapshots/logs/process-input-traced_node22.log | 1 + .../snapshots/logs/process-input-traced_node24.log | 1 + integration_tests/snapshots/logs/status-code-500s_node18.log | 1 + integration_tests/snapshots/logs/status-code-500s_node20.log | 1 + integration_tests/snapshots/logs/status-code-500s_node22.log | 3 ++- integration_tests/snapshots/logs/status-code-500s_node24.log | 1 + 12 files changed, 13 insertions(+), 1 deletion(-) diff --git a/integration_tests/snapshots/logs/esm_node18.log b/integration_tests/snapshots/logs/esm_node18.log index 6fb522b6..e4316288 100644 --- a/integration_tests/snapshots/logs/esm_node18.log +++ b/integration_tests/snapshots/logs/esm_node18.log @@ -41,6 +41,7 @@ START "http.method": "GET", "stage": "test", "domain_name": "", + "dd_resource_key": "arn:aws:apigateway:eu-west-1::/restapis/wt6mne2s9k", "http.status_code": "200", "_dd.integration": "opentracing", "_dd.base_service": "integration-tests-js-XXXX-esm_node18", diff --git a/integration_tests/snapshots/logs/esm_node20.log b/integration_tests/snapshots/logs/esm_node20.log index 7e9b3816..e23e1c47 100644 --- a/integration_tests/snapshots/logs/esm_node20.log +++ b/integration_tests/snapshots/logs/esm_node20.log @@ -41,6 +41,7 @@ START "http.method": "GET", "stage": "test", "domain_name": "", + "dd_resource_key": "arn:aws:apigateway:eu-west-1::/restapis/wt6mne2s9k", "http.status_code": "200", "_dd.integration": "opentracing", "_dd.base_service": "integration-tests-js-XXXX-esm_node20", diff --git a/integration_tests/snapshots/logs/esm_node22.log b/integration_tests/snapshots/logs/esm_node22.log index dc8461e8..a4624c46 100644 --- a/integration_tests/snapshots/logs/esm_node22.log +++ b/integration_tests/snapshots/logs/esm_node22.log @@ -41,6 +41,7 @@ START "http.method": "GET", "stage": "test", "domain_name": "", + "dd_resource_key": "arn:aws:apigateway:eu-west-1::/restapis/wt6mne2s9k", "http.status_code": "200", "_dd.integration": "opentracing", "_dd.base_service": "integration-tests-js-XXXX-esm_node22", diff --git a/integration_tests/snapshots/logs/esm_node24.log b/integration_tests/snapshots/logs/esm_node24.log index ce75219f..a6df44fd 100644 --- a/integration_tests/snapshots/logs/esm_node24.log +++ b/integration_tests/snapshots/logs/esm_node24.log @@ -41,6 +41,7 @@ START "http.method": "GET", "stage": "test", "domain_name": "", + "dd_resource_key": "arn:aws:apigateway:eu-west-1::/restapis/wt6mne2s9k", "http.status_code": "200", "_dd.integration": "opentracing", "_dd.base_service": "integration-tests-js-XXXX-esm_node24", diff --git a/integration_tests/snapshots/logs/process-input-traced_node18.log b/integration_tests/snapshots/logs/process-input-traced_node18.log index 23dd6c32..ae360a3d 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node18.log +++ b/integration_tests/snapshots/logs/process-input-traced_node18.log @@ -49,6 +49,7 @@ START "http.method": "GET", "stage": "test", "domain_name": "", + "dd_resource_key": "arn:aws:apigateway:eu-west-1::/restapis/wt6mne2s9k", "http.status_code": "200", "_dd.integration": "opentracing", "_dd.base_service": "integration-tests-js-XXXX-process-input-traced_node18", diff --git a/integration_tests/snapshots/logs/process-input-traced_node20.log b/integration_tests/snapshots/logs/process-input-traced_node20.log index da814a0b..6af34005 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node20.log +++ b/integration_tests/snapshots/logs/process-input-traced_node20.log @@ -49,6 +49,7 @@ START "http.method": "GET", "stage": "test", "domain_name": "", + "dd_resource_key": "arn:aws:apigateway:eu-west-1::/restapis/wt6mne2s9k", "http.status_code": "200", "_dd.integration": "opentracing", "_dd.base_service": "integration-tests-js-XXXX-process-input-traced_node20", diff --git a/integration_tests/snapshots/logs/process-input-traced_node22.log b/integration_tests/snapshots/logs/process-input-traced_node22.log index c9c1dc0c..46bf38b4 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node22.log +++ b/integration_tests/snapshots/logs/process-input-traced_node22.log @@ -49,6 +49,7 @@ START "http.method": "GET", "stage": "test", "domain_name": "", + "dd_resource_key": "arn:aws:apigateway:eu-west-1::/restapis/wt6mne2s9k", "http.status_code": "200", "_dd.integration": "opentracing", "_dd.base_service": "integration-tests-js-XXXX-process-input-traced_node22", diff --git a/integration_tests/snapshots/logs/process-input-traced_node24.log b/integration_tests/snapshots/logs/process-input-traced_node24.log index e48c351b..e7b40062 100644 --- a/integration_tests/snapshots/logs/process-input-traced_node24.log +++ b/integration_tests/snapshots/logs/process-input-traced_node24.log @@ -49,6 +49,7 @@ START "http.method": "GET", "stage": "test", "domain_name": "", + "dd_resource_key": "arn:aws:apigateway:eu-west-1::/restapis/wt6mne2s9k", "http.status_code": "200", "_dd.integration": "opentracing", "_dd.base_service": "integration-tests-js-XXXX-process-input-traced_node24", diff --git a/integration_tests/snapshots/logs/status-code-500s_node18.log b/integration_tests/snapshots/logs/status-code-500s_node18.log index 63d2eecb..6436ae9d 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node18.log +++ b/integration_tests/snapshots/logs/status-code-500s_node18.log @@ -55,6 +55,7 @@ START "http.method": "GET", "stage": "test", "domain_name": "", + "dd_resource_key": "arn:aws:apigateway:eu-west-1::/restapis/wt6mne2s9k", "http.status_code": "500", "_dd.integration": "opentracing", "_dd.base_service": "integration-tests-js-XXXX-status-code-500s_node18", diff --git a/integration_tests/snapshots/logs/status-code-500s_node20.log b/integration_tests/snapshots/logs/status-code-500s_node20.log index 1c807dbf..9508d8b0 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node20.log +++ b/integration_tests/snapshots/logs/status-code-500s_node20.log @@ -55,6 +55,7 @@ START "http.method": "GET", "stage": "test", "domain_name": "", + "dd_resource_key": "arn:aws:apigateway:eu-west-1::/restapis/wt6mne2s9k", "http.status_code": "500", "_dd.integration": "opentracing", "_dd.base_service": "integration-tests-js-XXXX-status-code-500s_node20", diff --git a/integration_tests/snapshots/logs/status-code-500s_node22.log b/integration_tests/snapshots/logs/status-code-500s_node22.log index 0800402b..faf08f8b 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node22.log +++ b/integration_tests/snapshots/logs/status-code-500s_node22.log @@ -55,6 +55,7 @@ START "http.method": "GET", "stage": "test", "domain_name": "", + "dd_resource_key": "arn:aws:apigateway:eu-west-1::/restapis/wt6mne2s9k", "http.status_code": "500", "_dd.integration": "opentracing", "_dd.base_service": "integration-tests-js-XXXX-status-code-500s_node22", @@ -619,6 +620,7 @@ START } END Duration: XXXX ms Memory Used: XXXX MB START +END Duration: XXXX ms Memory Used: XXXX MB { "e": XXXX, "m": "aws.lambda.enhanced.invocations", @@ -717,7 +719,6 @@ START ] ] } -END Duration: XXXX ms Memory Used: XXXX MB START { "e": XXXX, diff --git a/integration_tests/snapshots/logs/status-code-500s_node24.log b/integration_tests/snapshots/logs/status-code-500s_node24.log index d04918a8..22966356 100644 --- a/integration_tests/snapshots/logs/status-code-500s_node24.log +++ b/integration_tests/snapshots/logs/status-code-500s_node24.log @@ -55,6 +55,7 @@ START "http.method": "GET", "stage": "test", "domain_name": "", + "dd_resource_key": "arn:aws:apigateway:eu-west-1::/restapis/wt6mne2s9k", "http.status_code": "500", "_dd.integration": "opentracing", "_dd.base_service": "integration-tests-js-XXXX-status-code-500s_node24",