Skip to content

Commit 08a3e40

Browse files
Fix API Gateway type guards (#165)
make apigateway type guard more specific
1 parent 0372bfa commit 08a3e40

File tree

6 files changed

+60
-134
lines changed

6 files changed

+60
-134
lines changed

event_samples/api-gateway-v2.json

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{
2+
"version": "2.0",
3+
"routeKey": "ANY /nodejs-apig-function-1G3XMPLZXVXYI",
4+
"rawPath": "/default/nodejs-apig-function-1G3XMPLZXVXYI",
5+
"rawQueryString": "",
6+
"cookies": [
7+
"s_fid=7AABXMPL1AFD9BBF-0643XMPL09956DE2",
8+
"regStatus=pre-register"
9+
],
10+
"headers": {
11+
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
12+
"accept-encoding": "gzip, deflate, br",
13+
"accept-language": "en-US,en;q=0.9",
14+
"content-length": "0",
15+
"host": "r3pmxmplak.execute-api.us-east-2.amazonaws.com",
16+
"sec-fetch-dest": "document",
17+
"sec-fetch-mode": "navigate",
18+
"sec-fetch-site": "cross-site",
19+
"sec-fetch-user": "?1",
20+
"upgrade-insecure-requests": "1",
21+
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36",
22+
"x-amzn-trace-id": "Root=1-5e6722a7-cc56xmpl46db7ae02d4da47e",
23+
"x-forwarded-for": "205.255.255.176",
24+
"x-forwarded-port": "443",
25+
"x-forwarded-proto": "https"
26+
},
27+
"requestContext": {
28+
"accountId": "123456789012",
29+
"apiId": "r3pmxmplak",
30+
"domainName": "r3pmxmplak.execute-api.us-east-2.amazonaws.com",
31+
"domainPrefix": "r3pmxmplak",
32+
"http": {
33+
"method": "GET",
34+
"path": "/default/nodejs-apig-function-1G3XMPLZXVXYI",
35+
"protocol": "HTTP/1.1",
36+
"sourceIp": "205.255.255.176",
37+
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"
38+
},
39+
"requestId": "JKJaXmPLvHcESHA=",
40+
"routeKey": "ANY /nodejs-apig-function-1G3XMPLZXVXYI",
41+
"stage": "default",
42+
"time": "10/Mar/2020:05:16:23 +0000",
43+
"timeEpoch": 1583817383220
44+
},
45+
"isBase64Encoded": true
46+
}

event_samples/api-gateway.json

Lines changed: 0 additions & 124 deletions
This file was deleted.

src/trace/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,4 @@ export const xraySubsegmentNamespace = "datadog";
2121
export const xrayTraceEnvVar = "_X_AMZN_TRACE_ID";
2222
export const awsXrayDaemonAddressEnvVar = "AWS_XRAY_DAEMON_ADDRESS";
2323
export const ddtraceVersion = "X.X.X";
24+
export const apiGatewayEventV2 = "2.0";

src/trace/trigger.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ describe("parseEventSource", () => {
2323
{
2424
result: {
2525
"function_trigger.event_source": "api-gateway",
26-
"function_trigger.event_source_arn": "arn:aws:apigateway:us-east-1::/restapis/1234567890/stages/prod",
27-
"http.url": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com",
28-
"http.url_details.path": "/prod/path/to/resource",
29-
"http.method": "POST",
26+
"function_trigger.event_source_arn": "arn:aws:apigateway:us-east-1::/restapis/r3pmxmplak/stages/default",
27+
"http.url": "r3pmxmplak.execute-api.us-east-2.amazonaws.com",
28+
"http.url_details.path": "/default/nodejs-apig-function-1G3XMPLZXVXYI",
29+
"http.method": "GET",
3030
},
31-
file: "api-gateway.json",
31+
file: "api-gateway-v2.json",
3232
},
3333
{
3434
result: {
@@ -146,7 +146,7 @@ describe("parseEventSource", () => {
146146
for (let response of responses) {
147147
const statusCode = extractHTTPStatusCodeTag(triggerTags, response.responseBody);
148148
// We should always return a status code for API Gateway and ALB
149-
if (["api-gateway-v1.json", "api-gateway.json", "application-load-balancer.json"].includes(event.file)) {
149+
if (["api-gateway-v1.json", "api-gateway-v2.json", "application-load-balancer.json"].includes(event.file)) {
150150
expect(statusCode).toEqual(response.expectedStatusCode);
151151
} else {
152152
expect(statusCode).toBeUndefined();

src/trace/trigger.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ function extractHTTPTags(event: APIGatewayEvent | APIGatewayProxyEventV2 | ALBEv
202202
}
203203
httpTags["http.url_details.path"] = requestContext.path;
204204
httpTags["http.method"] = requestContext.httpMethod;
205-
if (event.headers.Referer) {
205+
if (event.headers?.Referer) {
206206
httpTags["http.referer"] = event.headers.Referer;
207207
}
208208
return httpTags;
@@ -213,7 +213,7 @@ function extractHTTPTags(event: APIGatewayEvent | APIGatewayProxyEventV2 | ALBEv
213213
httpTags["http.url"] = requestContext.domainName;
214214
httpTags["http.url_details.path"] = requestContext.http.path;
215215
httpTags["http.method"] = requestContext.http.method;
216-
if (event.headers.Referer) {
216+
if (event.headers?.Referer) {
217217
httpTags["http.referer"] = event.headers.Referer;
218218
}
219219
return httpTags;

src/utils/event-type-guards.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,16 @@ import {
1111
SNSEvent,
1212
SQSEvent,
1313
} from "aws-lambda";
14+
import { apiGatewayEventV2 } from "../trace/constants";
1415

1516
export function isAPIGatewayEvent(event: any): event is APIGatewayEvent {
16-
return event.requestContext !== undefined && event.requestContext.stage !== undefined;
17+
return event.requestContext?.stage !== undefined && event.httpMethod !== undefined && event.resource !== undefined;
1718
}
1819

1920
export function isAPIGatewayEventV2(event: any): event is APIGatewayProxyEventV2 {
20-
return event.requestContext !== undefined && event.version !== undefined;
21+
return (
22+
event.requestContext !== undefined && event.version === apiGatewayEventV2 && event.rawQueryString !== undefined
23+
);
2124
}
2225

2326
export function isALBEvent(event: any): event is ALBEvent {

0 commit comments

Comments
 (0)