Skip to content

Commit 68983d3

Browse files
committed
Modified logic for excluded urls
1 parent 8342416 commit 68983d3

File tree

2 files changed

+89
-12
lines changed

2 files changed

+89
-12
lines changed

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,12 @@ def _wrapped_app(wrapped_app_environ, start_response):
350350
active_requests_counter.add(1, active_requests_count_attrs)
351351
request_route = None
352352

353+
should_trace = False
354+
353355
def _start_response(status, response_headers, *args, **kwargs):
354-
if _should_exclude_request(excluded_urls):
356+
nonlocal should_trace
357+
should_trace = _should_trace(excluded_urls)
358+
if should_trace:
355359
nonlocal request_route
356360
request_route = flask.request.url_rule
357361

@@ -392,7 +396,7 @@ def _start_response(status, response_headers, *args, **kwargs):
392396
return start_response(status, response_headers, *args, **kwargs)
393397

394398
result = wsgi_app(wrapped_app_environ, _start_response)
395-
if _should_exclude_request(excluded_urls):
399+
if should_trace:
396400
duration_s = default_timer() - start
397401
if duration_histogram_old:
398402
duration_attrs_old = otel_wsgi._parse_duration_attrs(
@@ -420,12 +424,14 @@ def _start_response(status, response_headers, *args, **kwargs):
420424
active_requests_counter.add(-1, active_requests_count_attrs)
421425
return result
422426

423-
def _should_exclude_request(excluded_urls):
424-
if flask.request:
425-
return excluded_urls is None or not excluded_urls.url_disabled(
426-
flask.request.url
427+
def _should_trace(excluded_urls) -> bool:
428+
return bool(
429+
flask.request
430+
and (
431+
excluded_urls is None
432+
or not excluded_urls.url_disabled(flask.request.url)
427433
)
428-
return False
434+
)
429435

430436
return _wrapped_app
431437

instrumentation/opentelemetry-instrumentation-flask/tests/test_programmatic.py

Lines changed: 76 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def setUp(self):
164164
self.env_patch = patch.dict(
165165
"os.environ",
166166
{
167-
"OTEL_PYTHON_FLASK_EXCLUDED_URLS": "http://localhost/env_excluded_arg/123,env_excluded_noarg",
167+
"OTEL_PYTHON_FLASK_EXCLUDED_URLS": "http://localhost/env_excluded_arg/123,env_excluded_noarg,env_excluded_arg/789",
168168
OTEL_SEMCONV_STABILITY_OPT_IN: sem_conv_mode,
169169
},
170170
)
@@ -523,8 +523,7 @@ def test_flask_metrics(self):
523523
attr,
524524
_recommended_metrics_attrs_old[metric.name],
525525
)
526-
self.assertTrue(number_data_point_seen)
527-
self.assertFalse(histogram_data_point_seen)
526+
self.assertTrue(number_data_point_seen and histogram_data_point_seen)
528527

529528
def test_flask_metrics_new_semconv(self):
530529
start = default_timer()
@@ -562,8 +561,7 @@ def test_flask_metrics_new_semconv(self):
562561
attr,
563562
_recommended_metrics_attrs_new[metric.name],
564563
)
565-
self.assertTrue(number_data_point_seen)
566-
self.assertFalse(histogram_data_point_seen)
564+
self.assertTrue(number_data_point_seen and histogram_data_point_seen)
567565

568566
def test_flask_metric_values(self):
569567
start = default_timer()
@@ -738,6 +736,79 @@ def test_metric_uninstrument(self):
738736
if isinstance(point, HistogramDataPoint):
739737
self.assertEqual(point.count, 1)
740738

739+
def test_flask_metrics_excluded_urls(self):
740+
start = default_timer()
741+
self.client.get("/env_excluded_arg/123")
742+
self.client.get("/env_excluded_noarg")
743+
self.client.get("/hello/756")
744+
duration = max(round((default_timer() - start) * 1000), 0)
745+
metrics_list = self.memory_metrics_reader.get_metrics_data()
746+
number_data_point_seen = False
747+
histogram_data_point_seen = False
748+
self.assertTrue(len(metrics_list.resource_metrics) != 0)
749+
for resource_metric in metrics_list.resource_metrics:
750+
self.assertTrue(len(resource_metric.scope_metrics) != 0)
751+
for scope_metric in resource_metric.scope_metrics:
752+
self.assertTrue(len(scope_metric.metrics) != 0)
753+
for metric in scope_metric.metrics:
754+
self.assertIn(metric.name, _expected_metric_names_old)
755+
data_points = list(metric.data.data_points)
756+
self.assertEqual(len(data_points), 1)
757+
for point in data_points:
758+
if isinstance(point, HistogramDataPoint):
759+
self.assertEqual(point.count, 1)
760+
self.assertAlmostEqual(
761+
duration, point.sum, delta=10
762+
)
763+
histogram_data_point_seen = True
764+
if isinstance(point, NumberDataPoint):
765+
number_data_point_seen = True
766+
for attr in point.attributes:
767+
self.assertIn(
768+
attr,
769+
_recommended_metrics_attrs_old[metric.name],
770+
)
771+
self.assertTrue(number_data_point_seen and histogram_data_point_seen)
772+
773+
def test_flask_metrics_new_semconv_excluded_urls(self):
774+
start = default_timer()
775+
self.client.get("/env_excluded_arg/123")
776+
self.client.get("/env_excluded_noarg")
777+
self.client.get("/env_excluded_arg/789")
778+
duration_s = max(default_timer() - start, 0)
779+
metrics_list = self.memory_metrics_reader.get_metrics_data()
780+
number_data_point_seen = False
781+
histogram_data_point_seen = False
782+
self.assertTrue(len(metrics_list.resource_metrics) != 0)
783+
for resource_metric in metrics_list.resource_metrics:
784+
self.assertTrue(len(resource_metric.scope_metrics) != 0)
785+
for scope_metric in resource_metric.scope_metrics:
786+
self.assertTrue(len(scope_metric.metrics) != 0)
787+
for metric in scope_metric.metrics:
788+
self.assertIn(metric.name, _expected_metric_names_new)
789+
data_points = list(metric.data.data_points)
790+
self.assertEqual(len(data_points), 1)
791+
for point in data_points:
792+
if isinstance(point, HistogramDataPoint):
793+
self.assertEqual(point.count, 0)
794+
self.assertAlmostEqual(
795+
duration_s, point.sum, places=1
796+
)
797+
self.assertEqual(
798+
point.explicit_bounds,
799+
HTTP_DURATION_HISTOGRAM_BUCKETS_NEW,
800+
)
801+
histogram_data_point_seen = True
802+
if isinstance(point, NumberDataPoint):
803+
number_data_point_seen = True
804+
for attr in point.attributes:
805+
self.assertIn(
806+
attr,
807+
_recommended_metrics_attrs_new[metric.name],
808+
)
809+
self.assertTrue(number_data_point_seen)
810+
self.assertFalse(histogram_data_point_seen)
811+
741812

742813
class TestProgrammaticHooks(InstrumentationTest, WsgiTestBase):
743814
def setUp(self):

0 commit comments

Comments
 (0)