diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleCounter.java b/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleCounter.java index 1934b937379..4be299df91a 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleCounter.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleCounter.java @@ -45,4 +45,23 @@ public interface DoubleCounter { * @param context The explicit context to associate with this measurement. */ void add(double value, Attributes attributes, Context context); + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void finish(Attributes attributes) { + finish(attributes, Context.current()); + } + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @param context The explicit context to associate with this measurement. + * @since 1.56.0 + */ + default void finish(Attributes attributes, Context context) {} } diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleGauge.java b/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleGauge.java index a755ff25b16..73bfb709c83 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleGauge.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleGauge.java @@ -39,4 +39,23 @@ public interface DoubleGauge { * @param context The explicit context to associate with this measurement. */ void set(double value, Attributes attributes, Context context); + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void finish(Attributes attributes) { + finish(attributes, Context.current()); + } + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @param context The explicit context to associate with this measurement. + * @since 1.56.0 + */ + default void finish(Attributes attributes, Context context) {} } diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleHistogram.java b/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleHistogram.java index 07b45531294..ec852e92cba 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleHistogram.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleHistogram.java @@ -46,4 +46,23 @@ public interface DoubleHistogram { * @param context The explicit context to associate with this measurement. */ void record(double value, Attributes attributes, Context context); + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void finish(Attributes attributes) { + finish(attributes, Context.current()); + } + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @param context The explicit context to associate with this measurement. + * @since 1.56.0 + */ + default void finish(Attributes attributes, Context context) {} } diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleUpDownCounter.java b/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleUpDownCounter.java index 7c6187b8a83..49fcef437eb 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleUpDownCounter.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/DoubleUpDownCounter.java @@ -45,4 +45,23 @@ public interface DoubleUpDownCounter { * @param context The explicit context to associate with this measurement. */ void add(double value, Attributes attributes, Context context); + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void finish(Attributes attributes) { + finish(attributes, Context.current()); + } + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @param context The explicit context to associate with this measurement. + * @since 1.56.0 + */ + default void finish(Attributes attributes, Context context) {} } diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/LongCounter.java b/api/all/src/main/java/io/opentelemetry/api/metrics/LongCounter.java index fee520f0c11..0a8c21b594e 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/LongCounter.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/LongCounter.java @@ -46,4 +46,23 @@ public interface LongCounter { * @param context The explicit context to associate with this measurement. */ void add(long value, Attributes attributes, Context context); + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void finish(Attributes attributes) { + finish(attributes, Context.current()); + } + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @param context The explicit context to associate with this measurement. + * @since 1.56.0 + */ + default void finish(Attributes attributes, Context context) {} } diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/LongGauge.java b/api/all/src/main/java/io/opentelemetry/api/metrics/LongGauge.java index 018f60e323b..b450e51b23b 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/LongGauge.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/LongGauge.java @@ -39,4 +39,23 @@ public interface LongGauge { * @param context The explicit context to associate with this measurement. */ void set(long value, Attributes attributes, Context context); + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void finish(Attributes attributes) { + finish(attributes, Context.current()); + } + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @param context The explicit context to associate with this measurement. + * @since 1.56.0 + */ + default void finish(Attributes attributes, Context context) {} } diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/LongHistogram.java b/api/all/src/main/java/io/opentelemetry/api/metrics/LongHistogram.java index ba8bed7e376..fd5dd6eb9ab 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/LongHistogram.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/LongHistogram.java @@ -46,4 +46,23 @@ public interface LongHistogram { * @param context The explicit context to associate with this measurement. */ void record(long value, Attributes attributes, Context context); + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void finish(Attributes attributes) { + finish(attributes, Context.current()); + } + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @param context The explicit context to associate with this measurement. + * @since 1.56.0 + */ + default void finish(Attributes attributes, Context context) {} } diff --git a/api/all/src/main/java/io/opentelemetry/api/metrics/LongUpDownCounter.java b/api/all/src/main/java/io/opentelemetry/api/metrics/LongUpDownCounter.java index f9106c12deb..63cb42babd0 100644 --- a/api/all/src/main/java/io/opentelemetry/api/metrics/LongUpDownCounter.java +++ b/api/all/src/main/java/io/opentelemetry/api/metrics/LongUpDownCounter.java @@ -45,4 +45,23 @@ public interface LongUpDownCounter { * @param context The explicit context to associate with this measurement. */ void add(long value, Attributes attributes, Context context); + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void finish(Attributes attributes) { + finish(attributes, Context.current()); + } + + /** + * Finish the instrument record. + * + * @param attributes A set of attributes to identify the instrument. + * @param context The explicit context to associate with this measurement. + * @since 1.56.0 + */ + default void finish(Attributes attributes, Context context) {} } diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt index a190a108853..2622662c1e9 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt @@ -1,2 +1,33 @@ Comparing source compatibility of opentelemetry-api-1.61.0-SNAPSHOT.jar against opentelemetry-api-1.60.1.jar -No changes. \ No newline at end of file +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.metrics.DoubleCounter (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes, io.opentelemetry.context.Context) +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.metrics.DoubleGauge (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes, io.opentelemetry.context.Context) +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.metrics.DoubleHistogram (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes, io.opentelemetry.context.Context) +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.metrics.DoubleUpDownCounter (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes, io.opentelemetry.context.Context) +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.metrics.LongCounter (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes, io.opentelemetry.context.Context) +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.metrics.LongGauge (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes, io.opentelemetry.context.Context) +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.metrics.LongHistogram (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes, io.opentelemetry.context.Context) +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.metrics.LongUpDownCounter (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void finish(io.opentelemetry.api.common.Attributes, io.opentelemetry.context.Context) diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleCounter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleCounter.java index bdcb30bbc61..bb826cead1d 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleCounter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleCounter.java @@ -56,6 +56,11 @@ public void add(double increment) { add(increment, Attributes.empty()); } + @Override + public void finish(Attributes attributes, Context context) { + storage.remove(attributes, context); + } + static class SdkDoubleCounterBuilder implements DoubleCounterBuilder { final InstrumentBuilder builder; diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java index 6bbdaf5355e..b5020f3d60c 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGauge.java @@ -43,6 +43,11 @@ public void set(double value) { set(value, Attributes.empty()); } + @Override + public void finish(Attributes attributes, Context context) { + storage.remove(attributes, context); + } + static class SdkDoubleGaugeBuilder implements DoubleGaugeBuilder { final InstrumentBuilder builder; diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogram.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogram.java index 15f0f5ea44d..fadfcf530e6 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogram.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogram.java @@ -56,6 +56,11 @@ public void record(double value) { record(value, Attributes.empty()); } + @Override + public void finish(Attributes attributes, Context context) { + storage.remove(attributes, context); + } + static class SdkDoubleHistogramBuilder implements DoubleHistogramBuilder { final InstrumentBuilder builder; diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounter.java index 4231f58fdc0..e66e8e77f90 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounter.java @@ -43,6 +43,11 @@ public void add(double increment) { add(increment, Attributes.empty()); } + @Override + public void finish(Attributes attributes, Context context) { + storage.remove(attributes, context); + } + static class SdkDoubleUpDownCounterBuilder implements DoubleUpDownCounterBuilder { final InstrumentBuilder builder; diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongCounter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongCounter.java index b26004835d2..c98ed9eb929 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongCounter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongCounter.java @@ -57,6 +57,11 @@ public void add(long increment) { add(increment, Attributes.empty()); } + @Override + public void finish(Attributes attributes, Context context) { + storage.remove(attributes, context); + } + static class SdkLongCounterBuilder implements LongCounterBuilder { final InstrumentBuilder builder; diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongGauge.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongGauge.java index 4140dfb42bf..f68a8461272 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongGauge.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongGauge.java @@ -42,6 +42,11 @@ public void set(long value) { set(value, Attributes.empty()); } + @Override + public void finish(Attributes attributes, Context context) { + storage.remove(attributes, context); + } + static class SdkLongGaugeBuilder implements LongGaugeBuilder { final InstrumentBuilder builder; diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongHistogram.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongHistogram.java index 4f935d0d091..24c0031a575 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongHistogram.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongHistogram.java @@ -57,6 +57,11 @@ public void record(long value) { record(value, Attributes.empty()); } + @Override + public void finish(Attributes attributes, Context context) { + storage.remove(attributes, context); + } + static class SdkLongHistogramBuilder implements LongHistogramBuilder { final InstrumentBuilder builder; diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounter.java index dece771f4b6..67f0b6fb6a6 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounter.java @@ -43,6 +43,11 @@ public void add(long increment) { add(increment, Attributes.empty()); } + @Override + public void finish(Attributes attributes, Context context) { + storage.remove(attributes, context); + } + static class SdkLongUpDownCounterBuilder implements LongUpDownCounterBuilder { final InstrumentBuilder builder; diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java index 01dead0ce85..bb2ffe426e8 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkMeter.java @@ -369,6 +369,13 @@ public void recordDouble(double value, Attributes attributes, Context context) { } } + @Override + public void remove(Attributes attributes, Context context) { + for (WriteableMetricStorage storage : storages) { + storage.remove(attributes, context); + } + } + @Override public boolean isEnabled() { for (WriteableMetricStorage storage : storages) { diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/state/DefaultSynchronousMetricStorage.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/state/DefaultSynchronousMetricStorage.java index a746c00dec0..4d17bda60ec 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/state/DefaultSynchronousMetricStorage.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/state/DefaultSynchronousMetricStorage.java @@ -224,6 +224,19 @@ void doRecordDouble(double value, Attributes attributes, Context context) { } } + @Override + public void remove(Attributes attributes, Context context) { + if (!enabled) { + return; + } + AggregatorHolder holderForRecord = getHolderForRecord(); + try { + holderForRecord.aggregatorHandles.remove(attributes); + } finally { + releaseHolderForRecord(holderForRecord); + } + } + @Nullable @Override AggregatorHandle maybeGetPooledAggregatorHandle() { @@ -421,6 +434,14 @@ void doRecordDouble(double value, Attributes attributes, Context context) { .recordDouble(value, attributes, context); } + @Override + public void remove(Attributes attributes, Context context) { + if (!enabled) { + return; + } + aggregatorHandles.remove(attributes); + } + @Nullable @Override AggregatorHandle maybeGetPooledAggregatorHandle() { diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/state/WriteableMetricStorage.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/state/WriteableMetricStorage.java index 7191a63f1e0..d2225cf700e 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/state/WriteableMetricStorage.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/state/WriteableMetricStorage.java @@ -23,6 +23,9 @@ public interface WriteableMetricStorage { /** Records a measurement. */ void recordDouble(double value, Attributes attributes, Context context); + /** Remove a measurement. */ + default void remove(Attributes attributes, Context context) {} + /** * Returns {@code true} if the storage is actively recording measurements, and {@code false} * otherwise (i.e. noop / empty metric storage is installed). diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleCounterTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleCounterTest.java index 34882efc751..e580c8b901e 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleCounterTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleCounterTest.java @@ -57,6 +57,15 @@ void collectMetrics_NoRecords() { assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_finish() { + DoubleCounter counter = sdkMeter.counterBuilder("testCounter").ofDoubles().build(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + counter.add(1, attrs); + counter.finish(attrs); + assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); + } + @Test void collectMetrics_WithEmptyAttributes() { DoubleCounter doubleCounter = diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleGaugeTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleGaugeTest.java index 740775e766f..673b1ed605e 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleGaugeTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleGaugeTest.java @@ -27,6 +27,7 @@ import io.opentelemetry.sdk.trace.SdkTracerProvider; import java.time.Duration; import java.util.Collections; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; /** Unit tests for {@link SdkDoubleGauge}. */ @@ -64,7 +65,7 @@ void set_NaN() { } @Test - void observable_RemoveCallback() { + void observable_finishCallback() { ObservableDoubleGauge gauge = sdkMeter.gaugeBuilder("testGauge").buildWithCallback(measurement -> measurement.record(10)); @@ -96,6 +97,16 @@ void collectMetrics_NoRecords() { assertThat(cumulativeReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_finish() { + DoubleGauge gauge = sdkMeter.gaugeBuilder("testGauge").build(); + assertThat(cumulativeReader.collectAllMetrics()).isEmpty(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + gauge.set(1, attrs); + gauge.finish(attrs); + Assertions.assertThat(cumulativeReader.collectAllMetrics()).isEmpty(); + } + @Test void collectMetrics_WithEmptyAttributes() { DoubleGauge doubleGauge = diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogramTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogramTest.java index c06948acf88..645869a6b35 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogramTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleHistogramTest.java @@ -27,6 +27,7 @@ import java.time.Duration; import java.util.Arrays; import java.util.Collections; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -63,6 +64,15 @@ void collectMetrics_NoRecords() { assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_finish() { + DoubleHistogram histogram = sdkMeter.histogramBuilder("testHistogram").build(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + histogram.record(1, attrs); + histogram.finish(attrs); + Assertions.assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); + } + @Test void collectMetrics_WithEmptyAttributes() { DoubleHistogram doubleHistogram = diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounterTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounterTest.java index a15dcf422cc..49daa3def39 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounterTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkDoubleUpDownCounterTest.java @@ -18,6 +18,7 @@ import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; import io.opentelemetry.sdk.testing.time.TestClock; import java.time.Duration; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; /** Unit tests for {@link SdkDoubleUpDownCounter}. */ @@ -56,6 +57,16 @@ void collectMetrics_NoRecords() { assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_finish() { + DoubleUpDownCounter counter = + sdkMeter.upDownCounterBuilder("testUpDownCounter").ofDoubles().build(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + counter.add(1, attrs); + counter.finish(attrs); + Assertions.assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); + } + @Test void collectMetrics_WithEmptyAttributes() { DoubleUpDownCounter doubleUpDownCounter = diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongCounterTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongCounterTest.java index 160a07b9e48..a437bc5a406 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongCounterTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongCounterTest.java @@ -55,6 +55,15 @@ void collectMetrics_NoRecords() { assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_finish() { + LongCounter counter = sdkMeter.counterBuilder("Counter").build(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + counter.add(1, attrs); + counter.finish(attrs); + assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); + } + @Test void collectMetrics_WithEmptyAttributes() { LongCounter longCounter = diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongGaugeTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongGaugeTest.java index 3879f2e8a76..9f5dbef9833 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongGaugeTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongGaugeTest.java @@ -54,7 +54,7 @@ void set_PreventNullAttributes() { } @Test - void observable_RemoveCallback() { + void observable_finishCallback() { ObservableLongGauge gauge = sdkMeter .gaugeBuilder("testGauge") @@ -80,6 +80,16 @@ void collectMetrics_NoRecords() { assertThat(cumulativeReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_finish() { + LongGauge gauge = sdkMeter.gaugeBuilder("testGauge").ofLongs().build(); + assertThat(cumulativeReader.collectAllMetrics()).isEmpty(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + gauge.set(1, attrs); + gauge.finish(attrs); + Assertions.assertThat(cumulativeReader.collectAllMetrics()).isEmpty(); + } + @Test void collectMetrics_WithEmptyAttributes() { LongGauge longGauge = diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongHistogramTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongHistogramTest.java index 1f0321f55bf..9d206d14aab 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongHistogramTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongHistogramTest.java @@ -26,6 +26,7 @@ import java.time.Duration; import java.util.Arrays; import java.util.Collections; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -62,6 +63,15 @@ void collectMetrics_NoRecords() { assertThat(reader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_finish() { + LongHistogram histogram = sdkMeter.histogramBuilder("testHistogram").ofLongs().build(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + histogram.record(1, attrs); + histogram.finish(attrs); + Assertions.assertThat(reader.collectAllMetrics()).isEmpty(); + } + @Test void collectMetrics_WithEmptyAttributes() { LongHistogram longHistogram = diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounterTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounterTest.java index 39eb6500207..e9dc9b05b3d 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounterTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkLongUpDownCounterTest.java @@ -18,6 +18,7 @@ import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; import io.opentelemetry.sdk.testing.time.TestClock; import java.time.Duration; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; /** Unit tests for {@link SdkLongUpDownCounter}. */ @@ -50,6 +51,15 @@ void collectMetrics_NoRecords() { assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_finish() { + LongUpDownCounter counter = sdkMeter.upDownCounterBuilder("testUpDownCounter").build(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + counter.add(1, attrs); + counter.finish(attrs); + Assertions.assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); + } + @Test void collectMetrics_WithEmptyAttributes() { LongUpDownCounter longUpDownCounter = diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableDoubleCounterTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableDoubleCounterTest.java index cc1c887bf3a..8e7507d6b22 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableDoubleCounterTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableDoubleCounterTest.java @@ -33,7 +33,7 @@ class SdkObservableDoubleCounterTest { SdkMeterProvider.builder().setClock(testClock).setResource(RESOURCE); @Test - void removeCallback() { + void finishCallback() { InMemoryMetricReader sdkMeterReader = InMemoryMetricReader.create(); ObservableDoubleCounter counter = sdkMeterProviderBuilder diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableDoubleUpDownCounterTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableDoubleUpDownCounterTest.java index 8b212220093..22c3c4734d2 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableDoubleUpDownCounterTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableDoubleUpDownCounterTest.java @@ -35,7 +35,7 @@ class SdkObservableDoubleUpDownCounterTest { SdkMeterProvider.builder().setClock(testClock).setResource(RESOURCE); @Test - void removeCallback() { + void finishCallback() { InMemoryMetricReader sdkMeterReader = InMemoryMetricReader.create(); ObservableDoubleUpDownCounter counter = sdkMeterProviderBuilder diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableLongCounterTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableLongCounterTest.java index f4208b1c26d..cd71bb4c34c 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableLongCounterTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableLongCounterTest.java @@ -30,7 +30,7 @@ class SdkObservableLongCounterTest { SdkMeterProvider.builder().setClock(testClock).setResource(RESOURCE); @Test - void removeCallback() { + void finishCallback() { InMemoryMetricReader sdkMeterReader = InMemoryMetricReader.create(); ObservableLongCounter counter = sdkMeterProviderBuilder diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableLongUpDownCounterTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableLongUpDownCounterTest.java index 33c3c17167d..b972f059e5e 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableLongUpDownCounterTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/SdkObservableLongUpDownCounterTest.java @@ -30,7 +30,7 @@ class SdkObservableLongUpDownCounterTest { SdkMeterProvider.builder().setClock(testClock).setResource(RESOURCE); @Test - void removeCallback() { + void finishCallback() { InMemoryMetricReader sdkMeterReader = InMemoryMetricReader.create(); ObservableLongUpDownCounter counter = sdkMeterProviderBuilder diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/internal/state/SynchronousMetricStorageTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/internal/state/SynchronousMetricStorageTest.java index 354c1d899e5..5dcb6b34dea 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/internal/state/SynchronousMetricStorageTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/internal/state/SynchronousMetricStorageTest.java @@ -849,6 +849,20 @@ void enabledThenDisable_recordAndCollect(MemoryMode memoryMode) { storage.recordDouble(10d, Attributes.empty(), Context.current()); assertThat(storage.collect(RESOURCE, INSTRUMENTATION_SCOPE_INFO, 0, 10).isEmpty()).isTrue(); + + storage.remove(Attributes.empty(), Context.current()); + + storage.setEnabled(true); + + storage.recordDouble(10d, Attributes.empty(), Context.current()); + + storage.setEnabled(false); + + storage.remove(Attributes.empty(), Context.current()); + + storage.setEnabled(true); + + assertThat(storage.collect(RESOURCE, INSTRUMENTATION_SCOPE_INFO, 0, 10).isEmpty()).isFalse(); } @ParameterizedTest