From 4884813407294e09a52768dacf105598d0e062b2 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sat, 31 Oct 2026 13:25:15 -0700 Subject: [PATCH 1/3] Support temporality selectors in InMemoryMetricExporter Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../opentelemetry-sdk-testing.txt | 4 +- .../exporter/InMemoryMetricExporter.java | 29 ++++- .../exporter/InMemoryMetricExporterTest.java | 121 +++++++++++++++++- 3 files changed, 143 insertions(+), 11 deletions(-) diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt index 69afb1c943a..f8af477b125 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt @@ -1,2 +1,4 @@ Comparing source compatibility of opentelemetry-sdk-testing-1.68.0-SNAPSHOT.jar against opentelemetry-sdk-testing-1.67.0.jar -No changes. \ No newline at end of file +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter create(io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector) diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java index f7bd8afc2ed..b3878f1d3fa 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java @@ -9,11 +9,13 @@ import io.opentelemetry.sdk.metrics.InstrumentType; import io.opentelemetry.sdk.metrics.data.AggregationTemporality; import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; import io.opentelemetry.sdk.metrics.export.MetricExporter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -47,11 +49,11 @@ */ public final class InMemoryMetricExporter implements MetricExporter { private final Queue finishedMetricItems = new ConcurrentLinkedQueue<>(); - private final AggregationTemporality aggregationTemporality; + private final AggregationTemporalitySelector aggregationTemporalitySelector; private boolean isStopped = false; - private InMemoryMetricExporter(AggregationTemporality aggregationTemporality) { - this.aggregationTemporality = aggregationTemporality; + private InMemoryMetricExporter(AggregationTemporalitySelector aggregationTemporalitySelector) { + this.aggregationTemporalitySelector = aggregationTemporalitySelector; } /** @@ -64,7 +66,24 @@ public static InMemoryMetricExporter create() { /** Returns a new {@link InMemoryMetricExporter} with the given {@code aggregationTemporality}. */ public static InMemoryMetricExporter create(AggregationTemporality aggregationTemporality) { - return new InMemoryMetricExporter(aggregationTemporality); + return create(unused -> aggregationTemporality); + } + + /** + * Returns a new {@link InMemoryMetricExporter} with the given {@link + * AggregationTemporalitySelector}. + * + *

For example, {@code + * InMemoryMetricExporter.create(AggregationTemporalitySelector.deltaPreferred())} uses delta + * temporality for counters and histograms, and cumulative temporality for up-down counters. + * + * @param aggregationTemporalitySelector selects the aggregation temporality for each instrument + * type + */ + public static InMemoryMetricExporter create( + AggregationTemporalitySelector aggregationTemporalitySelector) { + Objects.requireNonNull(aggregationTemporalitySelector, "aggregationTemporalitySelector"); + return new InMemoryMetricExporter(aggregationTemporalitySelector); } /** @@ -87,7 +106,7 @@ public void reset() { @Override public AggregationTemporality getAggregationTemporality(InstrumentType instrumentType) { - return aggregationTemporality; + return aggregationTemporalitySelector.getAggregationTemporality(instrumentType); } /** diff --git a/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java b/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java index deb30859fb1..6fa1843045a 100644 --- a/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java +++ b/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java @@ -5,22 +5,35 @@ package io.opentelemetry.sdk.testing.exporter; -import static org.assertj.core.api.Assertions.assertThat; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.metrics.DoubleHistogram; +import io.opentelemetry.api.metrics.LongCounter; +import io.opentelemetry.api.metrics.LongUpDownCounter; +import io.opentelemetry.api.metrics.Meter; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.metrics.InstrumentType; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.metrics.data.AggregationTemporality; import io.opentelemetry.sdk.metrics.data.MetricData; +import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; +import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; import io.opentelemetry.sdk.metrics.internal.data.ImmutableLongPointData; import io.opentelemetry.sdk.metrics.internal.data.ImmutableMetricData; import io.opentelemetry.sdk.metrics.internal.data.ImmutableSumData; import io.opentelemetry.sdk.resources.Resource; +import io.opentelemetry.sdk.testing.time.TestClock; +import java.time.Duration; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; /** Unit tests for {@link InMemoryMetricExporter}. */ class InMemoryMetricExporterTest { @@ -44,14 +57,112 @@ private static MetricData generateFakeMetric() { startNs, endNs, Attributes.builder().put("k", "v").build(), 5)))); } - @Test - void getAggregationTemporality() { - assertThat(InMemoryMetricExporter.create().getAggregationTemporality(InstrumentType.COUNTER)) + @ParameterizedTest + @EnumSource(InstrumentType.class) + void getAggregationTemporality(InstrumentType instrumentType) { + assertThat(InMemoryMetricExporter.create().getAggregationTemporality(instrumentType)) .isEqualTo(AggregationTemporality.CUMULATIVE); assertThat( InMemoryMetricExporter.create(AggregationTemporality.DELTA) - .getAggregationTemporality(InstrumentType.COUNTER)) + .getAggregationTemporality(instrumentType)) .isEqualTo(AggregationTemporality.DELTA); + assertThat( + InMemoryMetricExporter.create(AggregationTemporality.CUMULATIVE) + .getAggregationTemporality(instrumentType)) + .isEqualTo(AggregationTemporality.CUMULATIVE); + } + + @ParameterizedTest + @EnumSource(InstrumentType.class) + void getAggregationTemporality_deltaPreferred(InstrumentType instrumentType) { + assertThat( + InMemoryMetricExporter.create(AggregationTemporalitySelector.deltaPreferred()) + .getAggregationTemporality(instrumentType)) + .isEqualTo( + instrumentType == InstrumentType.UP_DOWN_COUNTER + || instrumentType == InstrumentType.OBSERVABLE_UP_DOWN_COUNTER + ? AggregationTemporality.CUMULATIVE + : AggregationTemporality.DELTA); + } + + @Test + void create_nullSelector() { + assertThatThrownBy(() -> InMemoryMetricExporter.create((AggregationTemporalitySelector) null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("aggregationTemporalitySelector"); + } + + @Test + void export_deltaPreferred() { + InMemoryMetricExporter deltaExporter = + InMemoryMetricExporter.create(AggregationTemporalitySelector.deltaPreferred()); + TestClock clock = TestClock.create(); + PeriodicMetricReader reader = + PeriodicMetricReader.builder(deltaExporter).setInterval(Duration.ofDays(1)).build(); + try (SdkMeterProvider meterProvider = + SdkMeterProvider.builder().setClock(clock).registerMetricReader(reader).build()) { + Meter meter = meterProvider.get("test"); + LongCounter counter = meter.counterBuilder("counter").build(); + DoubleHistogram histogram = meter.histogramBuilder("histogram").build(); + LongUpDownCounter upDownCounter = meter.upDownCounterBuilder("upDownCounter").build(); + AtomicLong observedUpDownCounter = new AtomicLong(); + meter + .upDownCounterBuilder("observableUpDownCounter") + .buildWithCallback(measurement -> measurement.record(observedUpDownCounter.get())); + + for (int value : new int[] {1, 2, 3}) { + counter.add(value); + histogram.record(value); + upDownCounter.add(value == 3 ? -1 : 1); + observedUpDownCounter.set(value == 3 ? 0 : 1); + clock.advance(Duration.ofSeconds(1)); + + assertThat(reader.forceFlush().join(10, TimeUnit.SECONDS).isSuccess()).isTrue(); + assertThat(deltaExporter.getFinishedMetricItems()) + .filteredOn(metric -> metric.getInstrumentationScopeInfo().getName().equals("test")) + .satisfiesExactlyInAnyOrder( + metric -> + assertThat(metric) + .hasName("counter") + .hasLongSumSatisfying( + sum -> + sum.isDelta().hasPointsSatisfying(point -> point.hasValue(value))), + metric -> + assertThat(metric) + .hasName("histogram") + .hasHistogramSatisfying( + data -> + data.isDelta() + .hasPointsSatisfying(point -> point.hasCount(1).hasSum(value))), + metric -> + assertThat(metric) + .hasName("upDownCounter") + .hasLongSumSatisfying( + sum -> + sum.isCumulative() + .hasPointsSatisfying( + point -> point.hasValue(value == 2 ? 2 : 1))), + metric -> + assertThat(metric) + .hasName("observableUpDownCounter") + .hasLongSumSatisfying( + sum -> + sum.isCumulative() + .hasPointsSatisfying( + point -> point.hasValue(value == 3 ? 0 : 1)))); + deltaExporter.reset(); + } + } + } + + @Test + void export_preservesMetricData() { + InMemoryMetricExporter deltaExporter = + InMemoryMetricExporter.create(AggregationTemporalitySelector.deltaPreferred()); + MetricData metric = generateFakeMetric(); + + assertThat(deltaExporter.export(Collections.singletonList(metric)).isSuccess()).isTrue(); + assertThat(deltaExporter.getFinishedMetricItems()).singleElement().isSameAs(metric); } @Test From 5c9494279500f3f38f423807167ff6b0fdaed2d2 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Tue, 3 Nov 2026 15:25:01 -0800 Subject: [PATCH 2/3] Add builder for InMemoryMetricExporter Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../opentelemetry-sdk-testing.txt | 7 +++- .../exporter/InMemoryMetricExporter.java | 39 +++++++------------ .../InMemoryMetricExporterBuilder.java | 39 +++++++++++++++++++ .../exporter/InMemoryMetricExporterTest.java | 34 +++++++++++++--- 4 files changed, 89 insertions(+), 30 deletions(-) create mode 100644 sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterBuilder.java diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt index f8af477b125..024573c446c 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt @@ -1,4 +1,9 @@ Comparing source compatibility of opentelemetry-sdk-testing-1.68.0-SNAPSHOT.jar against opentelemetry-sdk-testing-1.67.0.jar *** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter (not serializable) === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 - +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter create(io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector) + +++ NEW METHOD: PUBLIC(+) STATIC(+) io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporterBuilder builder() ++++ NEW CLASS: PUBLIC(+) FINAL(+) io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporterBuilder (not serializable) + +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. + +++ NEW SUPERCLASS: java.lang.Object + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter build() + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporterBuilder setAggregationTemporalitySelector(io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector) diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java index b3878f1d3fa..38b2c1e2fa6 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporter.java @@ -15,14 +15,13 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Objects; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; /** * A {@link MetricExporter} implementation that can be used to test OpenTelemetry integration. * - *

Can be created using {@code InMemoryMetricExporter.create()} + *

Can be created using {@link #create()} or configured using {@link #builder()}. * *

Example usage: * @@ -52,38 +51,30 @@ public final class InMemoryMetricExporter implements MetricExporter { private final AggregationTemporalitySelector aggregationTemporalitySelector; private boolean isStopped = false; - private InMemoryMetricExporter(AggregationTemporalitySelector aggregationTemporalitySelector) { + InMemoryMetricExporter(AggregationTemporalitySelector aggregationTemporalitySelector) { this.aggregationTemporalitySelector = aggregationTemporalitySelector; } /** - * Returns a new {@link InMemoryMetricExporter} with a aggregation temporality of {@link - * AggregationTemporality#CUMULATIVE}. + * Creates an {@link InMemoryMetricExporterBuilder} with defaults. + * + * @return a builder with always-cumulative {@link AggregationTemporalitySelector} + */ + public static InMemoryMetricExporterBuilder builder() { + return new InMemoryMetricExporterBuilder(); + } + + /** + * Returns a new {@link InMemoryMetricExporter} with cumulative aggregation temporality for all + * instrument types. */ public static InMemoryMetricExporter create() { - return create(AggregationTemporality.CUMULATIVE); + return builder().build(); } /** Returns a new {@link InMemoryMetricExporter} with the given {@code aggregationTemporality}. */ public static InMemoryMetricExporter create(AggregationTemporality aggregationTemporality) { - return create(unused -> aggregationTemporality); - } - - /** - * Returns a new {@link InMemoryMetricExporter} with the given {@link - * AggregationTemporalitySelector}. - * - *

For example, {@code - * InMemoryMetricExporter.create(AggregationTemporalitySelector.deltaPreferred())} uses delta - * temporality for counters and histograms, and cumulative temporality for up-down counters. - * - * @param aggregationTemporalitySelector selects the aggregation temporality for each instrument - * type - */ - public static InMemoryMetricExporter create( - AggregationTemporalitySelector aggregationTemporalitySelector) { - Objects.requireNonNull(aggregationTemporalitySelector, "aggregationTemporalitySelector"); - return new InMemoryMetricExporter(aggregationTemporalitySelector); + return builder().setAggregationTemporalitySelector(unused -> aggregationTemporality).build(); } /** diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterBuilder.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterBuilder.java new file mode 100644 index 00000000000..b0e1ed912e7 --- /dev/null +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterBuilder.java @@ -0,0 +1,39 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.testing.exporter; + +import io.opentelemetry.sdk.metrics.InstrumentType; +import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; +import java.util.Objects; + +/** Builder for {@link InMemoryMetricExporter}. */ +public final class InMemoryMetricExporterBuilder { + private AggregationTemporalitySelector aggregationTemporalitySelector = + AggregationTemporalitySelector.alwaysCumulative(); + + InMemoryMetricExporterBuilder() {} + + /** + * Sets the {@link AggregationTemporalitySelector} used by {@link + * InMemoryMetricExporter#getAggregationTemporality(InstrumentType)}. + * + *

The default is {@link AggregationTemporalitySelector#alwaysCumulative()}. + * + * @param aggregationTemporalitySelector the {@link AggregationTemporalitySelector} to set + * @return this {@link InMemoryMetricExporterBuilder} + */ + public InMemoryMetricExporterBuilder setAggregationTemporalitySelector( + AggregationTemporalitySelector aggregationTemporalitySelector) { + Objects.requireNonNull(aggregationTemporalitySelector, "aggregationTemporalitySelector"); + this.aggregationTemporalitySelector = aggregationTemporalitySelector; + return this; + } + + /** Constructs an {@link InMemoryMetricExporter} based on the builder's values. */ + public InMemoryMetricExporter build() { + return new InMemoryMetricExporter(aggregationTemporalitySelector); + } +} diff --git a/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java b/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java index 6fa1843045a..48881c0fb4d 100644 --- a/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java +++ b/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java @@ -62,6 +62,8 @@ private static MetricData generateFakeMetric() { void getAggregationTemporality(InstrumentType instrumentType) { assertThat(InMemoryMetricExporter.create().getAggregationTemporality(instrumentType)) .isEqualTo(AggregationTemporality.CUMULATIVE); + assertThat(InMemoryMetricExporter.builder().build().getAggregationTemporality(instrumentType)) + .isEqualTo(AggregationTemporality.CUMULATIVE); assertThat( InMemoryMetricExporter.create(AggregationTemporality.DELTA) .getAggregationTemporality(instrumentType)) @@ -76,7 +78,9 @@ void getAggregationTemporality(InstrumentType instrumentType) { @EnumSource(InstrumentType.class) void getAggregationTemporality_deltaPreferred(InstrumentType instrumentType) { assertThat( - InMemoryMetricExporter.create(AggregationTemporalitySelector.deltaPreferred()) + InMemoryMetricExporter.builder() + .setAggregationTemporalitySelector(AggregationTemporalitySelector.deltaPreferred()) + .build() .getAggregationTemporality(instrumentType)) .isEqualTo( instrumentType == InstrumentType.UP_DOWN_COUNTER @@ -86,16 +90,34 @@ void getAggregationTemporality_deltaPreferred(InstrumentType instrumentType) { } @Test - void create_nullSelector() { - assertThatThrownBy(() -> InMemoryMetricExporter.create((AggregationTemporalitySelector) null)) + void setAggregationTemporalitySelector_null() { + assertThatThrownBy( + () -> InMemoryMetricExporter.builder().setAggregationTemporalitySelector(null)) .isInstanceOf(NullPointerException.class) .hasMessage("aggregationTemporalitySelector"); } + @Test + void builder_reusable() { + InMemoryMetricExporterBuilder builder = InMemoryMetricExporter.builder(); + InMemoryMetricExporter cumulativeExporter = builder.build(); + InMemoryMetricExporter deltaExporter = + builder + .setAggregationTemporalitySelector(AggregationTemporalitySelector.deltaPreferred()) + .build(); + + assertThat(cumulativeExporter.getAggregationTemporality(InstrumentType.COUNTER)) + .isEqualTo(AggregationTemporality.CUMULATIVE); + assertThat(deltaExporter.getAggregationTemporality(InstrumentType.COUNTER)) + .isEqualTo(AggregationTemporality.DELTA); + } + @Test void export_deltaPreferred() { InMemoryMetricExporter deltaExporter = - InMemoryMetricExporter.create(AggregationTemporalitySelector.deltaPreferred()); + InMemoryMetricExporter.builder() + .setAggregationTemporalitySelector(AggregationTemporalitySelector.deltaPreferred()) + .build(); TestClock clock = TestClock.create(); PeriodicMetricReader reader = PeriodicMetricReader.builder(deltaExporter).setInterval(Duration.ofDays(1)).build(); @@ -158,7 +180,9 @@ void export_deltaPreferred() { @Test void export_preservesMetricData() { InMemoryMetricExporter deltaExporter = - InMemoryMetricExporter.create(AggregationTemporalitySelector.deltaPreferred()); + InMemoryMetricExporter.builder() + .setAggregationTemporalitySelector(AggregationTemporalitySelector.deltaPreferred()) + .build(); MetricData metric = generateFakeMetric(); assertThat(deltaExporter.export(Collections.singletonList(metric)).isSuccess()).isTrue(); From 0ce276601614e001cf72a9af353fc219939de869 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Tue, 3 Nov 2026 15:53:31 -0800 Subject: [PATCH 3/3] Align in-memory metric exporter docs and tests Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../InMemoryMetricExporterBuilder.java | 2 +- .../exporter/InMemoryMetricExporterTest.java | 30 ++----------------- 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterBuilder.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterBuilder.java index b0e1ed912e7..324168e4e9a 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterBuilder.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterBuilder.java @@ -20,7 +20,7 @@ public final class InMemoryMetricExporterBuilder { * Sets the {@link AggregationTemporalitySelector} used by {@link * InMemoryMetricExporter#getAggregationTemporality(InstrumentType)}. * - *

The default is {@link AggregationTemporalitySelector#alwaysCumulative()}. + *

If unset, defaults to {@link AggregationTemporalitySelector#alwaysCumulative()}. * * @param aggregationTemporalitySelector the {@link AggregationTemporalitySelector} to set * @return this {@link InMemoryMetricExporterBuilder} diff --git a/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java b/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java index 48881c0fb4d..6ae31491b40 100644 --- a/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java +++ b/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/exporter/InMemoryMetricExporterTest.java @@ -9,7 +9,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.metrics.DoubleHistogram; import io.opentelemetry.api.metrics.LongCounter; import io.opentelemetry.api.metrics.LongUpDownCounter; import io.opentelemetry.api.metrics.Meter; @@ -30,7 +29,6 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; @@ -125,18 +123,11 @@ void export_deltaPreferred() { SdkMeterProvider.builder().setClock(clock).registerMetricReader(reader).build()) { Meter meter = meterProvider.get("test"); LongCounter counter = meter.counterBuilder("counter").build(); - DoubleHistogram histogram = meter.histogramBuilder("histogram").build(); LongUpDownCounter upDownCounter = meter.upDownCounterBuilder("upDownCounter").build(); - AtomicLong observedUpDownCounter = new AtomicLong(); - meter - .upDownCounterBuilder("observableUpDownCounter") - .buildWithCallback(measurement -> measurement.record(observedUpDownCounter.get())); - for (int value : new int[] {1, 2, 3}) { + for (int value : new int[] {1, 2}) { counter.add(value); - histogram.record(value); - upDownCounter.add(value == 3 ? -1 : 1); - observedUpDownCounter.set(value == 3 ? 0 : 1); + upDownCounter.add(value == 1 ? 1 : -1); clock.advance(Duration.ofSeconds(1)); assertThat(reader.forceFlush().join(10, TimeUnit.SECONDS).isSuccess()).isTrue(); @@ -149,13 +140,6 @@ void export_deltaPreferred() { .hasLongSumSatisfying( sum -> sum.isDelta().hasPointsSatisfying(point -> point.hasValue(value))), - metric -> - assertThat(metric) - .hasName("histogram") - .hasHistogramSatisfying( - data -> - data.isDelta() - .hasPointsSatisfying(point -> point.hasCount(1).hasSum(value))), metric -> assertThat(metric) .hasName("upDownCounter") @@ -163,15 +147,7 @@ void export_deltaPreferred() { sum -> sum.isCumulative() .hasPointsSatisfying( - point -> point.hasValue(value == 2 ? 2 : 1))), - metric -> - assertThat(metric) - .hasName("observableUpDownCounter") - .hasLongSumSatisfying( - sum -> - sum.isCumulative() - .hasPointsSatisfying( - point -> point.hasValue(value == 3 ? 0 : 1)))); + point -> point.hasValue(value == 1 ? 1 : 0)))); deltaExporter.reset(); } }