Skip to content

Commit 634df30

Browse files
authored
Merge pull request #348 from solarwinds/cc/NH-119592
NH-119592: conform to otlp metric export spec
2 parents b872df4 + 21d8b2f commit 634df30

File tree

5 files changed

+67
-40
lines changed

5 files changed

+67
-40
lines changed

custom/lambda/src/main/java/com/solarwinds/opentelemetry/extensions/PropertiesSupplier.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ public PropertiesSupplier() {
3535
"otel.java.experimental.span-stacktrace.filter", SPAN_STACKTRACE_FILTER_CLASS);
3636
defaultProperties.put("otel.exporter.otlp.protocol", "grpc");
3737
defaultProperties.put("otel.semconv-stability.opt-in", "database/dup");
38+
defaultProperties.put("otel.exporter.otlp.metrics.temporality.preference", "delta");
39+
defaultProperties.put(
40+
"otel.exporter.otlp.metrics.default.histogram.aggregation",
41+
"base2_exponential_bucket_histogram");
3842
}
3943

4044
@Override

custom/shared/src/main/java/com/solarwinds/opentelemetry/extensions/DelegatingMetricExporter.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@
1919
import com.solarwinds.joboe.config.ConfigManager;
2020
import com.solarwinds.joboe.config.ConfigProperty;
2121
import io.opentelemetry.sdk.common.CompletableResultCode;
22+
import io.opentelemetry.sdk.common.export.MemoryMode;
23+
import io.opentelemetry.sdk.metrics.Aggregation;
2224
import io.opentelemetry.sdk.metrics.InstrumentType;
2325
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
2426
import io.opentelemetry.sdk.metrics.data.MetricData;
27+
import io.opentelemetry.sdk.metrics.export.DefaultAggregationSelector;
2528
import io.opentelemetry.sdk.metrics.export.MetricExporter;
2629
import java.util.Collection;
2730
import java.util.stream.Collectors;
@@ -65,9 +68,26 @@ public CompletableResultCode shutdown() {
6568

6669
@Override
6770
public AggregationTemporality getAggregationTemporality(@NonNull InstrumentType instrumentType) {
68-
if (instrumentType == InstrumentType.HISTOGRAM) {
69-
return AggregationTemporality.DELTA;
70-
}
7171
return delegate.getAggregationTemporality(instrumentType);
7272
}
73+
74+
@Override
75+
public Aggregation getDefaultAggregation(InstrumentType instrumentType) {
76+
return delegate.getDefaultAggregation(instrumentType);
77+
}
78+
79+
@Override
80+
public MemoryMode getMemoryMode() {
81+
return delegate.getMemoryMode();
82+
}
83+
84+
@Override
85+
public void close() {
86+
delegate.close();
87+
}
88+
89+
@Override
90+
public DefaultAggregationSelector with(InstrumentType instrumentType, Aggregation aggregation) {
91+
return delegate.with(instrumentType, aggregation);
92+
}
7393
}

custom/shared/src/main/java/com/solarwinds/opentelemetry/extensions/config/provider/MetricExporterComponentProvider.java

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,9 @@
2424
import io.opentelemetry.exporter.otlp.internal.OtlpDeclarativeConfigUtil;
2525
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporter;
2626
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder;
27-
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
2827
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
2928
import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector;
3029
import io.opentelemetry.sdk.metrics.export.MetricExporter;
31-
import java.util.Locale;
32-
import java.util.function.Consumer;
3330

3431
@SuppressWarnings("rawtypes")
3532
@AutoService(ComponentProvider.class)
@@ -65,32 +62,7 @@ public MetricExporter create(DeclarativeConfigProperties config) {
6562
builder::setMemoryMode,
6663
false);
6764

68-
configureOtlpAggregationTemporality(config, builder::setAggregationTemporalitySelector);
69-
65+
builder.setAggregationTemporalitySelector(AggregationTemporalitySelector.deltaPreferred());
7066
return new DelegatingMetricExporter(builder.build());
7167
}
72-
73-
public static void configureOtlpAggregationTemporality(
74-
DeclarativeConfigProperties config,
75-
Consumer<AggregationTemporalitySelector> aggregationTemporalitySelectorConsumer) {
76-
String temporalityStr = config.getString("temporality_preference");
77-
if (temporalityStr == null) {
78-
return;
79-
}
80-
AggregationTemporalitySelector temporalitySelector;
81-
switch (temporalityStr.toLowerCase(Locale.ROOT)) {
82-
case "cumulative":
83-
temporalitySelector = AggregationTemporalitySelector.alwaysCumulative();
84-
break;
85-
case "delta":
86-
temporalitySelector = AggregationTemporalitySelector.deltaPreferred();
87-
break;
88-
case "lowmemory":
89-
temporalitySelector = AggregationTemporalitySelector.lowMemory();
90-
break;
91-
default:
92-
throw new ConfigurationException("Unrecognized temporality_preference: " + temporalityStr);
93-
}
94-
aggregationTemporalitySelectorConsumer.accept(temporalitySelector);
95-
}
9668
}

custom/shared/src/test/java/com/solarwinds/opentelemetry/extensions/DelegatingMetricExporterTest.java

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@
2626
import com.solarwinds.joboe.config.InvalidConfigException;
2727
import io.opentelemetry.sdk.common.CompletableResultCode;
2828
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
29+
import io.opentelemetry.sdk.common.export.MemoryMode;
30+
import io.opentelemetry.sdk.metrics.Aggregation;
2931
import io.opentelemetry.sdk.metrics.InstrumentType;
30-
import io.opentelemetry.sdk.metrics.data.AggregationTemporality;
3132
import io.opentelemetry.sdk.metrics.data.MetricData;
3233
import io.opentelemetry.sdk.metrics.export.MetricExporter;
3334
import java.util.Arrays;
@@ -56,6 +57,38 @@ class DelegatingMetricExporterTest {
5657

5758
@Captor private ArgumentCaptor<List<MetricData>> metricData;
5859

60+
@Mock private Aggregation aggregationMock;
61+
62+
@Test
63+
void verifyGetDefaultAggregationIsDelegated() {
64+
when(metricExporterMock.getDefaultAggregation(any())).thenReturn(aggregationMock);
65+
66+
assertEquals(aggregationMock, tested.getDefaultAggregation(InstrumentType.COUNTER));
67+
verify(metricExporterMock).getDefaultAggregation(InstrumentType.COUNTER);
68+
}
69+
70+
@Test
71+
void verifyGetMemoryModeIsDelegated() {
72+
when(metricExporterMock.getMemoryMode()).thenReturn(MemoryMode.REUSABLE_DATA);
73+
74+
assertEquals(MemoryMode.REUSABLE_DATA, tested.getMemoryMode());
75+
verify(metricExporterMock).getMemoryMode();
76+
}
77+
78+
@Test
79+
void verifyCloseIsDelegated() {
80+
tested.close();
81+
verify(metricExporterMock).close();
82+
}
83+
84+
@Test
85+
void verifyWithIsDelegated() {
86+
when(metricExporterMock.with(any(), any())).thenReturn(metricExporterMock);
87+
88+
assertEquals(metricExporterMock, tested.with(InstrumentType.COUNTER, aggregationMock));
89+
verify(metricExporterMock).with(InstrumentType.COUNTER, aggregationMock);
90+
}
91+
5992
@Test
6093
void verifyThatAllMetricDataAreExported() {
6194
when(metricExporterMock.export(any())).thenReturn(CompletableResultCode.ofSuccess());
@@ -96,13 +129,7 @@ void verifyShutdownIsDelegated() {
96129
}
97130

98131
@Test
99-
void verifyThatDeltaAggregationTemporalityIsReturnedForHistogram() {
100-
AggregationTemporality actual = tested.getAggregationTemporality(InstrumentType.HISTOGRAM);
101-
assertEquals(AggregationTemporality.DELTA, actual);
102-
}
103-
104-
@Test
105-
void verifyGetAggregationTemporalityForNonHistogramIsDelegated() {
132+
void verifyGetAggregationTemporalityIsDelegated() {
106133
tested.getAggregationTemporality(InstrumentType.COUNTER);
107134
verify(metricExporterMock).getAggregationTemporality(InstrumentType.COUNTER);
108135
}

custom/src/main/java/com/solarwinds/opentelemetry/extensions/SolarwindsPropertiesSupplier.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ public class SolarwindsPropertiesSupplier implements Supplier<Map<String, String
3737
PROPERTIES.put("otel.java.experimental.span-stacktrace.filter", SPAN_STACKTRACE_FILTER_CLASS);
3838
PROPERTIES.put("otel.propagators", String.format("tracecontext,baggage,%s", COMPONENT_NAME));
3939
PROPERTIES.put("otel.semconv-stability.opt-in", "database/dup");
40+
PROPERTIES.put("otel.exporter.otlp.metrics.temporality.preference", "delta");
41+
PROPERTIES.put(
42+
"otel.exporter.otlp.metrics.default.histogram.aggregation",
43+
"base2_exponential_bucket_histogram");
4044
} else {
4145
PROPERTIES.put("otel.sdk.disabled", "true");
4246
}

0 commit comments

Comments
 (0)