Skip to content

Commit 0a8d598

Browse files
loomis-relativityxrmx
authored andcommitted
remove unnecessary buckets on exponential histograms
1 parent 33acdf3 commit 0a8d598

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/metrics_encoder/__init__.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# limitations under the License.
1414
import logging
1515
from os import environ
16-
from typing import Dict, List
16+
from typing import Dict, List, Sequence
1717

1818
from opentelemetry.exporter.otlp.proto.common._internal import (
1919
_encode_attributes,
@@ -43,7 +43,9 @@
4343
)
4444
from opentelemetry.sdk.metrics.export import (
4545
AggregationTemporality,
46+
ExponentialHistogram as ExponentialHistogramType,
4647
Gauge,
48+
Histogram as HistogramType,
4749
MetricExporter,
4850
MetricsData,
4951
Sum,
@@ -167,6 +169,12 @@ def _get_aggregation(
167169

168170
return instrument_class_aggregation
169171

172+
def truncate_trailing_zeros(lst: Sequence[int]) -> Sequence[int]:
173+
if lst:
174+
for i, value in enumerate(reversed(lst)):
175+
if value != 0:
176+
return lst[0:len(lst)-i]
177+
return []
170178

171179
class EncodingException(Exception):
172180
"""
@@ -207,12 +215,17 @@ def encode_metrics(data: MetricsData) -> ExportMetricsServiceRequest:
207215

208216

209217
def _encode_resource_metrics(resource_metrics, resource_metrics_dict):
218+
210219
resource = resource_metrics.resource
220+
211221
# It is safe to assume that each entry in data.resource_metrics is
212222
# associated with an unique resource.
213223
scope_metrics_dict = {}
224+
214225
resource_metrics_dict[resource] = scope_metrics_dict
226+
215227
for scope_metrics in resource_metrics.scope_metrics:
228+
216229
instrumentation_scope = scope_metrics.scope
217230

218231
# The SDK groups metrics in instrumentation scopes already so
@@ -299,18 +312,19 @@ def _encode_metric(metric, pb2_metric):
299312

300313
elif isinstance(metric.data, ExponentialHistogramType):
301314
for data_point in metric.data.data_points:
302-
if data_point.positive.bucket_counts:
315+
316+
if positive_buckets := truncate_trailing_zeros(data_point.positive.bucket_counts):
303317
positive = pb2.ExponentialHistogramDataPoint.Buckets(
304318
offset=data_point.positive.offset,
305-
bucket_counts=data_point.positive.bucket_counts,
319+
bucket_counts=positive_buckets,
306320
)
307321
else:
308322
positive = None
309323

310-
if data_point.negative.bucket_counts:
324+
if negative_buckets := truncate_trailing_zeros(data_point.negative.bucket_counts):
311325
negative = pb2.ExponentialHistogramDataPoint.Buckets(
312326
offset=data_point.negative.offset,
313-
bucket_counts=data_point.negative.bucket_counts,
327+
bucket_counts=negative_buckets,
314328
)
315329
else:
316330
negative = None

exporter/opentelemetry-exporter-otlp-proto-common/tests/test_metrics_encoder.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
from opentelemetry.exporter.otlp.proto.common._internal.metrics_encoder import (
1919
EncodingException,
20+
truncate_trailing_zeros,
2021
)
2122
from opentelemetry.exporter.otlp.proto.common.metrics_encoder import (
2223
encode_metrics,
@@ -854,6 +855,13 @@ def test_encode_multiple_scope_histogram(self):
854855
actual = encode_metrics(metrics_data)
855856
self.assertEqual(expected, actual)
856857

858+
def test_truncate_trailing_zeros(self):
859+
self.assertEqual([], truncate_trailing_zeros([]))
860+
self.assertEqual([], truncate_trailing_zeros([0]))
861+
self.assertEqual([0, 1], truncate_trailing_zeros([0, 1]))
862+
self.assertEqual([0, 1], truncate_trailing_zeros([0, 1, 0]))
863+
self.assertEqual([1, -1], truncate_trailing_zeros([1, -1, 0, 0]))
864+
857865
def test_encode_exponential_histogram(self):
858866
exponential_histogram = Metric(
859867
name="exponential_histogram",
@@ -869,8 +877,8 @@ def test_encode_exponential_histogram(self):
869877
sum=3,
870878
scale=4,
871879
zero_count=5,
872-
positive=Buckets(offset=6, bucket_counts=[7, 8]),
873-
negative=Buckets(offset=9, bucket_counts=[10, 11]),
880+
positive=Buckets(offset=6, bucket_counts=[7, 8, 0]),
881+
negative=Buckets(offset=9, bucket_counts=[10, 11, 0, 0]),
874882
flags=12,
875883
min=13.0,
876884
max=14.0,

0 commit comments

Comments
 (0)