Merged
Conversation
This moves much of the content to the documentation so we don't have to maintain it in the changelog.
Contributor
✅ Docs preview readyThe preview is ready to be viewed. View the preview File Changes 0 new, 17 changed, 1 removedBuild ID: 7b694be4a8804bbb36778859 URL: https://www.apollographql.com/docs/deploy-preview/7b694be4a8804bbb36778859 |
rohan-b99
approved these changes
Dec 12, 2025
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🚀 Features
Response caching is now Generally Available 🎉 (PR #8678)
Response caching is now Generally Available (GA) and ready for production use!
Response caching enables the router to cache subgraph query responses using Redis, improving query latency and reducing load on your underlying services. Unlike traditional HTTP caching solutions, response caching provides GraphQL-aware caching at the entity and root field level, making cached data reusable across different users and queries.
For complete documentation, configuration options, and quickstart guide, see the response caching documentation.
Key benefits
@cacheControldirectives orCache-Controlresponse headers@cacheTagand invalidate specific cache entries via HTTP endpoint when data changesWhat's cached
The router caches two kinds of data:
Additional features
By @bnjjj in #8678
Support Redis read replicas (PR #8405)
Read-only queries are now sent to replica nodes when using clustered Redis. Previously, all commands were sent to the primary nodes.
This change applies to all Redis caches, including the query plan cache and the response cache.
By @carodewig in #8405
Enable HTTP/2 header size limits for TCP and UDS (PR #8673)
The router's HTTP/2 header size limit configuration option now applies to requests using TCP and UDS (Unix domain sockets). Previously, this setting only worked for TLS connections.
By @aaronArinder in #8673
🐛 Fixes
Enable invalidation endpoint when any subgraph has invalidation enabled (PR #8680)
Previously, the response cache invalidation endpoint was only enabled when global invalidation was enabled via
response_cache.subgraph.all.invalidation.enabled. If you enabled invalidation for only specific subgraphs without enabling it globally, the invalidation endpoint wouldn't start, preventing cache invalidation requests from being processed.The invalidation endpoint now starts if either:
response_cache.subgraph.all.invalidation.enabled: true), ORThis enables more flexible configuration where you can enable invalidation selectively for specific subgraphs:
By @bnjjj in #8680
Require Redis configuration only when response caching is enabled (PR #8684)
Previously, the router attempted to connect to Redis for response caching regardless of whether response caching was enabled or disabled. This caused unnecessary connection attempts and configuration errors even when the feature was explicitly disabled.
The router now ignores Redis configuration if response caching is disabled. If response caching is configured to be enabled, Redis configuration is required, and missing Redis configuration raises an error on startup:
By @bnjjj in #8684
Prevent deleted coprocessor context keys from reappearing in later stages (PR #8679)
Coprocessor context keys deleted in a previous stage no longer reappear in later stages.
By @rohan-b99 in #8679
Customize response caching behavior at the subgraph level (PR #8652)
You can now customize cached responses using Rhai or coprocessors. You can also set a different
private_idbased on subgraph request headers.Example Rhai script customizing
private_id:By @bnjjj in #8652
Prevent glibc mismatch in DIY Docker images (Issue #8450)
The DIY Dockerfile now pins the Rust builder to the Bookworm variant (for example,
rust:1.91.1-slim-bookworm) so the builder and runtime share the same Debian base. This prevents the image from failing at startup with/lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.39' not found.This resolves a regression introduced when the
rust:1.90.0bump used a generic Rust image without specifying a Debian variant. The upstream Rust image default advanced to a newer variant with glibc 2.39, although the DIY runtime remained on Bookworm, creating a version mismatch.By @theJC in #8629
Correct response cache fetch error metric (PR #8711)
The
apollo.router.operations.response_cache.fetch.errormetric was out of sync with theapollo.router.cache.redis.errorsmetric because errors weren't being returned from the Redis client wrapper. The response caching plugin now increments the error metric as expected.By @carodewig in #8711
Emit
http.client.request.body.sizemetric correctly (PR #8712)The histogram for
http.client.request.body.sizewas using theSubgraphRequestHeaderselector, looking forContent-Lengthbefore it had been set inon_request, sohttp.client.request.body.sizewasn't recorded. The router now uses theon_responsehandler and stores the body size in the request context extensions.By @rohan-b99 in #8712
Record
http.server.response.body.sizemetric correctly (PR #8697)Previously, the
http.server.response.body.sizemetric wasn't recorded because the router attempted to read from theContent-Lengthheader before it had been set. The router now uses thesize_hintof the body if it's exact.By @rohan-b99 in #8697
Treat interface objects as entities in response caching (PR #8582)
Interface objects can be entities, but response caching wasn't treating them that way. Interface objects are now respected as entities so they can be used as cache keys.
By @aaronArinder in #8582
🛠 Maintenance
Warn when Datadog propagator isn't exclusively active (PR #8677)
The router now validates propagator configuration and emits a warning log if:
By @rohan-b99 in #8677