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..d3ff774f287 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); + + /** + * Remove the instrument. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void remove(Attributes attributes) { + remove(attributes, Context.current()); + } + + /** + * Remove the instrument. + * + * @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 remove(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..23f894d44fb 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); + + /** + * Remove the instrument. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void remove(Attributes attributes) { + remove(attributes, Context.current()); + } + + /** + * Remove the instrument. + * + * @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 remove(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..53c01ece944 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); + + /** + * Remove the instrument. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void remove(Attributes attributes) { + remove(attributes, Context.current()); + } + + /** + * Remove the instrument. + * + * @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 remove(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..34c2d10aef2 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); + + /** + * Remove the instrument. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void remove(Attributes attributes) { + remove(attributes, Context.current()); + } + + /** + * Remove the instrument. + * + * @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 remove(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..6b4ad84da1a 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); + + /** + * Remove the instrument. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void remove(Attributes attributes) { + remove(attributes, Context.current()); + } + + /** + * Remove the instrument. + * + * @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 remove(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..bc170566762 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); + + /** + * Remove the instrument. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void remove(Attributes attributes) { + remove(attributes, Context.current()); + } + + /** + * Remove the instrument. + * + * @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 remove(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..71fe46ea161 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); + + /** + * Remove the instrument. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void remove(Attributes attributes) { + remove(attributes, Context.current()); + } + + /** + * Remove the instrument. + * + * @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 remove(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..425c0fb0cbb 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); + + /** + * Remove the instrument. + * + * @param attributes A set of attributes to identify the instrument. + * @since 1.56.0 + */ + default void remove(Attributes attributes) { + remove(attributes, Context.current()); + } + + /** + * Remove the instrument. + * + * @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 remove(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 ba34d454891..88e93eed18a 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.56.0-SNAPSHOT.jar against opentelemetry-api-1.55.0.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 remove(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void remove(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 remove(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void remove(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 remove(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void remove(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 remove(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void remove(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 remove(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void remove(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 remove(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void remove(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 remove(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void remove(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 remove(io.opentelemetry.api.common.Attributes) + +++ NEW METHOD: PUBLIC(+) void remove(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 7fd6e435556..ae8f4407b7c 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 remove(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..0ea8cc4036a 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 remove(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 de4473ace2e..e9b887fc2de 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 remove(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..2467c27350f 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 remove(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 0de901060f5..93e6a0b945f 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 remove(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..bb1ae19b01e 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 remove(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 b777ad34e59..d0af58ac965 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 remove(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..afe3739db00 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 remove(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 ba00c3dc5c6..ffc69ce7089 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 @@ -140,6 +140,19 @@ public void recordDouble(double value, Attributes attributes, Context context) { } } + @Override + public void remove(Attributes attributes, Context context) { + if (!enabled) { + return; + } + AggregatorHolder aggregatorHolder = getHolderForRecord(); + try { + aggregatorHolder.aggregatorHandles.remove(attributes); + } finally { + releaseHolderForRecord(aggregatorHolder); + } + } + @Override public void setEnabled(boolean enabled) { this.enabled = enabled; 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 d733821972b..eebd87756a8 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 @@ -58,6 +58,15 @@ void collectMetrics_NoRecords() { assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_Remove() { + DoubleCounter counter = sdkMeter.counterBuilder("testCounter").ofDoubles().build(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + counter.add(1, attrs); + counter.remove(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 61c0d3ad0b9..5132a5acf87 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 @@ -28,6 +28,7 @@ import java.time.Duration; import java.util.Collections; import java.util.stream.IntStream; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; /** Unit tests for {@link SdkDoubleGauge}. */ @@ -97,6 +98,16 @@ void collectMetrics_NoRecords() { assertThat(cumulativeReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_Remove() { + DoubleGauge gauge = sdkMeter.gaugeBuilder("testGauge").build(); + assertThat(cumulativeReader.collectAllMetrics()).isEmpty(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + gauge.set(1, attrs); + gauge.remove(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 dd210faad46..26577b1152f 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 @@ -28,6 +28,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.stream.IntStream; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -64,6 +65,15 @@ void collectMetrics_NoRecords() { assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_Remove() { + DoubleHistogram histogram = sdkMeter.histogramBuilder("testHistogram").build(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + histogram.record(1, attrs); + histogram.remove(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 a8dc0041c0d..0597060f75f 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 @@ -19,6 +19,7 @@ import io.opentelemetry.sdk.testing.time.TestClock; import java.time.Duration; import java.util.stream.IntStream; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; /** Unit tests for {@link SdkDoubleUpDownCounter}. */ @@ -57,6 +58,16 @@ void collectMetrics_NoRecords() { assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_Remove() { + DoubleUpDownCounter counter = + sdkMeter.upDownCounterBuilder("testUpDownCounter").ofDoubles().build(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + counter.add(1, attrs); + counter.remove(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 30f9c27ff22..ea271128987 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 @@ -56,6 +56,15 @@ void collectMetrics_NoRecords() { assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_Remove() { + LongCounter counter = sdkMeter.counterBuilder("Counter").build(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + counter.add(1, attrs); + counter.remove(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 0a117e48d82..9ee7a341e6f 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 @@ -81,6 +81,16 @@ void collectMetrics_NoRecords() { assertThat(cumulativeReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_Remove() { + LongGauge gauge = sdkMeter.gaugeBuilder("testGauge").ofLongs().build(); + assertThat(cumulativeReader.collectAllMetrics()).isEmpty(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + gauge.set(1, attrs); + gauge.remove(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 dd802ff613f..ae3290f649a 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 @@ -27,6 +27,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.stream.IntStream; +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(reader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_Remove() { + LongHistogram histogram = sdkMeter.histogramBuilder("testHistogram").ofLongs().build(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + histogram.record(1, attrs); + histogram.remove(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 50feee13094..738b00bdf93 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 @@ -19,6 +19,7 @@ import io.opentelemetry.sdk.testing.time.TestClock; import java.time.Duration; import java.util.stream.IntStream; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; /** Unit tests for {@link SdkLongUpDownCounter}. */ @@ -51,6 +52,15 @@ void collectMetrics_NoRecords() { assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); } + @Test + void collectMetrics_Remove() { + LongUpDownCounter counter = sdkMeter.upDownCounterBuilder("testUpDownCounter").build(); + Attributes attrs = Attributes.of(stringKey("key"), "value"); + counter.add(1, attrs); + counter.remove(attrs); + Assertions.assertThat(sdkMeterReader.collectAllMetrics()).isEmpty(); + } + @Test void collectMetrics_WithEmptyAttributes() { LongUpDownCounter longUpDownCounter = 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 e79f3ad9718..2e6dab2cfc5 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 @@ -923,6 +923,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