Found while implementing the transport-owned http_requests_total seam for #9650 (PR #9746). Filed unassigned; not graded by the filing seat.
The claim, read on 8957c72227
#9650's ruling names one metric, and PR #9746 moves exactly that one to the transport. Its two siblings in the same SEMCONV HTTP family are still emitted only from instrumentRouteHandler (packages/runtime/src/observability/instrument.ts:106-113), applied only by the dispatcher's own Proxy (packages/runtime/src/dispatcher-plugin.ts:700-721):
http_request_duration_ms (histogram, labels method, route)http_request_errors_total (counter, labels method, route)
So the identical blind spot #9650 was filed about — auth's getRawApp() mount, the REST data API via RouteManager, and the other measured surfaces in those two classes — remains for both.
Why it matters separately from #9650
The docs' operator guidance names two derived signals, and this leaves them inconsistent with each other after #9650 lands:
An operator reading one dashboard would see request volume for /api/v1/* next to a latency panel that has no series for it at all. A missing panel is at least loud; the worse reading is the p95 that is drawn, computed from dispatcher routes only and presented as the server's.
packages/observability/src/semconv.ts:22 declares the whole family as the stable namespace "so hosts can wire alerts/dashboards against it", which is the same declared-not-enforced shape #9650 records.
Not folded into #9650 because
The 2026-08-18 ruling is explicit and narrow: emit http_requests_total from the adapter. Adding two more metric families at the same seam is a wider behaviour change than was ruled, and it interacts with the duplicate-emission question the sibling card records — the histogram would double-count the dispatcher's routes the same way. Sequencing matters, so it is filed rather than smuggled in.
Shape a fix would take
The transport seam already reads everything both need: elapsed time around await next(), the matched pattern, and the status. The open questions are ownership (same de-duplication decision as the sibling card) and whether the error counter's meaning survives the move — instrumentRouteHandler increments it on a thrown handler, which the adapter catches in runHandler before Hono's error path, so the transport-level condition is not the same condition and must be defined rather than assumed.
Generated by Claude Code
Found while implementing the transport-owned
http_requests_totalseam for #9650 (PR #9746). Filed unassigned; not graded by the filing seat.The claim, read on
8957c72227#9650's ruling names one metric, and PR #9746 moves exactly that one to the transport. Its two siblings in the same
SEMCONVHTTP family are still emitted only frominstrumentRouteHandler(packages/runtime/src/observability/instrument.ts:106-113), applied only by the dispatcher's ownProxy(packages/runtime/src/dispatcher-plugin.ts:700-721):http_request_duration_ms(histogram, labelsmethod,route)http_request_errors_total(counter, labelsmethod,route)So the identical blind spot #9650 was filed about — auth's
getRawApp()mount, the REST data API viaRouteManager, and the other measured surfaces in those two classes — remains for both.Why it matters separately from #9650
The docs' operator guidance names two derived signals, and this leaves them inconsistent with each other after #9650 lands:
http_requests_total— covered on the Hono transport once PR fix(hono-server): emit http_requests_total from the transport so every inbound mount is counted (#9650) #9746 is wired;http_request_duration_ms— still dispatcher-only.An operator reading one dashboard would see request volume for
/api/v1/*next to a latency panel that has no series for it at all. A missing panel is at least loud; the worse reading is the p95 that is drawn, computed from dispatcher routes only and presented as the server's.packages/observability/src/semconv.ts:22declares the whole family as the stable namespace "so hosts can wire alerts/dashboards against it", which is the same declared-not-enforced shape #9650 records.Not folded into #9650 because
The 2026-08-18 ruling is explicit and narrow: emit
http_requests_totalfrom the adapter. Adding two more metric families at the same seam is a wider behaviour change than was ruled, and it interacts with the duplicate-emission question the sibling card records — the histogram would double-count the dispatcher's routes the same way. Sequencing matters, so it is filed rather than smuggled in.Shape a fix would take
The transport seam already reads everything both need: elapsed time around
await next(), the matched pattern, and the status. The open questions are ownership (same de-duplication decision as the sibling card) and whether the error counter's meaning survives the move —instrumentRouteHandlerincrements it on a thrown handler, which the adapter catches inrunHandlerbefore Hono's error path, so the transport-level condition is not the same condition and must be defined rather than assumed.Generated by Claude Code