Merged
Conversation
Contributor
✅ Docs preview readyThe preview is ready to be viewed. View the preview File Changes 0 new, 3 changed, 1 removedBuild ID: ec9faba4f5ca0cabd01587f3 URL: https://www.apollographql.com/docs/deploy-preview/ec9faba4f5ca0cabd01587f3 ✅ AI Style Review — No Issues FoundThe pull request does not have any style issues. Duration: 2021ms
|
rohan-b99
approved these changes
Feb 24, 2026
smyrick
pushed a commit
that referenced
this pull request
Mar 2, 2026
smyrick
pushed a commit
that referenced
this pull request
Mar 17, 2026
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
Support Unix domain socket (UDS) communication for coprocessors (Issue #5739)
Many coprocessor deployments run side-by-side with the router, typically on the same host (for example, within the same Kubernetes pod).
This change brings coprocessor communication to parity with subgraphs by adding Unix domain socket (UDS) support. When the router and coprocessor are co-located, communicating over a Unix domain socket bypasses the full TCP/IP network stack and uses shared host memory instead, which can meaningfully reduce latency compared to HTTP.
By @theJC in #8348
Add
redact_query_validation_errorssupergraph config option (PR #8888)The new
redact_query_validation_errorsoption in thesupergraphconfiguration section replaces all query validation errors with a single generic error:{ "message": "invalid query", "extensions": { "code": "UNKNOWN_ERROR" } }By @phryneas in #8888
Support multiple
@listSizedirectives on the same field (PR #8872)Warning
Multiple
@listSizedirectives on a field only take effect after Federation supports repeatable@listSizein the supergraph schema. Until then, composition continues to expose at most one directive per field. This change makes the router ready for that Federation release.The router now supports multiple
@listSizedirectives on a single field, enabling more flexible cost estimation when directives from different subgraphs are combined during federation composition.@listSizedirectives on a field (stored asVec<ListSizeDirective>instead ofOption<ListSizeDirective>).assumedSizevalues, the router uses the maximum value for cost calculation.This change prepares the router for federation's upcoming support for repeatable
@listSizedirectives, and maintains full compatibility with current non-repeatable directive schemas.By @cmorris in #8872
Add parser recursion and lexical token metrics (PR #8845)
The router now emits two new metrics:
apollo.router.operations.recursionfor the recursion level reached, andapollo.router.operations.lexical_tokensfor the number of lexical tokens in a query.By @jhrldev in #8845
Support subgraph-level demand control (PR #8829)
Subgraph-level demand control lets you enforce per-subgraph query cost limits in the router, in addition to the existing global cost limit for the whole supergraph. This helps you protect specific backend services that have different capacity or cost profiles from being overwhelmed by expensive operations.
When a subgraph-specific cost limit is exceeded, the router:
Per-subgraph limits apply to the total work for that subgraph in a single operation. For each request, the router tracks the aggregate estimated cost per subgraph across the entire query plan. If the same subgraph is fetched multiple times (for example, through entity lookups, nested fetches, or conditional branches), those costs are summed together and the subgraph's limit is enforced against that total.
Configuration
Example
Consider a
topProductsquery that fetches a list of products from a products subgraph and then performs an entity lookup for each product in a reviews subgraph. Assume the products cost is 10 and the reviews cost is 5, leading to a total estimated cost of 15 (10 + 5).Previously, you could only restrict that query via
demand_control.static_estimated.max:Subgraph-level demand control enables much more granular control. In addition to
demand_control.static_estimated.max, which operates as before, you can also set per-subgraph limits.For example, if you set
max = 20andreviews.max = 2, the query passes the aggregate check (15 < 20) and executes on the products subgraph (no limit specified), but doesn't execute against the reviews subgraph (5 > 2). The result is composed as if the reviews subgraph had returned null.By @carodewig in #8829
Improve
@listSizedirective parsing and nested path support (PR #8893)Demand control cost calculation now supports:
@listSizesizing (for example, list arguments)sizedFieldsargument on@listSizefor more accurate cost estimationThese changes are backward compatible with existing schemas and directives.
By @cmorris in #8893
Add coprocessor hooks for connector request and response stages (PR #8869)
You can now configure a coprocessor hook for the
ConnectorRequestandConnectorResponsestages of the router lifecycle.By @andrewmcgivery in #8869
🐛 Fixes
Pass variables to introspection queries (PR #8816)
Introspection queries now receive variables, enabling
@includeand@skipdirectives during introspection.By @jephuff in #8816
Log warning instead of returning error for non-UTF-8 headers in
externalize_header_map(PR #8828)By @rohan-b99 in #8828
Place
http_clientspan attributes on thehttp_requestspan (PR #8798)Attributes configured under
telemetry.instrumentation.spans.http_clientare now added to thehttp_requestspan instead ofsubgraph_request.Given this config:
Both attributes are now placed on the
http_requestspan.By @rohan-b99 in #8798
Validate
ObjectValuevariable fields against input type definitions (PR #8821 and PR #8884)The router now validates individual fields of input object variables against their type definitions. Previously, variable validation checked that the variable itself was present but didn't validate the fields within the object.
Example:
This request previously passed validation because the variable
msgwas present in the input, but the fields ofmsgweren't validated against theMessageInputtype.Warning
To opt out of this behavior, set the
supergraph.strict_variable_validationconfig option tomeasure.Enabled:
Disabled:
By @conwuegb in #8821 and #8884
Increase internal Redis timeout from 5s to 10s (PR #8863)
Because mTLS handshakes can be slow in some environments, the internal Redis timeout is now 10s (previously 5s). The connection "unresponsive" threshold is also increased from 5s to 10s.
By @aaronarinder in #8863
Enforce and log operation limits for cached query plans (PR #8810)
The router now logs the operation-limits warning for cached query plans as well, ensuring the query text is included whenever limits are exceeded. This also fixes a case where a cached plan could bypass enforcement after changing
warn_onlyfromtruetofalseduring a hot reload.By @rohan-b99 in #8810
Prevent duplicate
content-typeheaders in connectors (PR #8867)When you override the
content-typeheader in a connector@sourcedirective, the router no longer appends the default value. The custom header value now properly replaces the default.For example:
Previously resulted in:
content-type: application/json, application/vnd.iaas.v1+jsonNow correctly results in:
content-type: application/vnd.iaas.v1+jsonBy @andrewmcgivery in #8867
Prevent duplicate tags in router spans added by dynamic attributes (PR #8865)
When dynamic attributes are added via
SpanDynAttribute::insert,SpanDynAttribute::extend,LogAttributes::insert,LogAttributes::extend,EventAttributes::insert, orEventAttributes::extendand the key already exists, the router now replaces the existing value instead of creating duplicate attributes.By @rohan-b99 in #8865
Compute actual demand control costs across all subgraph fetches (PR #8827)
The demand control feature estimates query costs by summing together the cost of each subgraph operation, capturing any intermediate work that must be completed to return a complete response.
Previously, the actual query cost computation only considered the final response shape and didn't include any of the intermediate work in its total.
The router now computes the actual query cost as the sum of all subgraph response costs. This more accurately reflects the work done per operation and enables a more meaningful comparison between actual and estimated costs.
To disable the new actual cost computation behavior, set the router configuration option
demand_control.strategy.static_estimated.actual_cost_modetoresponse_shape:By @carodewig in #8827
📚 Documentation
Correct response caching FAQ for schema updates and multi-root-field caching (PR #8794)
Updated the response caching FAQ to accurately describe caching behavior:
Cache-Control: max-ageheaders.300sto5mfor better readability.By @the-gigi-apollo in #8794