Skip to content

Commit 77e1046

Browse files
committed
opentelemetry-instrumentation-flask: add explicit http duration buckets for stable semconv
1 parent 38f7413 commit 77e1046

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1515

1616
- `opentelemetry-instrumentation-fastapi`: fix wrapping of middlewares
1717
([#3012](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3012))
18+
- `opentelemetry-instrumentation-flask`: proper bucket boundaries in stable semconv http duration
19+
([#3522](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3522))
1820

1921
### Breaking changes
2022

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ def response_hook(span: Span, status: str, response_headers: List):
257257
import opentelemetry.instrumentation.wsgi as otel_wsgi
258258
from opentelemetry import context, trace
259259
from opentelemetry.instrumentation._semconv import (
260+
HTTP_DURATION_HISTOGRAM_BUCKETS_NEW,
260261
_get_schema_url,
261262
_OpenTelemetrySemanticConventionStability,
262263
_OpenTelemetryStabilitySignalType,
@@ -583,6 +584,7 @@ def __init__(self, *args, **kwargs):
583584
name=HTTP_SERVER_REQUEST_DURATION,
584585
unit="s",
585586
description="Duration of HTTP server requests.",
587+
explicit_bucket_boundaries_advisory=HTTP_DURATION_HISTOGRAM_BUCKETS_NEW,
586588
)
587589
active_requests_counter = meter.create_up_down_counter(
588590
name=MetricInstruments.HTTP_SERVER_ACTIVE_REQUESTS,
@@ -716,6 +718,7 @@ def instrument_app(
716718
name=HTTP_SERVER_REQUEST_DURATION,
717719
unit="s",
718720
description="Duration of HTTP server requests.",
721+
explicit_bucket_boundaries_advisory=HTTP_DURATION_HISTOGRAM_BUCKETS_NEW,
719722
)
720723
active_requests_counter = meter.create_up_down_counter(
721724
name=MetricInstruments.HTTP_SERVER_ACTIVE_REQUESTS,

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
from opentelemetry import trace
2222
from opentelemetry.instrumentation._semconv import (
23+
HTTP_DURATION_HISTOGRAM_BUCKETS_NEW,
2324
OTEL_SEMCONV_STABILITY_OPT_IN,
2425
_OpenTelemetrySemanticConventionStability,
2526
_server_active_requests_count_attrs_new,
@@ -522,6 +523,10 @@ def test_flask_metrics_new_semconv(self):
522523
self.assertAlmostEqual(
523524
duration_s, point.sum, places=1
524525
)
526+
self.assertEqual(
527+
point.explicit_bounds,
528+
HTTP_DURATION_HISTOGRAM_BUCKETS_NEW,
529+
)
525530
histogram_data_point_seen = True
526531
if isinstance(point, NumberDataPoint):
527532
number_data_point_seen = True
@@ -552,7 +557,10 @@ def test_flask_metric_values(self):
552557
self.assertEqual(point.value, 0)
553558

554559
def _assert_basic_metric(
555-
self, expected_duration_attributes, expected_requests_count_attributes
560+
self,
561+
expected_duration_attributes,
562+
expected_requests_count_attributes,
563+
expected_histogram_explicit_bounds=None,
556564
):
557565
metrics_list = self.memory_metrics_reader.get_metrics_data()
558566
for resource_metric in metrics_list.resource_metrics:
@@ -564,6 +572,11 @@ def _assert_basic_metric(
564572
expected_duration_attributes,
565573
dict(point.attributes),
566574
)
575+
if expected_histogram_explicit_bounds is not None:
576+
self.assertEqual(
577+
expected_histogram_explicit_bounds,
578+
point.explicit_bounds,
579+
)
567580
self.assertEqual(point.count, 1)
568581
elif isinstance(point, NumberDataPoint):
569582
self.assertDictEqual(
@@ -613,6 +626,7 @@ def test_basic_metric_success_new_semconv(self):
613626
self._assert_basic_metric(
614627
expected_duration_attributes,
615628
expected_requests_count_attributes,
629+
expected_histogram_explicit_bounds=HTTP_DURATION_HISTOGRAM_BUCKETS_NEW,
616630
)
617631

618632
def test_basic_metric_nonstandard_http_method_success(self):
@@ -654,6 +668,7 @@ def test_basic_metric_nonstandard_http_method_success_new_semconv(self):
654668
self._assert_basic_metric(
655669
expected_duration_attributes,
656670
expected_requests_count_attributes,
671+
expected_histogram_explicit_bounds=HTTP_DURATION_HISTOGRAM_BUCKETS_NEW,
657672
)
658673

659674
@patch.dict(
@@ -679,6 +694,7 @@ def test_basic_metric_nonstandard_http_method_allowed_success_new_semconv(
679694
self._assert_basic_metric(
680695
expected_duration_attributes,
681696
expected_requests_count_attributes,
697+
expected_histogram_explicit_bounds=HTTP_DURATION_HISTOGRAM_BUCKETS_NEW,
682698
)
683699

684700
def test_metric_uninstrument(self):

0 commit comments

Comments
 (0)