Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .changelog/5895.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`opentelemetry-sdk`: add empty explicit bucket boundaries advisory to duration histograms
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
OtelComponentTypeValues,
)
from opentelemetry.semconv._incubating.metrics.otel_metrics import (
OTEL_SDK_EXPORTER_OPERATION_DURATION,
create_otel_sdk_exporter_log_exported,
create_otel_sdk_exporter_log_inflight,
create_otel_sdk_exporter_metric_data_point_exported,
create_otel_sdk_exporter_metric_data_point_inflight,
create_otel_sdk_exporter_operation_duration,
create_otel_sdk_exporter_span_exported,
create_otel_sdk_exporter_span_inflight,
)
Expand Down Expand Up @@ -110,7 +110,12 @@ def __init__(
meter = meter_provider.get_meter("opentelemetry-sdk")
self._inflight = create_inflight(meter)
self._exported = create_exported(meter)
self._duration = create_otel_sdk_exporter_operation_duration(meter)
self._duration = meter.create_histogram(
name=OTEL_SDK_EXPORTER_OPERATION_DURATION,
description="The duration of exporting a batch of telemetry records.",
unit="s",
explicit_bucket_boundaries_advisory=[],
)

@contextmanager
def export_operation(self, num_items: int) -> Iterator[ExportResult]:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ def test_factory_returns_exporter_metrics_when_enabled(self):

self.assertIsInstance(metrics, ExporterMetrics)
meter_provider.get_meter.assert_called_once_with("opentelemetry-sdk")
meter = meter_provider.get_meter.return_value
meter.create_histogram.assert_called_once_with(
name="otel.sdk.exporter.operation.duration",
description="The duration of exporting a batch of telemetry records.",
unit="s",
explicit_bucket_boundaries_advisory=[],
)

def test_noop_export_operation_yields_result(self):
metrics = NoOpExporterMetrics()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -683,6 +683,7 @@ def test_retry_timeout_records_metrics(self):
metrics = sorted(scope_metrics.metrics, key=lambda m: m.name)
self.assertEqual(len(metrics), 3)
self.assertEqual(metrics[0].name, "otel.sdk.exporter.operation.duration")
self.assertEqual(metrics[0].data.data_points[0].explicit_bounds, ())
self.assert_standard_metric_attrs(metrics[0].data.data_points[0].attributes)
self.assertEqual(
metrics[0].data.data_points[0].attributes["http.response.status_code"],
Expand Down Expand Up @@ -716,6 +717,7 @@ def test_export_connection_error_records_metrics(self):
scope_metrics = metrics_data.resource_metrics[0].scope_metrics[0]
metrics = sorted(scope_metrics.metrics, key=lambda m: m.name)
self.assertEqual(metrics[0].name, "otel.sdk.exporter.operation.duration")
self.assertEqual(metrics[0].data.data_points[0].explicit_bounds, ())
self.assertIn("error.type", metrics[0].data.data_points[0].attributes)
self.assertNotIn(
"http.response.status_code",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
OTEL_COMPONENT_TYPE,
)
from opentelemetry.semconv._incubating.metrics.otel_metrics import (
create_otel_sdk_metric_reader_collection_duration,
OTEL_SDK_METRIC_READER_COLLECTION_DURATION,
)

_component_counter = Counter()
Expand All @@ -37,7 +37,12 @@ def __init__(self, component_type: str, meter_provider: MeterProvider) -> None:
OTEL_COMPONENT_NAME: f"{component_type}/{count}",
}

self._collection_duration = create_otel_sdk_metric_reader_collection_duration(meter)
self._collection_duration = meter.create_histogram(
name=OTEL_SDK_METRIC_READER_COLLECTION_DURATION,
description="The duration of the collect operation of the metric reader.",
unit="s",
explicit_bucket_boundaries_advisory=[],
)

def record_collection(self, duration: float) -> None:
self._collection_duration.record(duration, self._standard_attrs)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from time import sleep
from unittest import TestCase
from unittest.mock import Mock
from unittest.mock import Mock, patch

from opentelemetry.metrics import Observation
from opentelemetry.sdk.metrics import Counter, MeterProvider
Expand Down Expand Up @@ -166,6 +166,21 @@ def test_synchronous_gauge_cumulative_multiple_collect(self):
[({"key": "value"}, 5)],
)

@patch.dict("os.environ", {"OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED": "true"})
def test_metric_reader_metrics(self):
reader = InMemoryMetricReader()
meter_provider = Mock()
meter = Mock()
meter_provider.get_meter.return_value = meter
reader._set_meter_provider(meter_provider)
meter_provider.get_meter.assert_called_once_with("opentelemetry-sdk")
meter.create_histogram.assert_called_once_with(
name="otel.sdk.metric_reader.collection.duration",
description="The duration of the collect operation of the metric reader.",
unit="s",
explicit_bucket_boundaries_advisory=[],
)


class TestInMemoryMetricReaderCardinalityLimits(TestCase):
def test_default_limit(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,7 @@ def test_metric_reader_metrics(self):
point = metric.data.data_points[0]
histogram = cast(HistogramDataPoint, point)
self.assertEqual(histogram.count, 1)
self.assertEqual(histogram.explicit_bounds, ())
attrs = histogram.attributes
assert attrs is not None
self.assertEqual(attrs["otel.component.type"], "periodic_metric_reader")
Expand Down