Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#4494](https://github.com/open-telemetry/opentelemetry-python/pull/4494))
- Improve CI by cancelling stale runs and setting timeouts
([#4498](https://github.com/open-telemetry/opentelemetry-python/pull/4498))
- Fix ExplicitBucketHistogramAggregation to handle multiple explicit bucket boundaries advisories ([#4521](https://github.com/open-telemetry/opentelemetry-python/pull/4521))

## Version 1.31.0/0.52b0 (2025-03-12)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1387,18 +1387,17 @@ def _create_aggregation(
AggregationTemporality.CUMULATIVE
)

if self._boundaries is None:
self._boundaries = (
instrument._advisory.explicit_bucket_boundaries
or _DEFAULT_EXPLICIT_BUCKET_HISTOGRAM_AGGREGATION_BOUNDARIES
)
if self._boundaries:
boundaries = self._boundaries
else:
boundaries = instrument._advisory.explicit_bucket_boundaries

return _ExplicitBucketHistogramAggregation(
attributes,
instrument_aggregation_temporality,
start_time_unix_nano,
reservoir_factory(_ExplicitBucketHistogramAggregation),
self._boundaries,
boundaries,
self._record_min_max,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,3 +164,47 @@ def test_explicit_aggregation(self):
self.assertEqual(
metric.data.data_points[0].explicit_bounds, (1.0, 2.0, 3.0)
)

def test_explicit_aggregation_multiple_histograms(self):
reader = InMemoryMetricReader(
preferred_aggregation={
Histogram: ExplicitBucketHistogramAggregation()
}
)
meter_provider = MeterProvider(
metric_readers=[reader],
)
meter = meter_provider.get_meter("testmeter")

histogram1 = meter.create_histogram(
"testhistogram1",
explicit_bucket_boundaries_advisory=[1.0, 2.0, 3.0],
)
histogram1.record(1, {"label": "value"})
histogram1.record(2, {"label": "value"})
histogram1.record(3, {"label": "value"})

histogram2 = meter.create_histogram(
"testhistogram2",
explicit_bucket_boundaries_advisory=[4.0, 5.0, 6.0],
)
histogram2.record(4, {"label": "value"})
histogram2.record(5, {"label": "value"})
histogram2.record(6, {"label": "value"})

metrics = reader.get_metrics_data()
self.assertEqual(len(metrics.resource_metrics), 1)
self.assertEqual(len(metrics.resource_metrics[0].scope_metrics), 1)
self.assertEqual(
len(metrics.resource_metrics[0].scope_metrics[0].metrics), 2
)
metric1 = metrics.resource_metrics[0].scope_metrics[0].metrics[0]
self.assertEqual(metric1.name, "testhistogram1")
self.assertEqual(
metric1.data.data_points[0].explicit_bounds, (1.0, 2.0, 3.0)
)
metric2 = metrics.resource_metrics[0].scope_metrics[0].metrics[1]
self.assertEqual(metric2.name, "testhistogram2")
self.assertEqual(
metric2.data.data_points[0].explicit_bounds, (4.0, 5.0, 6.0)
)