Skip to content

Commit 6547279

Browse files
authored
Fix OTLP metric exporter toBuilder() loosing temporality (#7280)
1 parent f17b8b0 commit 6547279

File tree

6 files changed

+125
-18
lines changed

6 files changed

+125
-18
lines changed

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporter.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ public final class OtlpHttpMetricExporter implements MetricExporter {
3232

3333
private final HttpExporterBuilder<Marshaler> builder;
3434
private final HttpExporter<Marshaler> delegate;
35-
private final AggregationTemporalitySelector aggregationTemporalitySelector;
36-
private final DefaultAggregationSelector defaultAggregationSelector;
35+
// Visible for testing
36+
final AggregationTemporalitySelector aggregationTemporalitySelector;
37+
// Visible for testing
38+
final DefaultAggregationSelector defaultAggregationSelector;
3739
private final MetricReusableDataMarshaler marshaler;
3840

3941
OtlpHttpMetricExporter(
@@ -78,7 +80,11 @@ public static OtlpHttpMetricExporterBuilder builder() {
7880
* @since 1.29.0
7981
*/
8082
public OtlpHttpMetricExporterBuilder toBuilder() {
81-
return new OtlpHttpMetricExporterBuilder(builder.copy(), marshaler.getMemoryMode());
83+
return new OtlpHttpMetricExporterBuilder(
84+
builder.copy(),
85+
aggregationTemporalitySelector,
86+
defaultAggregationSelector,
87+
marshaler.getMemoryMode());
8288
}
8389

8490
@Override

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilder.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,30 @@ public final class OtlpHttpMetricExporterBuilder {
4747
private static final MemoryMode DEFAULT_MEMORY_MODE = MemoryMode.REUSABLE_DATA;
4848

4949
private final HttpExporterBuilder<Marshaler> delegate;
50-
private AggregationTemporalitySelector aggregationTemporalitySelector =
51-
DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR;
5250

53-
private DefaultAggregationSelector defaultAggregationSelector =
54-
DefaultAggregationSelector.getDefault();
51+
private AggregationTemporalitySelector aggregationTemporalitySelector;
52+
private DefaultAggregationSelector defaultAggregationSelector;
5553
private MemoryMode memoryMode;
5654

57-
OtlpHttpMetricExporterBuilder(HttpExporterBuilder<Marshaler> delegate, MemoryMode memoryMode) {
55+
OtlpHttpMetricExporterBuilder(
56+
HttpExporterBuilder<Marshaler> delegate,
57+
AggregationTemporalitySelector aggregationTemporalitySelector,
58+
DefaultAggregationSelector defaultAggregationSelector,
59+
MemoryMode memoryMode) {
5860
this.delegate = delegate;
61+
this.aggregationTemporalitySelector = aggregationTemporalitySelector;
62+
this.defaultAggregationSelector = defaultAggregationSelector;
5963
this.memoryMode = memoryMode;
6064
delegate.setMeterProvider(MeterProvider::noop);
6165
OtlpUserAgent.addUserAgentHeader(delegate::addConstantHeaders);
6266
}
6367

6468
OtlpHttpMetricExporterBuilder() {
65-
this(new HttpExporterBuilder<>("otlp", "metric", DEFAULT_ENDPOINT), DEFAULT_MEMORY_MODE);
69+
this(
70+
new HttpExporterBuilder<>("otlp", "metric", DEFAULT_ENDPOINT),
71+
DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR,
72+
DefaultAggregationSelector.getDefault(),
73+
DEFAULT_MEMORY_MODE);
6674
}
6775

6876
/**

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporter.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ public final class OtlpGrpcMetricExporter implements MetricExporter {
3232

3333
private final GrpcExporterBuilder<Marshaler> builder;
3434
private final GrpcExporter<Marshaler> delegate;
35-
private final AggregationTemporalitySelector aggregationTemporalitySelector;
36-
private final DefaultAggregationSelector defaultAggregationSelector;
35+
// Visible for testing
36+
final AggregationTemporalitySelector aggregationTemporalitySelector;
37+
// Visible for testing
38+
final DefaultAggregationSelector defaultAggregationSelector;
3739
private final MetricReusableDataMarshaler marshaler;
3840

3941
/**
@@ -78,7 +80,11 @@ public static OtlpGrpcMetricExporterBuilder builder() {
7880
* @since 1.29.0
7981
*/
8082
public OtlpGrpcMetricExporterBuilder toBuilder() {
81-
return new OtlpGrpcMetricExporterBuilder(builder.copy(), marshaler.getMemoryMode());
83+
return new OtlpGrpcMetricExporterBuilder(
84+
builder.copy(),
85+
aggregationTemporalitySelector,
86+
defaultAggregationSelector,
87+
marshaler.getMemoryMode());
8288
}
8389

8490
@Override

exporters/otlp/all/src/main/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilder.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,18 @@ public final class OtlpGrpcMetricExporterBuilder {
5656
// Visible for testing
5757
final GrpcExporterBuilder<Marshaler> delegate;
5858

59-
private AggregationTemporalitySelector aggregationTemporalitySelector =
60-
DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR;
61-
62-
private DefaultAggregationSelector defaultAggregationSelector =
63-
DefaultAggregationSelector.getDefault();
59+
private AggregationTemporalitySelector aggregationTemporalitySelector;
60+
private DefaultAggregationSelector defaultAggregationSelector;
6461
private MemoryMode memoryMode;
6562

66-
OtlpGrpcMetricExporterBuilder(GrpcExporterBuilder<Marshaler> delegate, MemoryMode memoryMode) {
63+
OtlpGrpcMetricExporterBuilder(
64+
GrpcExporterBuilder<Marshaler> delegate,
65+
AggregationTemporalitySelector aggregationTemporalitySelector,
66+
DefaultAggregationSelector defaultAggregationSelector,
67+
MemoryMode memoryMode) {
6768
this.delegate = delegate;
69+
this.aggregationTemporalitySelector = aggregationTemporalitySelector;
70+
this.defaultAggregationSelector = defaultAggregationSelector;
6871
this.memoryMode = memoryMode;
6972
delegate.setMeterProvider(MeterProvider::noop);
7073
OtlpUserAgent.addUserAgentHeader(delegate::addConstantHeader);
@@ -79,6 +82,8 @@ public final class OtlpGrpcMetricExporterBuilder {
7982
DEFAULT_ENDPOINT,
8083
() -> MarshalerMetricsServiceGrpc::newFutureStub,
8184
GRPC_ENDPOINT_PATH),
85+
DEFAULT_AGGREGATION_TEMPORALITY_SELECTOR,
86+
DefaultAggregationSelector.getDefault(),
8287
DEFAULT_MEMORY_MODE);
8388
}
8489

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.exporter.otlp.http.metrics;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import io.opentelemetry.sdk.common.export.MemoryMode;
11+
import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector;
12+
import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector;
13+
import org.junit.jupiter.api.Test;
14+
import org.mockito.Mockito;
15+
16+
class OtlpHttpMetricExporterBuilderTest {
17+
18+
@Test
19+
void verifyToBuilderPreservesSettings() {
20+
AggregationTemporalitySelector temporalitySelector =
21+
Mockito.mock(AggregationTemporalitySelector.class);
22+
DefaultAggregationSelector defaultAggregationSelector =
23+
Mockito.mock(DefaultAggregationSelector.class);
24+
25+
OtlpHttpMetricExporter original =
26+
OtlpHttpMetricExporter.builder()
27+
.setMemoryMode(MemoryMode.IMMUTABLE_DATA)
28+
.setAggregationTemporalitySelector(temporalitySelector)
29+
.setDefaultAggregationSelector(defaultAggregationSelector)
30+
.build();
31+
32+
OtlpHttpMetricExporter copy = original.toBuilder().build();
33+
34+
assertThat(copy.getMemoryMode()).isEqualTo(MemoryMode.IMMUTABLE_DATA);
35+
assertThat(copy.aggregationTemporalitySelector).isSameAs(temporalitySelector);
36+
assertThat(copy.defaultAggregationSelector).isSameAs(defaultAggregationSelector);
37+
38+
original.close();
39+
copy.close();
40+
}
41+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.exporter.otlp.metrics;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import io.opentelemetry.sdk.common.export.MemoryMode;
11+
import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector;
12+
import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector;
13+
import org.junit.jupiter.api.Test;
14+
import org.mockito.Mockito;
15+
16+
class OtlpGrpcMetricExporterBuilderTest {
17+
18+
@Test
19+
void verifyToBuilderPreservesSettings() {
20+
AggregationTemporalitySelector temporalitySelector =
21+
Mockito.mock(AggregationTemporalitySelector.class);
22+
DefaultAggregationSelector defaultAggregationSelector =
23+
Mockito.mock(DefaultAggregationSelector.class);
24+
25+
OtlpGrpcMetricExporter original =
26+
OtlpGrpcMetricExporter.builder()
27+
.setMemoryMode(MemoryMode.IMMUTABLE_DATA)
28+
.setAggregationTemporalitySelector(temporalitySelector)
29+
.setDefaultAggregationSelector(defaultAggregationSelector)
30+
.build();
31+
32+
OtlpGrpcMetricExporter copy = original.toBuilder().build();
33+
34+
assertThat(copy.getMemoryMode()).isEqualTo(MemoryMode.IMMUTABLE_DATA);
35+
assertThat(copy.aggregationTemporalitySelector).isSameAs(temporalitySelector);
36+
assertThat(copy.defaultAggregationSelector).isSameAs(defaultAggregationSelector);
37+
38+
original.close();
39+
copy.close();
40+
}
41+
}

0 commit comments

Comments
 (0)