From 885b61afeb36da3b314de3a7bcb62e368e079f5c Mon Sep 17 00:00:00 2001 From: glen thomas Date: Tue, 29 Oct 2019 20:39:35 +0000 Subject: [PATCH 1/4] Added health check for apollo-server-lambda --- .../apollo-server-lambda/src/ApolloServer.ts | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/apollo-server-lambda/src/ApolloServer.ts b/packages/apollo-server-lambda/src/ApolloServer.ts index 679c0616fa3..ec4812738e7 100644 --- a/packages/apollo-server-lambda/src/ApolloServer.ts +++ b/packages/apollo-server-lambda/src/ApolloServer.ts @@ -21,6 +21,7 @@ export interface CreateHandlerOptions { credentials?: boolean; maxAge?: number; }; + onHealthCheck?: (req: APIGatewayProxyEvent) => Promise; } export class ApolloServer extends ApolloServerBase { @@ -47,7 +48,7 @@ export class ApolloServer extends ApolloServerBase { return super.graphQLServerOptions({ event, context }); } - public createHandler({ cors }: CreateHandlerOptions = { cors: undefined }) { + public createHandler({ cors, onHealthCheck }: CreateHandlerOptions = { cors: undefined }) { // We will kick off the `willStart` event once for the server, and then // await it before processing any requests by incorporating its `await` into // the GraphQLServerOptions function which is called before each request. @@ -159,6 +160,35 @@ export class ApolloServer extends ApolloServerBase { }); } + if (event.path === '/.well-known/apollo/server-health') { + const successfulResponse = { + body: JSON.stringify({ status: 'pass' }), + statusCode: 200, + headers: { + 'Content-Type': 'application/json', + ...requestCorsHeadersObject, + }, + }; + if (onHealthCheck) { + onHealthCheck(event) + .then(() => { + return callback(null, successfulResponse); + }) + .catch(() => { + return callback(null, { + body: JSON.stringify({ status: 'fail' }), + statusCode: 200, + headers: { + 'Content-Type': 'application/json', + ...requestCorsHeadersObject, + }, + }); + }); + } else { + return callback(null, successfulResponse); + } + } + if (this.playgroundOptions && event.httpMethod === 'GET') { const acceptHeader = event.headers['Accept'] || event.headers['accept']; if (acceptHeader && acceptHeader.includes('text/html')) { From bdb8c85153659667613fa2dea2dbec3a52056a6d Mon Sep 17 00:00:00 2001 From: glen thomas Date: Tue, 29 Oct 2019 20:48:42 +0000 Subject: [PATCH 2/4] Set onHealthCheck parameter --- packages/apollo-server-lambda/src/ApolloServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/apollo-server-lambda/src/ApolloServer.ts b/packages/apollo-server-lambda/src/ApolloServer.ts index ec4812738e7..bf9cbe594b9 100644 --- a/packages/apollo-server-lambda/src/ApolloServer.ts +++ b/packages/apollo-server-lambda/src/ApolloServer.ts @@ -48,7 +48,7 @@ export class ApolloServer extends ApolloServerBase { return super.graphQLServerOptions({ event, context }); } - public createHandler({ cors, onHealthCheck }: CreateHandlerOptions = { cors: undefined }) { + public createHandler({ cors, onHealthCheck }: CreateHandlerOptions = { cors: undefined, onHealthCheck: undefined }) { // We will kick off the `willStart` event once for the server, and then // await it before processing any requests by incorporating its `await` into // the GraphQLServerOptions function which is called before each request. From 611cd81e155ffc41b3affd228b38c686eef9f0ba Mon Sep 17 00:00:00 2001 From: Jesse Rosenberger Date: Wed, 13 Nov 2019 13:10:29 +0200 Subject: [PATCH 3/4] Add CHANGELOG.md for #3458. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46058a407de..3380fdace43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ The version headers in this history reflect the versions of Apollo Server itself > The changes noted within this `vNEXT` section have not been released yet. New PRs and commits which introduce changes should include an entry in this `vNEXT` section as part of their development. When a release is being prepared, a new header will be (manually) created below and the the appropriate changes within that release will be moved into the new section. - `apollo-server-core`: Don't try parsing `variables` and `extensions` as JSON if they are defined but empty strings. [PR #3501](https://github.com/apollographql/apollo-server/pull/3501) +- `apollo-server-lambda`: Introduce `onHealthCheck` on `createHandler` in the same fashion as implemented in other integrations. [PR #3458](https://github.com/apollographql/apollo-server/pull/3458) ### v2.9.8 From 615dc28a1a71a8d770d034a17e539a1f5cbd6a3b Mon Sep 17 00:00:00 2001 From: Jesse Rosenberger Date: Wed, 13 Nov 2019 13:53:17 +0200 Subject: [PATCH 4/4] Use status code 503 on `onHealthCheck` rejection, rather than 200. Per my comment in: https://github.com/apollographql/apollo-server/pull/3458#discussion_r345700892 --- packages/apollo-server-lambda/src/ApolloServer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/apollo-server-lambda/src/ApolloServer.ts b/packages/apollo-server-lambda/src/ApolloServer.ts index bf9cbe594b9..181de51b061 100644 --- a/packages/apollo-server-lambda/src/ApolloServer.ts +++ b/packages/apollo-server-lambda/src/ApolloServer.ts @@ -177,7 +177,7 @@ export class ApolloServer extends ApolloServerBase { .catch(() => { return callback(null, { body: JSON.stringify({ status: 'fail' }), - statusCode: 200, + statusCode: 503, headers: { 'Content-Type': 'application/json', ...requestCorsHeadersObject,