Skip to content

Commit 6393e84

Browse files
authored
Fix to properly skip all tornado server telemetry when URL excluded (#3680)
* Fix `opentelemetry-instrumentation-tornado` server (request) duration metric calculation (#3486) * Update changelog * Fix to properly skip all tornado server telemetry when URL excluded. * Linting
1 parent 5f0d4ff commit 6393e84

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1919
([#3664](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3664))
2020
- `opentelemetry-instrumentation-fastapi`: Fix memory leak in `uninstrument_app()` by properly removing apps from the tracking set
2121
([#3688](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3688)
22-
- `opentelemetry-instrumentation-tornado` Fix server (request) duration metric calculation
22+
- `opentelemetry-instrumentation-tornado`: Fix server (request) duration metric calculation
2323
([#3679](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3679))
24+
- `opentelemetry-instrumentation-tornado`: Fix to properly skip all server telemetry when URL excluded.
25+
([#3680](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3680))
2426
- `opentelemetry-instrumentation`: Avoid calls to `context.detach` with `None` token.
2527
([#3673](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3673))
2628
- `opentelemetry-instrumentation-starlette`/`opentelemetry-instrumentation-fastapi`: Fixes a crash when host-based routing is used

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,11 +403,14 @@ def _wrap(cls, method_name, wrapper):
403403
def _prepare(
404404
tracer, server_histograms, request_hook, func, handler, args, kwargs
405405
):
406-
otel_handler_state = {_START_TIME: default_timer()}
406+
request = handler.request
407+
otel_handler_state = {
408+
_START_TIME: default_timer(),
409+
"exclude_request": _excluded_urls.url_disabled(request.uri),
410+
}
407411
setattr(handler, _HANDLER_STATE_KEY, otel_handler_state)
408412

409-
request = handler.request
410-
if _excluded_urls.url_disabled(request.uri):
413+
if otel_handler_state["exclude_request"]:
411414
return func(*args, **kwargs)
412415

413416
_record_prepare_metrics(server_histograms, handler)
@@ -625,6 +628,8 @@ def _record_prepare_metrics(server_histograms, handler):
625628

626629
def _record_on_finish_metrics(server_histograms, handler, error=None):
627630
otel_handler_state = getattr(handler, _HANDLER_STATE_KEY, None) or {}
631+
if otel_handler_state.get("exclude_request"):
632+
return
628633
start_time = otel_handler_state.get(_START_TIME, None) or default_timer()
629634
elapsed_time = round((default_timer() - start_time) * 1000)
630635

instrumentation/opentelemetry-instrumentation-tornado/tests/test_metrics_instrumentation.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,3 +252,16 @@ def test_metric_uninstrument(self):
252252
for point in list(metric.data.data_points):
253253
if isinstance(point, HistogramDataPoint):
254254
self.assertEqual(point.count, 1)
255+
256+
def test_exclude_lists(self):
257+
def test_excluded(path):
258+
self.fetch(path)
259+
260+
# Verify no server metrics written (only client ones should exist)
261+
metrics = self.get_sorted_metrics()
262+
for metric in metrics:
263+
self.assertTrue("http.server" not in metric.name, metric)
264+
self.assertEqual(len(metrics), 3, metrics)
265+
266+
test_excluded("/healthz")
267+
test_excluded("/ping")

0 commit comments

Comments
 (0)