Skip to content

Commit 6963eb6

Browse files
chore(release): router crates and artifacts (#1274)
> [!IMPORTANT] > Merging this pull request will create these releases # hive-router 0.0.82 (2026-07-13) ## Features ### Add OpenTelemetry metrics for GraphQL subscriptions Add end-to-end observability into subscription activity between clients, the router, and subgraphs. ## Live state | Metric | Labels | Unit | Description | | ------------------------------------------------- | ----------------------------------------- | ---------------- | ----------------------------------------------------------- | | `hive.router.subscriptions.clients.active` | `subscription.transport` | `{subscription}` | Active subscription operations from clients to the router | | `hive.router.subscriptions.clients.connections` | `subscription.transport` | `{connection}` | Active client transport connections carrying subscriptions | | `hive.router.subscriptions.subgraphs.active` | `subgraph.name` | `{subscription}` | Active subscription operations from the router to subgraphs | | `hive.router.subscriptions.subgraphs.connections` | `subgraph.name`, `subscription.transport` | `{connection}` | Active transport connections from the router to subgraphs | Operations and connections are measured separately because one connection can carry multiple operations, while subscription deduplication can fan one subgraph operation out to multiple clients. ## Lifecycle | Metric | Labels | Unit | Description | | --------------------------------------------------- | --------------------------------------------------- | ---------------- | ------------------------------ | | `hive.router.subscriptions.clients.started_total` | `subscription.transport` | `{subscription}` | Client subscriptions started | | `hive.router.subscriptions.clients.ended_total` | `subscription.transport`, `subscription.end_reason` | `{subscription}` | Client subscriptions ended | | `hive.router.subscriptions.subgraphs.started_total` | `subgraph.name` | `{subscription}` | Subgraph subscriptions started | | `hive.router.subscriptions.subgraphs.ended_total` | `subgraph.name` | `{subscription}` | Subgraph subscriptions ended | Every recorded start has exactly one matching end. Client end reasons are `completed` when the source finishes normally, `error` when an error is delivered to the client, and `client_disconnected` when the client disconnects, unsubscribes, or the router otherwise drops the stream. The counters expose subscription churn and remain meaningful across router restarts. Comparing start and end rates can reveal mass disconnects or reconnect loops even when the active subscription count appears stable. ## Message delivery | Metric | Labels | Unit | Description | | ------------------------------------------------------------ | ------------------------ | ----------- | -------------------------------------------------------------------------- | | `hive.router.subscriptions.clients.sent_messages_total` | `subscription.transport` | `{message}` | Messages successfully sent to client subscribers | | `hive.router.subscriptions.clients.lagged_messages_total` | `subscription.transport` | `{message}` | Messages skipped for lagging clients on broadcast fan-out | | `hive.router.subscriptions.subgraphs.dropped_messages_total` | `subscription.transport` | `{message}` | Subgraph messages dropped because an internal subscription buffer was full | Lagged and dropped counters increase by the number of messages skipped without terminating the subscription. `sent_messages_total / (sent_messages_total + lagged_messages_total)` provides the client delivery ratio for each transport. `subscription.transport` can be `websocket`, `http_multipart`, `http_sse`, or `http_callback`. Units such as `{subscription}`, `{connection}`, and `{message}` are UCUM annotations that identify what each instrument counts. ## Fixes ### Drop messages instead of completing subscriptions in the HTTP callback transport When an HTTP callback subscription's internal buffer is full, acknowledge the callback and drop only that message instead of returning a 503 response and terminating the subscription. This aligns HTTP callback behavior with the other streaming transports and lets slow consumers recover without reconnecting. ### Log lagged and dropped subscription messages at `debug` level Reduce expected slow-consumer noise by changing logs for lagged client messages and messages dropped from full subscription buffers from `warn` to `debug`. These events no longer imply subscription termination and can be monitored through the subscription metrics. ### Subgraph network/HTTP errors propagation Improves how the router reacts to failed or malformed subgraph HTTP responses. Instead of silently ignoring the HTTP status and content-type, the router now emits a GraphQL error for the failing fetch. The affected field is set to `null` and partial results from other subgraphs are preserved. | Subgraph response | Router behavior | | --- | --- | | `2xx`, valid content-type, valid GraphQL body | passed through unchanged | | `2xx`, valid content-type, valid JSON but no `data`/`errors` | `SUBREQUEST_MALFORMED_RESPONSE` | | `2xx`, valid content-type, body is not valid JSON | `SUBREQUEST_MALFORMED_RESPONSE` | | `2xx`, missing or non-JSON content-type (e.g. `text/html`) | `SUBREQUEST_MALFORMED_RESPONSE` | | Non-2xx status | `SUBREQUEST_HTTP_ERROR` (with `extensions.http.status`) | | Transport/connection failure (no HTTP response) | `SUBREQUEST_HTTP_ERROR` | Fixes [#1229](#1229) # hive-router-plan-executor 6.22.0 (2026-07-13) ## Features ### Add OpenTelemetry metrics for GraphQL subscriptions Add end-to-end observability into subscription activity between clients, the router, and subgraphs. ## Live state | Metric | Labels | Unit | Description | | ------------------------------------------------- | ----------------------------------------- | ---------------- | ----------------------------------------------------------- | | `hive.router.subscriptions.clients.active` | `subscription.transport` | `{subscription}` | Active subscription operations from clients to the router | | `hive.router.subscriptions.clients.connections` | `subscription.transport` | `{connection}` | Active client transport connections carrying subscriptions | | `hive.router.subscriptions.subgraphs.active` | `subgraph.name` | `{subscription}` | Active subscription operations from the router to subgraphs | | `hive.router.subscriptions.subgraphs.connections` | `subgraph.name`, `subscription.transport` | `{connection}` | Active transport connections from the router to subgraphs | Operations and connections are measured separately because one connection can carry multiple operations, while subscription deduplication can fan one subgraph operation out to multiple clients. ## Lifecycle | Metric | Labels | Unit | Description | | --------------------------------------------------- | --------------------------------------------------- | ---------------- | ------------------------------ | | `hive.router.subscriptions.clients.started_total` | `subscription.transport` | `{subscription}` | Client subscriptions started | | `hive.router.subscriptions.clients.ended_total` | `subscription.transport`, `subscription.end_reason` | `{subscription}` | Client subscriptions ended | | `hive.router.subscriptions.subgraphs.started_total` | `subgraph.name` | `{subscription}` | Subgraph subscriptions started | | `hive.router.subscriptions.subgraphs.ended_total` | `subgraph.name` | `{subscription}` | Subgraph subscriptions ended | Every recorded start has exactly one matching end. Client end reasons are `completed` when the source finishes normally, `error` when an error is delivered to the client, and `client_disconnected` when the client disconnects, unsubscribes, or the router otherwise drops the stream. The counters expose subscription churn and remain meaningful across router restarts. Comparing start and end rates can reveal mass disconnects or reconnect loops even when the active subscription count appears stable. ## Message delivery | Metric | Labels | Unit | Description | | ------------------------------------------------------------ | ------------------------ | ----------- | -------------------------------------------------------------------------- | | `hive.router.subscriptions.clients.sent_messages_total` | `subscription.transport` | `{message}` | Messages successfully sent to client subscribers | | `hive.router.subscriptions.clients.lagged_messages_total` | `subscription.transport` | `{message}` | Messages skipped for lagging clients on broadcast fan-out | | `hive.router.subscriptions.subgraphs.dropped_messages_total` | `subscription.transport` | `{message}` | Subgraph messages dropped because an internal subscription buffer was full | Lagged and dropped counters increase by the number of messages skipped without terminating the subscription. `sent_messages_total / (sent_messages_total + lagged_messages_total)` provides the client delivery ratio for each transport. `subscription.transport` can be `websocket`, `http_multipart`, `http_sse`, or `http_callback`. Units such as `{subscription}`, `{connection}`, and `{message}` are UCUM annotations that identify what each instrument counts. ## Fixes ### Log lagged and dropped subscription messages at `debug` level Reduce expected slow-consumer noise by changing logs for lagged client messages and messages dropped from full subscription buffers from `warn` to `debug`. These events no longer imply subscription termination and can be monitored through the subscription metrics. ### Subgraph network/HTTP errors propagation Improves how the router reacts to failed or malformed subgraph HTTP responses. Instead of silently ignoring the HTTP status and content-type, the router now emits a GraphQL error for the failing fetch. The affected field is set to `null` and partial results from other subgraphs are preserved. | Subgraph response | Router behavior | | --- | --- | | `2xx`, valid content-type, valid GraphQL body | passed through unchanged | | `2xx`, valid content-type, valid JSON but no `data`/`errors` | `SUBREQUEST_MALFORMED_RESPONSE` | | `2xx`, valid content-type, body is not valid JSON | `SUBREQUEST_MALFORMED_RESPONSE` | | `2xx`, missing or non-JSON content-type (e.g. `text/html`) | `SUBREQUEST_MALFORMED_RESPONSE` | | Non-2xx status | `SUBREQUEST_HTTP_ERROR` (with `extensions.http.status`) | | Transport/connection failure (no HTTP response) | `SUBREQUEST_HTTP_ERROR` | Fixes [#1229](#1229) Co-authored-by: knope-bot[bot] <152252888+knope-bot[bot]@users.noreply.github.com>
1 parent 3851da8 commit 6963eb6

9 files changed

Lines changed: 139 additions & 83 deletions

.changeset/drop_message_instead_of_complete_subscription_in_http_callback_transport.md

Lines changed: 0 additions & 7 deletions
This file was deleted.

.changeset/relax_logs_relating_to_laggingdropping_subscription_messages_from_warn_to_debug.md

Lines changed: 0 additions & 8 deletions
This file was deleted.

.changeset/subgraph_networkhttp_errors_propagation.md

Lines changed: 0 additions & 19 deletions
This file was deleted.

.changeset/subscriptions_metrics.md

Lines changed: 0 additions & 44 deletions
This file was deleted.

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bin/router/CHANGELOG.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,75 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
116116
### Other
117117

118118
- *(deps)* update release-plz/action action to v0.5.113 ([#389](https://github.com/graphql-hive/router/pull/389))
119+
## 0.0.82 (2026-07-13)
120+
121+
### Features
122+
123+
#### Add OpenTelemetry metrics for GraphQL subscriptions
124+
125+
Add end-to-end observability into subscription activity between clients, the router, and subgraphs.
126+
127+
### Live state
128+
129+
| Metric | Labels | Unit | Description |
130+
| ------------------------------------------------- | ----------------------------------------- | ---------------- | ----------------------------------------------------------- |
131+
| `hive.router.subscriptions.clients.active` | `subscription.transport` | `{subscription}` | Active subscription operations from clients to the router |
132+
| `hive.router.subscriptions.clients.connections` | `subscription.transport` | `{connection}` | Active client transport connections carrying subscriptions |
133+
| `hive.router.subscriptions.subgraphs.active` | `subgraph.name` | `{subscription}` | Active subscription operations from the router to subgraphs |
134+
| `hive.router.subscriptions.subgraphs.connections` | `subgraph.name`, `subscription.transport` | `{connection}` | Active transport connections from the router to subgraphs |
135+
136+
Operations and connections are measured separately because one connection can carry multiple operations, while subscription deduplication can fan one subgraph operation out to multiple clients.
137+
138+
### Lifecycle
139+
140+
| Metric | Labels | Unit | Description |
141+
| --------------------------------------------------- | --------------------------------------------------- | ---------------- | ------------------------------ |
142+
| `hive.router.subscriptions.clients.started_total` | `subscription.transport` | `{subscription}` | Client subscriptions started |
143+
| `hive.router.subscriptions.clients.ended_total` | `subscription.transport`, `subscription.end_reason` | `{subscription}` | Client subscriptions ended |
144+
| `hive.router.subscriptions.subgraphs.started_total` | `subgraph.name` | `{subscription}` | Subgraph subscriptions started |
145+
| `hive.router.subscriptions.subgraphs.ended_total` | `subgraph.name` | `{subscription}` | Subgraph subscriptions ended |
146+
147+
Every recorded start has exactly one matching end. Client end reasons are `completed` when the source finishes normally, `error` when an error is delivered to the client, and `client_disconnected` when the client disconnects, unsubscribes, or the router otherwise drops the stream.
148+
149+
The counters expose subscription churn and remain meaningful across router restarts. Comparing start and end rates can reveal mass disconnects or reconnect loops even when the active subscription count appears stable.
150+
151+
### Message delivery
152+
153+
| Metric | Labels | Unit | Description |
154+
| ------------------------------------------------------------ | ------------------------ | ----------- | -------------------------------------------------------------------------- |
155+
| `hive.router.subscriptions.clients.sent_messages_total` | `subscription.transport` | `{message}` | Messages successfully sent to client subscribers |
156+
| `hive.router.subscriptions.clients.lagged_messages_total` | `subscription.transport` | `{message}` | Messages skipped for lagging clients on broadcast fan-out |
157+
| `hive.router.subscriptions.subgraphs.dropped_messages_total` | `subscription.transport` | `{message}` | Subgraph messages dropped because an internal subscription buffer was full |
158+
159+
Lagged and dropped counters increase by the number of messages skipped without terminating the subscription. `sent_messages_total / (sent_messages_total + lagged_messages_total)` provides the client delivery ratio for each transport.
160+
161+
`subscription.transport` can be `websocket`, `http_multipart`, `http_sse`, or `http_callback`. Units such as `{subscription}`, `{connection}`, and `{message}` are UCUM annotations that identify what each instrument counts.
162+
163+
### Fixes
164+
165+
#### Drop messages instead of completing subscriptions in the HTTP callback transport
166+
167+
When an HTTP callback subscription's internal buffer is full, acknowledge the callback and drop only that message instead of returning a 503 response and terminating the subscription. This aligns HTTP callback behavior with the other streaming transports and lets slow consumers recover without reconnecting.
168+
169+
#### Log lagged and dropped subscription messages at `debug` level
170+
171+
Reduce expected slow-consumer noise by changing logs for lagged client messages and messages dropped from full subscription buffers from `warn` to `debug`. These events no longer imply subscription termination and can be monitored through the subscription metrics.
172+
173+
#### Subgraph network/HTTP errors propagation
174+
175+
Improves how the router reacts to failed or malformed subgraph HTTP responses. Instead of silently ignoring the HTTP status and content-type, the router now emits a GraphQL error for the failing fetch. The affected field is set to `null` and partial results from other subgraphs are preserved.
176+
177+
| Subgraph response | Router behavior |
178+
| --- | --- |
179+
| `2xx`, valid content-type, valid GraphQL body | passed through unchanged |
180+
| `2xx`, valid content-type, valid JSON but no `data`/`errors` | `SUBREQUEST_MALFORMED_RESPONSE` |
181+
| `2xx`, valid content-type, body is not valid JSON | `SUBREQUEST_MALFORMED_RESPONSE` |
182+
| `2xx`, missing or non-JSON content-type (e.g. `text/html`) | `SUBREQUEST_MALFORMED_RESPONSE` |
183+
| Non-2xx status | `SUBREQUEST_HTTP_ERROR` (with `extensions.http.status`) |
184+
| Transport/connection failure (no HTTP response) | `SUBREQUEST_HTTP_ERROR` |
185+
186+
Fixes [#1229](https://github.com/graphql-hive/router/issues/1229)
187+
119188
## 0.0.81 (2026-07-07)
120189

121190
### Fixes

bin/router/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "hive-router"
3-
version = "0.0.81"
3+
version = "0.0.82"
44
edition = "2021"
55
description = "GraphQL router/gateway for Federation"
66
license = "MIT"
@@ -24,7 +24,7 @@ graphiql = []
2424

2525
[dependencies]
2626
hive-router-query-planner = { path = "../../lib/query-planner", version = "2.10.9" }
27-
hive-router-plan-executor = { path = "../../lib/executor", version = "6.21.1" }
27+
hive-router-plan-executor = { path = "../../lib/executor", version = "6.22.0" }
2828
hive-router-config = { path = "../../lib/router-config", version = "0.1.7" }
2929
hive-router-internal = { path = "../../lib/internal", version = "0.0.35" }
3030
hive-console-sdk = { path = "../../lib/hive-console-sdk", version = "0.3.17" }

lib/executor/CHANGELOG.md

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,71 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9494
### Other
9595

9696
- *(deps)* update release-plz/action action to v0.5.113 ([#389](https://github.com/graphql-hive/router/pull/389))
97+
## 6.22.0 (2026-07-13)
98+
99+
### Features
100+
101+
#### Add OpenTelemetry metrics for GraphQL subscriptions
102+
103+
Add end-to-end observability into subscription activity between clients, the router, and subgraphs.
104+
105+
### Live state
106+
107+
| Metric | Labels | Unit | Description |
108+
| ------------------------------------------------- | ----------------------------------------- | ---------------- | ----------------------------------------------------------- |
109+
| `hive.router.subscriptions.clients.active` | `subscription.transport` | `{subscription}` | Active subscription operations from clients to the router |
110+
| `hive.router.subscriptions.clients.connections` | `subscription.transport` | `{connection}` | Active client transport connections carrying subscriptions |
111+
| `hive.router.subscriptions.subgraphs.active` | `subgraph.name` | `{subscription}` | Active subscription operations from the router to subgraphs |
112+
| `hive.router.subscriptions.subgraphs.connections` | `subgraph.name`, `subscription.transport` | `{connection}` | Active transport connections from the router to subgraphs |
113+
114+
Operations and connections are measured separately because one connection can carry multiple operations, while subscription deduplication can fan one subgraph operation out to multiple clients.
115+
116+
### Lifecycle
117+
118+
| Metric | Labels | Unit | Description |
119+
| --------------------------------------------------- | --------------------------------------------------- | ---------------- | ------------------------------ |
120+
| `hive.router.subscriptions.clients.started_total` | `subscription.transport` | `{subscription}` | Client subscriptions started |
121+
| `hive.router.subscriptions.clients.ended_total` | `subscription.transport`, `subscription.end_reason` | `{subscription}` | Client subscriptions ended |
122+
| `hive.router.subscriptions.subgraphs.started_total` | `subgraph.name` | `{subscription}` | Subgraph subscriptions started |
123+
| `hive.router.subscriptions.subgraphs.ended_total` | `subgraph.name` | `{subscription}` | Subgraph subscriptions ended |
124+
125+
Every recorded start has exactly one matching end. Client end reasons are `completed` when the source finishes normally, `error` when an error is delivered to the client, and `client_disconnected` when the client disconnects, unsubscribes, or the router otherwise drops the stream.
126+
127+
The counters expose subscription churn and remain meaningful across router restarts. Comparing start and end rates can reveal mass disconnects or reconnect loops even when the active subscription count appears stable.
128+
129+
### Message delivery
130+
131+
| Metric | Labels | Unit | Description |
132+
| ------------------------------------------------------------ | ------------------------ | ----------- | -------------------------------------------------------------------------- |
133+
| `hive.router.subscriptions.clients.sent_messages_total` | `subscription.transport` | `{message}` | Messages successfully sent to client subscribers |
134+
| `hive.router.subscriptions.clients.lagged_messages_total` | `subscription.transport` | `{message}` | Messages skipped for lagging clients on broadcast fan-out |
135+
| `hive.router.subscriptions.subgraphs.dropped_messages_total` | `subscription.transport` | `{message}` | Subgraph messages dropped because an internal subscription buffer was full |
136+
137+
Lagged and dropped counters increase by the number of messages skipped without terminating the subscription. `sent_messages_total / (sent_messages_total + lagged_messages_total)` provides the client delivery ratio for each transport.
138+
139+
`subscription.transport` can be `websocket`, `http_multipart`, `http_sse`, or `http_callback`. Units such as `{subscription}`, `{connection}`, and `{message}` are UCUM annotations that identify what each instrument counts.
140+
141+
### Fixes
142+
143+
#### Log lagged and dropped subscription messages at `debug` level
144+
145+
Reduce expected slow-consumer noise by changing logs for lagged client messages and messages dropped from full subscription buffers from `warn` to `debug`. These events no longer imply subscription termination and can be monitored through the subscription metrics.
146+
147+
#### Subgraph network/HTTP errors propagation
148+
149+
Improves how the router reacts to failed or malformed subgraph HTTP responses. Instead of silently ignoring the HTTP status and content-type, the router now emits a GraphQL error for the failing fetch. The affected field is set to `null` and partial results from other subgraphs are preserved.
150+
151+
| Subgraph response | Router behavior |
152+
| --- | --- |
153+
| `2xx`, valid content-type, valid GraphQL body | passed through unchanged |
154+
| `2xx`, valid content-type, valid JSON but no `data`/`errors` | `SUBREQUEST_MALFORMED_RESPONSE` |
155+
| `2xx`, valid content-type, body is not valid JSON | `SUBREQUEST_MALFORMED_RESPONSE` |
156+
| `2xx`, missing or non-JSON content-type (e.g. `text/html`) | `SUBREQUEST_MALFORMED_RESPONSE` |
157+
| Non-2xx status | `SUBREQUEST_HTTP_ERROR` (with `extensions.http.status`) |
158+
| Transport/connection failure (no HTTP response) | `SUBREQUEST_HTTP_ERROR` |
159+
160+
Fixes [#1229](https://github.com/graphql-hive/router/issues/1229)
161+
97162
## 6.21.1 (2026-07-07)
98163

99164
### Fixes

lib/executor/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "hive-router-plan-executor"
3-
version = "6.21.1"
3+
version = "6.22.0"
44
edition = "2021"
55
description = "GraphQL query planner executor for Federation specification"
66
license = "MIT"

0 commit comments

Comments
 (0)