Skip to content

Commit 01d3752

Browse files
authored
release: v2.11.0
2 parents 8fc2c3c + 0695770 commit 01d3752

File tree

301 files changed

+17466
-1925
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

301 files changed

+17466
-1925
lines changed

.circleci/config.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,15 @@ executors:
8787
shell: bash.exe --login -eo pipefail
8888
environment:
8989
MISE_ENV: ci,windows
90+
CARGO_BUILD_JOBS: 4
9091
windows_test: &windows_test_executor
9192
machine:
9293
image: "windows-server-2019-vs2019:2024.02.21"
9394
resource_class: windows.2xlarge
9495
shell: bash.exe --login -eo pipefail
9596
environment:
9697
MISE_ENV: ci,windows
98+
CARGO_BUILD_JOBS: 4
9799

98100
# We don't use {{ arch }} because on windows it is unstable https://discuss.circleci.com/t/value-of-arch-unstable-on-windows/40079
99101
parameters:

.config/mise/config.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
[tools]
22
# renovate-automation: rustc version
33
rust = "1.91.1"
4-
"aqua:cargo-bins/cargo-binstall" = "1.16.2"
4+
"aqua:cargo-bins/cargo-binstall" = "1.16.3"
55
"cargo:cargo-nextest" = "0.9.70"
6-
"cargo:cargo-deny" = "0.18.2"
6+
"cargo:cargo-deny" = "0.18.9"
77
"cargo:cargo-edit" = "0.13.0"
88
"cargo:cargo-about" = "0.8.0"
99
"cargo:cargo-insta" = "1.38.0"
@@ -13,7 +13,7 @@ rust = "1.91.1"
1313
"cargo:typos-cli" = "1.31.1"
1414
protoc = "33.1"
1515
gh = "2.72.0"
16-
helm = "3.19.2"
16+
helm = "3.19.4"
1717
helm-docs = "1.14.2"
1818
yq = "4.49.2"
1919
jq = "1.8.1"

.github/CODEOWNERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
/apollo-federation/src/connectors @apollographql/graph-dev
55
/apollo-router/ @apollographql/router-core
66
/apollo-router/src/plugins/connectors @apollographql/graph-dev
7-
/apollo-router/src/plugins/fleet_detector.rs @apollographql/cloud-fleet
7+
/apollo-router/src/plugins/fleet_detector.rs @apollographql/runtime-readiness
88
/apollo-router-benchmarks/ @apollographql/router-core @apollographql/fed-core
99
/examples/ @apollographql/router-core @apollographql/fed-core
1010
/.github/CODEOWNERS @apollographql/router-core @apollographql/fed-core

CHANGELOG.md

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,220 @@
22

33
This project adheres to [Semantic Versioning v2.0.0](https://semver.org/spec/v2.0.0.html).
44

5+
# [2.11.0] - 2026-01-27
6+
7+
## 🚀 Features
8+
9+
### Support client awareness metadata via HTTP headers ([PR #8503](https://github.com/apollographql/router/pull/8503))
10+
11+
Clients can now send library name and version metadata for client awareness and enhanced client awareness using HTTP headers. This provides a consistent transport mechanism instead of splitting values between headers and `request.extensions`.
12+
13+
By [@calvincestari](https://github.com/calvincestari) in https://github.com/apollographql/router/pull/8503
14+
15+
### Reload OCI artifacts when a tag reference changes ([PR #8805](https://github.com/apollographql/router/pull/8805))
16+
17+
You can now configure tag-based OCI references in the router. When you use a tag reference such as `artifacts.apollographql.com/my-org/my-graph:prod`, the router polls and reloads when that tag points to a new artifact.
18+
19+
This also applies to automatically generated variant tags and custom tags.
20+
21+
By [@graytonio](https://github.com/graytonio) in https://github.com/apollographql/router/pull/8805
22+
23+
### Add memory limit option for cooperative cancellation ([PR #8808](https://github.com/apollographql/router/pull/8808))
24+
25+
The router now supports a `memory_limit` option on `experimental_cooperative_cancellation` to cap memory allocations during query planning. When the memory limit is exceeded, the router:
26+
27+
- In `enforce` mode, cancels query planning and returns an error to the client.
28+
- In `measure` mode, records the cancellation outcome in metrics and allows query planning to complete.
29+
30+
The memory limit works alongside the existing `timeout` option. Whichever limit is reached first triggers cancellation.
31+
32+
This feature is only available on Unix platforms when the `global-allocator` feature is enabled and `dhat-heap` is not enabled.
33+
34+
Example configuration:
35+
36+
```yaml
37+
supergraph:
38+
query_planning:
39+
experimental_cooperative_cancellation:
40+
enabled: true
41+
mode: enforce # or "measure" to only record metrics
42+
memory_limit: 50mb # Supports formats like "50mb", "1gb", "1024kb", etc.
43+
timeout: 5s # Optional: can be combined with memory_limit
44+
```
45+
46+
By [@rohan-b99](https://github.com/rohan-b99) in https://github.com/apollographql/router/pull/8808
47+
48+
### Add memory tracking metrics for requests ([PR #8717](https://github.com/apollographql/router/pull/8717))
49+
50+
The router now emits two histogram metrics to track memory allocation activity during request processing:
51+
52+
- `apollo.router.request.memory`: Memory activity across the full request lifecycle (including parsing, validation, query planning, and plugins)
53+
- `apollo.router.query_planner.memory`: Memory activity for query planning work in the compute job thread pool
54+
55+
Each metric includes:
56+
57+
- `allocation.type`: `allocated`, `deallocated`, `zeroed`, or `reallocated`
58+
- `context`: The tracking context name (for example, `router.request` or `query_planning`)
59+
60+
This feature is only available on Unix platforms when the `global-allocator` feature is enabled and `dhat-heap` is not enabled.
61+
62+
By [@rohan-b99](https://github.com/rohan-b99) in https://github.com/apollographql/router/pull/8717
63+
64+
## 🐛 Fixes
65+
66+
### Support nullable `@key` fields in response caching ([PR #8767](https://github.com/apollographql/router/pull/8767))
67+
68+
Response caching can now use nullable `@key` fields. Previously, the response caching feature rejected nullable `@key` fields, which prevented caching in schemas that use them.
69+
70+
When you cache data keyed by nullable fields, keep your cache keys simple and avoid ambiguous `null` values.
71+
72+
By [@aaronArinder](https://github.com/aaronArinder) in https://github.com/apollographql/router/pull/8767
73+
74+
### Return `429` instead of `503` when enforcing a rate limit ([PR #8765](https://github.com/apollographql/router/pull/8765))
75+
76+
In v2.0.0, the router changed the rate-limiting error from `429` (`TOO_MANY_REQUESTS`) to `503` (`SERVICE_UNAVAILABLE`). This change restores `429` to align with the [router error documentation](https://www.apollographql.com/docs/graphos/routing/errors#429).
77+
78+
By [@carodewig](https://github.com/carodewig) in https://github.com/apollographql/router/pull/8765
79+
80+
### Add status code and error type attributes to `http_request` spans ([PR #8775](https://github.com/apollographql/router/pull/8775))
81+
82+
The router now always adds the `http.response.status_code` attribute to `http_request` spans (for example, for `router -> subgraph` requests). The router also conditionally adds `error.type` for non-success status codes.
83+
84+
By [@rohan-b99](https://github.com/rohan-b99) in https://github.com/apollographql/router/pull/8775
85+
86+
### Report response cache invalidation failures as errors ([PR #8813](https://github.com/apollographql/router/pull/8813))
87+
88+
The router now returns an error when response cache invalidation fails. Previously, an invalidation attempt could fail without being surfaced as an error.
89+
90+
After you upgrade, you might see an increase in the `apollo.router.operations.response_cache.invalidation.error` metric.
91+
92+
By [@bnjjj](https://github.com/bnjjj) in https://github.com/apollographql/router/pull/8813
93+
94+
### Reuse response cache Redis connections for identical subgraph configuration ([PR #8764](https://github.com/apollographql/router/pull/8764))
95+
96+
The response cache now reuses Redis connection pools when subgraph-level configuration resolves to the same Redis configuration as the global `all` setting. Previously, the router could create redundant Redis connections even when the effective configuration was identical.
97+
98+
Impact: If you configure response caching at both the global and subgraph levels, you should see fewer Redis connections and lower connection overhead.
99+
100+
By [@bnjjj](https://github.com/bnjjj) in https://github.com/apollographql/router/pull/8764
101+
102+
### Prevent TLS connections from hanging when a handshake stalls ([PR #8779](https://github.com/apollographql/router/pull/8779))
103+
104+
The router listener loop no longer blocks while waiting for a TLS handshake to complete. Use `server.http.tls_handshake_timeout` to control how long the router waits before terminating a connection (default: `10s`).
105+
106+
By [@rohan-b99](https://github.com/rohan-b99) in https://github.com/apollographql/router/pull/8779
107+
108+
### Emit cardinality overflow metrics for more OpenTelemetry error formats ([PR #8740](https://github.com/apollographql/router/pull/8740))
109+
110+
The router now emits the `apollo.router.telemetry.metrics.cardinality_overflow` metric for additional OpenTelemetry cardinality overflow error formats.
111+
112+
By [@bonnici](https://github.com/bonnici) in https://github.com/apollographql/router/pull/8740
113+
114+
### Propagate trace context on WebSocket upgrade requests ([PR #8739](https://github.com/apollographql/router/pull/8739))
115+
116+
The router now injects trace propagation headers into the initial HTTP upgrade request when it opens WebSocket connections to subgraphs. This preserves distributed trace continuity between the router and subgraph services.
117+
118+
Trace propagation happens during the HTTP handshake only. After the WebSocket connection is established, headers cannot be added to individual messages.
119+
120+
By [@theJC](https://github.com/theJC) in https://github.com/apollographql/router/pull/8739
121+
122+
### Stop query planning compute jobs when the parent task is canceled ([PR #8741](https://github.com/apollographql/router/pull/8741))
123+
124+
Query planning compute jobs now stop when cooperative cancellation cancels the parent task.
125+
126+
By [@rohan-b99](https://github.com/rohan-b99) in https://github.com/apollographql/router/pull/8741
127+
128+
### Reject invalidation requests with unknown fields ([PR #8752](https://github.com/apollographql/router/pull/8752))
129+
130+
The response cache invalidation endpoint now rejects request payloads that include unknown fields. When unknown fields are present, the router returns HTTP `400` (Bad Request).
131+
132+
By [@bnjjj](https://github.com/bnjjj) in https://github.com/apollographql/router/pull/8752
133+
134+
### Restore plugin access to `SubscriptionTaskParams` in `execution::Request` builders ([PR #8771](https://github.com/apollographql/router/pull/8771))
135+
136+
Plugins and other external crates can use `SubscriptionTaskParams` with `execution::Request` builders again. This restores compatibility for plugin unit tests that construct subscription requests.
137+
138+
By [@aaronArinder](https://github.com/aaronArinder) in https://github.com/apollographql/router/pull/8771
139+
140+
### Support JWT tokens with multiple audiences ([PR #8780](https://github.com/apollographql/router/pull/8780))
141+
142+
When `issuers` or `audiences` is included in the router's JWK configuration, the router will check each request's JWT for `iss` or `aud` and reject requests with mismatches.
143+
144+
Expected behavior:
145+
- If present, the [`iss`](https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.1) claim must be specified as a string.
146+
- ✅ The JWK's `issuers` is empty.
147+
- ✅ The `iss` is a string and is present in the JWK's `issuers`.
148+
- ✅ The `iss` is null.
149+
- ❌ The `iss` is a string but is not present in the JWK's `issuers`.
150+
- ❌ The `iss` is not a string or null.
151+
- If present, the [`aud`](https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.3) claim can be specified as either a string or an array of strings.
152+
- ✅ The JWK's `audiences` is empty.
153+
- ✅ The `aud` is a string and is present in the JWK's `audiences`.
154+
- ✅ The `aud` is an array of strings and at least one of those strings is present in the JWK's `audiences`.
155+
- ❌ The `aud` is not a string or array of strings (i.e., null).
156+
157+
Behavior prior to this change:
158+
- If the `iss` was not null or a string, it was permitted (regardless of its value).
159+
- If the `aud` was an array, it was rejected (regardless of its value).
160+
161+
By [@carodewig](https://github.com/carodewig) in https://github.com/apollographql/router/pull/8780
162+
163+
### Enforce feature restrictions for warning-state licenses ([PR #8768](https://github.com/apollographql/router/pull/8768))
164+
165+
The router now enforces license restrictions even when a license is in a warning state. Previously, warning-state licenses could bypass enforcement for restricted features.
166+
167+
If your deployment uses restricted features, the router returns an error instead of continuing to run.
168+
169+
By [@aaronArinder](https://github.com/aaronArinder) in https://github.com/apollographql/router/pull/8768
170+
171+
## 🛠 Maintenance
172+
173+
### Warn at startup when `OTEL_EXPORTER_OTLP_ENDPOINT` is set ([PR #8729](https://github.com/apollographql/router/pull/8729))
174+
175+
The router now displays a warning at startup if the `OTEL_EXPORTER_OTLP_ENDPOINT` environment variable is set. This variable takes precedence over default configurations and can override trace export to Apollo Studio, so the warning helps you identify when telemetry data might not be sent where expected.
176+
177+
By [@apollo-mateuswgoettems](https://github.com/apollo-mateuswgoettems) in https://github.com/apollographql/router/pull/8729
178+
179+
### Increase Redis 'unresponsive' check frequency ([PR #8763](https://github.com/apollographql/router/pull/8763))
180+
181+
Perform the 'unresponsive' check every two seconds. This aligns with the Redis client's guideline that the check interval should be less than half the timeout value.
182+
183+
By [@carodewig](https://github.com/carodewig) in https://github.com/apollographql/router/pull/8763
184+
185+
## 📚 Documentation
186+
187+
### Fix subscription licensing discrepancy in documentation ([PR #8726](https://github.com/apollographql/router/pull/8726))
188+
189+
Corrected the subscription support documentation to reflect that subscriptions are available on all GraphOS plans (Free, Developer, Standard, and Enterprise) with self-hosted routers.
190+
191+
The documentation previously stated that subscription support was an Enterprise-only feature for self-hosted routers, which was incorrect. Subscriptions are a licensed feature available to all GraphOS plans when the router is connected to GraphOS with an API key and graph ref.
192+
193+
Updated both the configuration and overview pages to remove the misleading Enterprise-only requirement and clarify the actual requirements.
194+
195+
By [@gigi](https://github.com/the-gigi-apollo) in https://github.com/apollographql/router/pull/8726
196+
197+
### Clarify traffic shaping compression headers in documentation ([PR #8773](https://github.com/apollographql/router/pull/8773))
198+
199+
The traffic shaping documentation now clearly explains how the router handles HTTP compression headers for subgraph requests. It clarifies that `content-encoding` is set when compression is configured via `traffic_shaping`, while `accept-encoding` is automatically set on all subgraph requests to indicate the router can accept compressed responses (`gzip`, `br`, or `deflate`). The documentation also notes that these headers are added after requests are added to the debug stack, so they won't appear in the Connectors Debugger.
200+
201+
By [@gigi](https://github.com/the-gigi-apollo) in https://github.com/apollographql/router/pull/8773
202+
203+
### Document default histogram buckets and their relationship to timeout settings ([PR #8783](https://github.com/apollographql/router/pull/8783))
204+
205+
The documentation now explains how histogram bucket configuration affects timeout monitoring in Prometheus and other metrics exporters.
206+
207+
The documentation now includes:
208+
209+
- Default bucket values: The router's default histogram buckets (`0.001` to `10.0` seconds)
210+
- Timeout behavior: Histogram metrics cap values at the highest bucket boundary, which can make timeouts appear ignored if they exceed ten seconds
211+
- Customization guidance: Configure custom buckets via `telemetry.exporters.metrics.common.buckets` to match your timeout settings
212+
213+
This update helps users understand why their timeout metrics may not behave as expected and provides clear guidance on customizing buckets for applications with longer timeout configurations.
214+
215+
By [@the-gigi-apollo](https://github.com/the-gigi-apollo) in https://github.com/apollographql/router/pull/8783
216+
217+
218+
5219
# [2.10.0] - 2025-12-11
6220

7221
## 🚀 Features

0 commit comments

Comments
 (0)