diff --git a/integration_tests/snapshots/logs/esm_node18.log b/integration_tests/snapshots/logs/esm_node18.log index 7e97d980..e4316288 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", @@ -42,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", @@ -58,7 +58,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..e23e1c47 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", @@ -42,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", @@ -58,7 +58,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..a4624c46 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", @@ -42,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", @@ -58,7 +58,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..a6df44fd 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", @@ -42,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", @@ -58,7 +58,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..ae360a3d 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", @@ -50,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", @@ -66,7 +66,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..6af34005 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", @@ -50,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", @@ -66,7 +66,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..46bf38b4 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", @@ -50,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", @@ -66,7 +66,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..e7b40062 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", @@ -50,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", @@ -66,7 +66,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..6436ae9d 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", @@ -56,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", @@ -72,7 +72,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..9508d8b0 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", @@ -56,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", @@ -72,7 +72,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..faf08f8b 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", @@ -56,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", @@ -72,7 +72,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", @@ -620,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", @@ -718,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 0c450fb2..22966356 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", @@ -56,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", @@ -72,7 +72,7 @@ START "duration":XXXX, "links": [], "service": "remappedApiGatewayServiceName", - "type": "http" + "type": "web" }, { "trace_id":"XXXX", diff --git a/src/trace/span-inferrer.spec.ts b/src/trace/span-inferrer.spec.ts index 19eb5709..8fe458bd 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", @@ -899,7 +898,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", }, }); }); @@ -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", @@ -926,7 +924,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", }, }); @@ -936,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: { @@ -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", @@ -954,7 +951,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", }, }); @@ -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", @@ -982,7 +978,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", }, }); @@ -992,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: { @@ -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", @@ -1010,12 +1005,53 @@ 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", }, }); }); + 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); @@ -1118,7 +1154,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", @@ -1126,7 +1161,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", }, }, @@ -1143,7 +1178,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", @@ -1151,7 +1185,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", }, }, @@ -1173,7 +1207,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", @@ -1181,7 +1214,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", }, }, @@ -1203,7 +1236,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", @@ -1211,7 +1243,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", }, }, @@ -1228,7 +1260,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", @@ -1236,7 +1267,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", }, }, @@ -1258,7 +1289,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", @@ -1266,7 +1296,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", }, }, @@ -1277,7 +1307,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, @@ -1288,7 +1318,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", @@ -1296,7 +1325,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", }, }, @@ -1307,7 +1336,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, @@ -1318,7 +1347,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", @@ -1326,7 +1354,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", }, }, @@ -1349,7 +1377,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", @@ -1357,7 +1384,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", }, }, ]); @@ -1374,7 +1401,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", @@ -1382,7 +1408,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", }, }, ]); @@ -1404,7 +1430,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", @@ -1412,7 +1437,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..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"; @@ -120,14 +121,13 @@ 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, 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", @@ -160,12 +160,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), @@ -191,12 +190,26 @@ 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 = { 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(