apollographql / apollographql/apollo-server
Memory leak in ApolloServerPluginUsageReporting plugin
- Dominant language
- TypeScript
- Stars
- 14k
- Forks
- 2k
- Avg merge
- 2d 14h
- Merged PRs (30d)
- 2
Description
### Issue Description
We've been running Apollo server for a while in a couple of APIs, and we have always noticed a memory leak in both, which appeared to be linearly proportional to the number of requests handled by each API.
While investigating the memory leak, v8 heap snapshots where taken from the running servers at two different timestamps, with a distance of 6 hours. The latter heap snapshot was compared to the previous one in order to track what new objects are in the JS heap that where not 6 hours before, and there are thousands of new retained `Request`-like objects that reference the "usage-reporting.api.apollographql.com" host, and hundreds of `TLSSocket` new objects that reference this same host.
### Some objects that are leaking in the JS memory:
Request-like object
```
body::Object@13534193
cache::"default"@729π
client::Object@13537293
credentials::"same-origin"@54437π
cryptoGraphicsNonceMetadata::""@77π
destination::""@77π
done::system / Oddball@73π
headersList::HeadersList@13537317
historyNavigation::system / Oddball@75π
initiator::""@77π
integrity::""@77π
keepalive::system / Oddball@75π
localURLsOnly::system / Oddball@75π
map::system / Map@130579
method::"POST"@49427π
mode::"cors"@84517π
origin::system / Oddball@67π
parserMetadata::""@77π
policyContainer::Object@13537295
preventNoCacheCacheControlHeaderModification::system / Oddball@75π
priority::system / Oddball@71π
properties::system / PropertyArray@13537319
redirect::"follow"@53093π
referrer::"no-referrer"@85507π
referrerPolicy::system / Oddball@67π
reloadNavigation::system / Oddball@75π
replacesClientId::""@77π
reservedClient::system / Oddball@71π
responseTainting::"basic"@102749π
serviceWorkers::"none"@519π
taintedOrigin::system / Oddball@75π
timingAllowFailed::system / Oddball@75π
unsafeRequest::system / Oddball@75π
url::URL@13537301
::URLContext@13538143
fragment::system / Oddball@71π
host::"usage-reporting.api.apollographql.com"@13538145π
map::system / Map@135759
path::Array@13538147
port::system / Oddball@71π
query::system / Oddball@71π
scheme::"https:"@6945π
username::""@77π
__proto__::Object@135757
::URLSearchParams@13538149
map::system / Map@135741
__proto__::URL@135739π
urlList::Array@13537299
useCORSPreflightFlag::system / Oddball@75π
useCredentials::system / Oddball@75π
userActivation::system / Oddball@75π
window::"no-window"@87117π
__proto__
```
TLSSocket object
```
::system / Oddball@75π
::Client@131765
::Object@13536139
::InformationalError@13536143
::system / Oddball@71π
::system / Oddball@71π
::system / Oddball@71π
::system / Oddball@75π
::system / Oddball@71π
::system / Oddball@75π
::system / Oddball@73π
::system / Oddball@67π
::system / Oddball@73π
::system / Oddball@71π
::system / Oddball@71π
::system / Oddball@71π
::system / Oddball@75π
::system / Oddball@71π
::system / Oddball@73π
::system / Oddball@75π
_SNICallback::system / Oddball@71π
_closeAfterHandlingError::system / Oddball@75π
_controlReleased::system / Oddball@73π
_events::Object@13536133
_hadError::system / Oddball@75π
_host::"usage-reporting.api.apollographql.com"@131813π
_maxListeners::system / Oddball@67π
_newSessionPending::system / Oddball@75π
_parent::system / Oddball@71π
_peername::Object@13536141
_pendingData::system / Oddball@71π
_pendingEncoding::""@77π
_readableState::ReadableState@13536135
_rejectUnauthorized::system / Oddball@73π
_requestCert::system / Oddball@73π
_secureEstablished::system / Oddball@73π
_securePending::system / Oddball@75π
_server::system / Oddball@71π
_sockname::system / Oddball@71π
_tlsOptions::Object@13536129
_writableState::WritableState@13536137
allowHalfOpen::system / Oddball@75π
alpnProtocol::system / Oddball@75π
authorizationError::system / Oddball@71π
authorized::system / Oddball@73π
connecting::system / Oddball@75π
domain::system / Oddball@71π
encrypted::system / Oddball@73π
map::system / Map@130053
properties::system / PropertyArray@13536145
secureConnecting::system / Oddball@75π
server::system / Oddball@67π
servername::"usage-reporting.api.apollographql.com"@13536131π
ssl::system / Oddball@71π
__proto__::Socket@147607π
```
Here is a chart showing the memory usage of the last two days for one of the APIs:

The first left half of the chart (the first day) the Apollo server was running with the `ApolloServerPluginUsageReporting` enabled, and the memory kept increasing linearly, and the last half (the second day), exactly the same code was running but passing the `ApolloServerPluginUsageReportingDisabled` to the plugins, so that the usage reporting is disabled. In this last case no memory was being leaked.
We are using `@apollo/server` with version `4.3.0`
### Link to Reproduction
https://github.com/GabrielMusatMestre/apollo-server-memory-leak-repro
### Reproduction Steps
Steps are described in the README.md of the reproduction repo.
This is not a reliable reproduction, as the memory leak might start being noticeable by running the server under heavy load for hours or days, and it needs a properly configured `APOLLO_KEY` and `APOLLO_GRAPH_REF` that will actually publish usage reports to Apollo.
Contributor guide
Assessment
This issue has not been assessed yet.