Fix double end() calls in KtorServerTelemetry
#15452
Open
+135
−20
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.
Issue Negative http_server_active_requests when collecting ktor metrics
Steps to reproduce:
respond:KtorServerTelemetry:http_server_active_requests = -1Solution
Ktor’s internal send pipeline (
ApplicationSendPipeline) can execute multiple times for a single ApplicationCall, for example, when an exception occurs during sending, then Ktor generates a fallback error response.The original instrumentation relied on
application.sendPipeline.intercept(...), this interceptor is invoked on every send pipeline run, not once per request. As a result,instrumenter.start()is called once (+1 active request), instrumenter.end() is called 1 or 2 times (-1 or -2 active requests), so the counter can become negative.The idea is to change current interceptor to hook
on(ResponseSent). It should be triggered only once, starting from Ktor version3.3.3since there was a bug KTOR-9125. And because of this bug I addedprocessedKeyattribute to avoid double invocation.