apollographql / apollographql/federation
Federated Traces: Possible EventEmitter memory leak detected.
- 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
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