Health checks
Determining the health status of Apollo Server
Apollo Server 4 no longer
Load balancers often use health checks to determine if a server is available and ready to serve traffic.
GraphQL-level health checks
The easiest way to determine if your GraphQL server is healthy is to run a GraphQL operation.
Every GraphQL server supports a trivial query that requests the __typename
Query
type. This means every GraphQL server can respond to a GET
request to a URL such as:
https://your.server/graphql?query=%7B__typename%7D
Note that this health check will run an actual GraphQL operation. If your server requires special headers or cookies to run any query, you'll need to provide those with your request.
Sending an apollo-require-preflight: true
header alongside your health check ensures that Apollo Server's
If you want to create a health check for your HTTP server that is unrelated to the health of the GraphQL execution engine (i.e., such as GET
handler that always succeeds to your web framework.
Below is an example of an HTTP server health check with expressMiddleware
// imports, etc.const app = express();const server = new ApolloServer({typeDefs,resolvers,});await server.start();app.use('/graphql', cors<cors.CorsRequest>(), express.json(), expressMiddleware(server));await new Promise<void>((resolve) => app.listen({ port: 4000 }, resolve));// Our GraphQL server is listening for GraphQL operations// on `http://localhost:4000/graphql`console.log(`🚀 Server ready at http://localhost:4000/graphql`);// Requests to `http://localhost:4000/health` now return "Okay!"app.get('/health', (req, res) => {res.status(200).send('Okay!');});
// imports, etc.const app = express();const server = new ApolloServer({typeDefs,resolvers,});await server.start();app.use('/graphql', cors(), express.json(), expressMiddleware(server));await new Promise((resolve) => app.listen({ port: 4000 }, resolve));// Our GraphQL server is listening for GraphQL operations// on `http://localhost:4000/graphql`console.log(`🚀 Server ready at http://localhost:4000/graphql`);// Requests to `http://localhost:4000/health` now return "Okay!"app.get('/health', (req, res) => {res.status(200).send('Okay!');});
If you are using startStandaloneServer
, you must first expressMiddleware
function