apollographql / apollographql/federation

Federated Traces: Possible EventEmitter memory leak detected.

Open
#417 4 comments 1 reaction 0 assignees View on GitHub
Dominant language
TypeScript
Stars
725
Forks
276
Avg merge
1h 47m
Merged PRs (30d)
1

Description

`apollo-server-core@^2.18.2`

https://github.com/apollographql/apollo-server/blob/main/packages/apollo-server-core/src/ApolloServer.ts#L358

Background: we are using apollo federation/ typescript to run multiple services on express.
```
"@apollo/federation": "^0.16.0"
"@apollo/gateway": "^0.16.0"
"apollo-server-express": "^2.13.1",
"apollo-server-types": "^0.4.0",
```

Typescript requested version is 3.9.2 (actual 3.9.3 to 3.9.7).

**Expected behavior:** no leak.

**Actual behavior:**
At startup, the application reports possible memory leaks.

I am not sure how to create a "simple" test case, as the application is large. I did my best to trace things, see:
```
yarn run v1.22.5
$ ts-node-dev --inspect -r tsconfig-paths/register --respawn src/gateway/index.ts
ts-node-dev ver. 1.0.0-pre.63 (using ts-node ver. 8.10.2, typescript ver. 3.9.7)
Debugger listening on ws://127.0.0.1:9229/37d49f58-21ef-4951-aa19-c6b7de71e5fd
For help, see: https://nodejs.org/en/docs/inspector
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Enabling inline tracing for this federated service. To disable, use ApolloServerPluginInlineTraceDisabled.
Allowing requests from: http://localhost:8000
Allowing requests from: http://localhost:3000
Allowing requests from: http://localhost:4000
(node:18568) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGTERM listeners added to [process]. Use emitter.setMaxListeners() to increase limit
MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGTERM listeners added to [process]. Use emitter.setMaxListeners() to increase limit
at _addListener (events.js:389:17)
at process.addListener (events.js:405:10)
at process.once (events.js:436:8)
at D:\dev\\data-warehouse\node_modules\apollo-server-core\src\ApolloServer.ts:366:17
at Array.forEach ()
at new ApolloServerBase (D:\dev\\data-warehouse\node_modules\apollo-server-core\src\ApolloServer.ts:359:15)
at new ApolloServer (D:\dev\\data-warehouse\node_modules\apollo-server-express\src\ApolloServer.ts:88:5)
at Object.exports.createServer (D:\dev\\data-warehouse\src\utils\createServer.ts:15:92)
at Component.get server [as server] (D:\dev\\data-warehouse\src\utils\Component.ts:37:12)
at ComponentGraphQlDataSource.process (D:\dev\\data-warehouse\src\gateway\ComponentGraphQlDataSource.ts:20:25)
at D:\dev\\data-warehouse\node_modules\@apollo\gateway\src\loadServicesFromRemoteEndpoint.ts:45:8
at Array.map ()
at Object.getServiceDefinitionsFromRemoteEndpoint (D:\dev\\data-warehouse\node_modules\@apollo\gateway\src\loadServicesFromRemoteEndpoint.ts:29:44)
at ApolloGateway.loadServiceDefinitions (D:\dev\\data-warehouse\node_modules\@apollo\gateway\src\index.ts:610:14)
at ApolloGateway.updateComposition (D:\dev\\data-warehouse\node_modules\@apollo\gateway\src\index.ts:340:27)
at ApolloGateway.load (D:\dev\\data-warehouse\node_modules\@apollo\gateway\src\index.ts:303:16)
(node:18568) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGINT listeners added to [process]. Use emitter.setMaxListeners() to increase limit
MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 SIGINT listeners added to [process]. Use emitter.setMaxListeners() to increase limit
at _addListener (events.js:389:17)
at process.addListener (events.js:405:10)
at process.once (events.js:436:8)
at D:\dev\\data-warehouse\node_modules\apollo-server-core\src\ApolloServer.ts:366:17
at Array.forEach ()
at new ApolloServerBase (D:\dev\\data-warehouse\node_modules\apollo-server-core\src\ApolloServer.ts:359:15)
at new ApolloServer (D:\dev\\data-warehouse\node_modules\apollo-server-express\src\ApolloServer.ts:88:5)
at Object.exports.createServer (D:\dev\\data-warehouse\src\utils\createServer.ts:15:92)
at Component.get server [as server] (D:\dev\\data-warehouse\src\utils\Component.ts:37:12)
at ComponentGraphQlDataSource.process (D:\dev\\data-warehouse\src\gateway\ComponentGraphQlDataSource.ts:20:25)
at D:\dev\\data-warehouse\node_modules\@apollo\gateway\src\loadServicesFromRemoteEndpoint.ts:45:8
at Array.map ()
at Object.getServiceDefinitionsFromRemoteEndpoint (D:\dev\\data-warehouse\node_modules\@apollo\gateway\src\loadServicesFromRemoteEndpoint.ts:29:44)
at ApolloGateway.loadServiceDefinitions (D:\dev\\data-warehouse\node_modules\@apollo\gateway\src\index.ts:610:14)
at ApolloGateway.updateComposition (D:\dev\\data-warehouse\node_modules\@apollo\gateway\src\index.ts:340:27)
at ApolloGateway.load (D:\dev\\data-warehouse\node_modules\@apollo\gateway\src\index.ts:303:16)
� Server ready at http://localhost:4000/graphql
```

It appears that the issue originates in:
https://github.com/apollographql/apollo-server/blob/main/packages/apollo-server-core/src/ApolloServer.ts#L358

Thank you for your help with this.

Contributor guide

Open the contributing guide

Research direction

Start with packages/apollo-server-core/src/ApolloServer.ts around line 358, then follow the startup path through ApolloGateway.load and the reported createServer entry point. Reproduce the federated-service startup with the listed package versions and inspect SIGTERM and SIGINT listener registration. Done means startup no longer emits MaxListenersExceededWarning without masking a genuine leak.

Written by the indexing model from the issue text.

Assessment

Tech stack
express, graphql, node.js, typescript
Domain
api, backend, distributed-systems
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.