Skip to content

Commit 3ca3ae7

Browse files
committed
Fix opentelemetry-instrumentation-tornado server (request) duration metric calculation (#3486)
1 parent 74536f1 commit 3ca3ae7

File tree

2 files changed

+10
-2
lines changed
  • instrumentation/opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado

2 files changed

+10
-2
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
139139
([#3447](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3447))
140140
- `opentelemetry-instrumentation-botocore` Capture server attributes for botocore API calls
141141
([#3448](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3448))
142+
- `opentelemetry-instrumentation-tornado` Fix server (request) duration metric calculation
143+
([#3486](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3486))
142144

143145
## Version 1.32.0/0.53b0 (2025-04-10)
144146

instrumentation/opentelemetry-instrumentation-tornado/src/opentelemetry/instrumentation/tornado/__init__.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ def client_response_hook(span, future):
211211

212212
_logger = getLogger(__name__)
213213
_TraceContext = namedtuple("TraceContext", ["activation", "span", "token"])
214+
_HANDLER_STATE_KEY = "_otel_state_key"
214215
_HANDLER_CONTEXT_KEY = "_otel_trace_context_key"
215216
_OTEL_PATCHED_KEY = "_otel_patched_key"
216217

@@ -402,7 +403,10 @@ def _wrap(cls, method_name, wrapper):
402403
def _prepare(
403404
tracer, server_histograms, request_hook, func, handler, args, kwargs
404405
):
405-
server_histograms[_START_TIME] = default_timer()
406+
otel_handler_state = {
407+
_START_TIME: default_timer()
408+
}
409+
setattr(handler, _HANDLER_STATE_KEY, otel_handler_state)
406410

407411
request = handler.request
408412
if _excluded_urls.url_disabled(request.uri):
@@ -622,8 +626,10 @@ def _record_prepare_metrics(server_histograms, handler):
622626

623627

624628
def _record_on_finish_metrics(server_histograms, handler, error=None):
629+
otel_handler_state = getattr(handler, _HANDLER_STATE_KEY, None) or {}
630+
start_time = otel_handler_state.get(_START_TIME, None) or default_timer()
625631
elapsed_time = round(
626-
(default_timer() - server_histograms[_START_TIME]) * 1000
632+
(default_timer() - start_time) * 1000
627633
)
628634

629635
response_size = int(handler._headers.get("Content-Length", 0))

0 commit comments

Comments
 (0)