Merged
Conversation
✅ Docs preview readyThe preview is ready to be viewed. View the preview File Changes 0 new, 2 changed, 0 removedBuild ID: 5797befc74f64338b0b5d4fd URL: https://www.apollographql.com/docs/deploy-preview/5797befc74f64338b0b5d4fd |
lrlna
reviewed
Oct 28, 2025
CHANGELOG.md
Outdated
Comment on lines
+55
to
+57
| All subgraph responses are checked and corrected to ensure alignment with the schema and query. When a misaligned value is returned, it's nullified. When the feature is enabled, errors for this nullification are now included in the errors array in the response. | ||
|
|
||
| By [@TylerBloom](https://github.com/TylerBloom) in https://github.com/apollographql/router/pull/8441 |
Member
There was a problem hiding this comment.
@TylerBloom the changelog should add how to enable the feature.
Member
Author
There was a problem hiding this comment.
Good eye. I'll chase down the change here right now.
abernix
commented
Oct 28, 2025
Co-authored-by: Iryna Shestak <shestak.irina@gmail.com>
lrlna
previously approved these changes
Oct 28, 2025
Member
Author
|
merging based on @lrlna's previous approval. |
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 per-stage coprocessor URLs (PR #8384)
You can now configure different coprocessor URLs for each stage of request/response processing (router, supergraph, execution, subgraph). Each stage can specify its own
urlfield that overrides the global default URL.Changes:
urlfield to all stage configuration structsas_servicemethods to accept and resolve URLsThis change maintains full backward compatibility—existing configurations with a single global URL continue to work unchanged.
By @cgati in #8384
Add automatic unit conversion for duration instruments with non-second units
The router now automatically converts duration measurements to match the configured unit for telemetry instruments.
Previously, duration instruments always recorded values in seconds regardless of the configured
unitfield.When you specify units like
"ms"(milliseconds),"us"(microseconds), or"ns"(nanoseconds),the router automatically converts the measured duration to the appropriate scale.
Supported units:
"s"- seconds (default)"ms"- milliseconds"us"- microseconds"ns"- nanosecondsNote
Use this feature only when you need to integrate with an observability platform that doesn't properly translate from source time units to target time units (for example, seconds to milliseconds). In all other cases, follow the OTLP convention that you "SHOULD" use seconds as the unit.
Example:
By Jon Christiansen in #8415
Add response reformatting and result coercion errors (PR #8441)
All subgraph responses are checked and corrected to ensure alignment with the schema and query. When a misaligned value is returned, it's nullified. When the feature is enabled, errors for this nullification are now included in the errors array in the response.
By @TylerBloom in #8441
Add router overhead metric (PR #8455)
The
apollo.router.overheadhistogram provides a direct measurement of router processing overhead. This metric tracks the time the router spends on tasks other than waiting for downstream HTTP requests—including GraphQL parsing, validation, query planning, response composition, and plugin execution.The overhead calculation excludes time spent waiting for downstream HTTP services (subgraphs and connectors), giving you visibility into the router's actual processing time versus downstream latency. This metric helps identify when the router itself is a bottleneck versus when delays are caused by downstream services.
Note: Coprocessor request time is currently included in the overhead calculation. In a future release, coprocessor time may be excluded similar to subgraphs and connectors.
Note that the use of this metric is nuanced, and there is risk misinterpretation. See the full docs for this metric to help understand how it can be used.
By @BrynCooke in #8455
Include invalid Trace ID values in error logs (PR #8149)
Error messages for malformed Trace IDs now include the invalid value to help with debugging. Previously, when the router received an unparseable Trace ID in incoming requests, error logs only indicated that the Trace ID was invalid without showing the actual value.
Trace IDs can be unparseable due to invalid hexadecimal characters, incorrect length, or non-standard formats. Including the invalid value in error logs makes it easier to diagnose and resolve tracing configuration issues.
By @juancarlosjr97 in #8149
Add ability to rename metrics (PR #8424)
The router can now rename instruments via OpenTelemetry views.
Benefits:
By Jon Christiansen in #8412
🐛 Fixes
Reload telemetry only when configuration changes (PR #8328)
Previously, schema or config reloads would always reload telemetry, dropping existing exporters and creating new ones.
Telemetry exporters are now only recreated when relevant configuration has changed.
By @BrynCooke in #8328
Replace Redis connections metric with clients metric (PR #8161)
The
apollo.router.cache.redis.connectionsmetric has been removed and replaced with theapollo.router.cache.redis.clientsmetric.The
connectionsmetric was implemented with an up-down counter that would sometimes not be collected properly (it could go negative). The nameconnectionswas also inaccurate since Redis clients each make multiple connections, one to each node in the Redis pool (if in clustered mode).The new
clientsmetric counts the number of clients across the router via anAtomicU64and surfaces that value in a gauge.Note: The old metric included a
kindattribute to reflect the number of clients in each pool (for example, entity caching, query planning). The new metric doesn't include this attribute; the purpose of the metric is to ensure the number of clients isn't growing unbounded (#7319).By @carodewig in #8161
Prevent entity caching of expired data based on Age header (PR #8456)
When the
Ageheader is higher than themax-agedirective inCache-Control, the router no longer caches the data because it's already expired.For example, with these headers:
The data won't be cached since
Age(90) exceedsmax-age(5).By @bnjjj in #8456
Reduce config and schema reload log noise (PR #8336)
File watch events during an existing hot reload no longer spam the logs. Hot reload continues as usual after the existing reload finishes.
By @goto-bus-stop in #8336
Prevent query planning errors for
@shareablemutation fields (PR #8352)Query planning a mutation operation that executes a
@shareablemutation field at the top level may unexpectedly error when attempting to generate a plan where that mutation field is called more than once across multiple subgraphs. Query planning now avoids generating such plans.By @sachindshinde in #8352
Prevent UpDownCounter drift using RAII guards (PR #8379)
UpDownCounters now use RAII guards instead of manual incrementing and decrementing, ensuring they're always decremented when dropped.
This fix resolves drift in
apollo.router.opened.subscriptionsthat occurred due to manual incrementing and decrementing.By @BrynCooke in #8379
Reduce Rhai short circuit response log noise (PR #8364)
Rhai scripts that short-circuit the pipeline by throwing now only log an error if a response body isn't present.
For example the following will NOT log:
For example the following WILL log:
By @BrynCooke in #8364
Prevent query planning error where
@requiressubgraph jump fetches@keyfrom wrong subgraph (PR #8016)During query planning, a subgraph jump added due to a
@requiresfield may sometimes try to collect the necessary@keyfields from an upstream subgraph fetch as an optimization, but it wasn't properly checking whether that subgraph had those fields. This is now fixed and resolves query planning errors with messages like "Cannot add selection of fieldT.idto selection set of parent typeT".By @sachindshinde in #8016
Reduce log level for interrupted WebSocket streams (PR #8344)
The router now logs interrupted WebSocket streams at
tracelevel instead oferrorlevel.Previously, WebSocket stream interruptions logged at
errorlevel, creating excessive noise in logs when clients disconnected normally or networks experienced transient issues. Client disconnections and network interruptions are expected operational events that don't require immediate attention.Your logs will now be cleaner and more actionable, making genuine errors easier to spot. You can enable
tracelevel logging when debugging WebSocket connection issues.By @bnjjj in #8344
Respect Redis cluster slots when inserting multiple items (PR #8185)
The existing
insertcode would silently fail when trying to insert multiple values that correspond to different Redis cluster hash slots. This change corrects that behavior, raises errors when inserts fail, and adds new metrics to track Redis client health.New metrics:
apollo.router.cache.redis.unresponsive: counter for 'unresponsive' events raised by the Redis librarykind: Redis cache purpose (APQ,query planner,entity)server: Redis server that became unresponsiveapollo.router.cache.redis.reconnection: counter for 'reconnect' events raised by the Redis librarykind: Redis cache purpose (APQ,query planner,entity)server: Redis server that required client reconnectionBy @carodewig in #8185
Prevent unnecessary precomputation during query planner construction (PR #8373)
A regression introduced in v2.5.0 caused query planner construction to unnecessarily precompute metadata, leading to increased CPU and memory utilization during supergraph loading. Query planner construction now correctly avoids this unnecessary precomputation.
By @sachindshinde in #8373
Update cache key version for entity caching (PR #8458)
Important
If you have enabled Entity caching, this release contains changes that necessarily alter the hashing algorithm used for the cache keys. You should anticipate additional cache regeneration cost when updating between these versions while the new hashing algorithm comes into service.
The entity cache key version has been bumped to avoid keeping invalid cached data for too long (fixed in #8456).
By @bnjjj in #8458
📃 Configuration
Add telemetry instrumentation config for
http_clientheaders (PR #8349)A new telemetry instrumentation configuration for
http_clientspans allows request headers added by Rhai scripts to be attached to thehttp_clientspan. Thesome_rhai_response_headervalue remains available on the subgraph span as before.By @bonnici in #8349
Promote Subgraph Insights metrics flag to general availability (PR #8392)
The
subgraph_metricsconfig flag that powers the Studio Subgraph Insights feature is now promoted frompreviewto general availability.The flag name has been updated from
preview_subgraph_metricstoBy @david_castaneda in #8392
🛠 Maintenance
Add export destination details to trace and metrics error messages (PR #8363)
Error messages raised during tracing and metric exports now indicate whether the error occurred when exporting to Apollo Studio or to your configured OTLP or Zipkin endpoint. For example, errors that occur when exporting Apollo Studio traces look like:
OpenTelemetry trace error occurred: [apollo traces] <etc>while errors that occur when exporting traces to your configured OTLP endpoint look like:
OpenTelemetry trace error occurred: [otlp traces] <etc>By @bonnici in #8363
📚 Documentation
Change MCP default port from 5000 to 8000 (PR #8375)
MCP's default port has changed from 5000 to 8000.
Add Render and Railway deployment guides (PR #8242)
Two new deployment guides are now available for popular hosting platforms: Render and Railway.
By @the-gigi-apollo in #8242
Add comprehensive context key reference (PR #8420)
The documentation now includes a comprehensive reference for all context keys the router supports.
By @faisalwaseem in #8420
Reorganize observability documentation structure (PR #8183)
Restructured the router observability and telemetry documentation to improve content discoverability and user experience. GraphOS insights documentation and router OpenTelemetry telemetry documentation are now in separate sections, with APM-specific documentation organized in dedicated folders for each APM provider (Datadog, Dynatrace, Jaeger, Prometheus, New Relic, Zipkin). This reorganization makes it easier for users to find relevant monitoring and observability configuration for their specific APM tools.
By @Robert113289 in #8183
Add comprehensive Datadog integration documentation (PR #8319)
The Datadog APM guide has been expanded to include the OpenTelemetry Collector, recommended router telemetry configuration, and out-of-the-box dashboard templates:
By @Robert113289 in #8319
Clarify timeout hierarchy for traffic shaping (PR #8203)
The documentation reflects more clearly that subgraph timeouts should not be higher than the router timeout or the router timeout will initiate prior to the subgraph.
By @abernix in #8203