Commit 6963eb6
authored
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
File tree
- .changeset
- bin/router
- lib/executor
Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 0 additions & 8 deletions
This file was deleted.
This file was deleted.
This file was deleted.
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
116 | 116 | | |
117 | 117 | | |
118 | 118 | | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
119 | 188 | | |
120 | 189 | | |
121 | 190 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
27 | | - | |
| 27 | + | |
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
97 | 162 | | |
98 | 163 | | |
99 | 164 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
0 commit comments